QIODevice (Qt中所有 I/O devices 的基类,QFile,QBuffer,QTcpSocket等)

来源:互联网 发布:mysql去重distinct 编辑:程序博客网 时间:2024/05/17 03:53

QIODevice为支持读写数据块的device提供通用的接和通用的接口,如QFile,QBuffer,QTcpSocket。

QIODevice 是一个抽象类,所以不能被实例化。但通常会用到它定义的接口,这些接口提供设备依赖的I/O特性。例如Qt的XML类通过操作一个QIODevice 的 指针,可以使用各种各样的设备(files,buffers等)。

在访问设备之前,先调用open(),并设置正确的OpenMode(例如ReadOnly或者ReadWrite)。你可以用write(),putChar()来写入设备。也可以用read(),readLine()来读设备。使用完毕后调用close().

QIODevice 区分两种类型的设备Random-access(随机读取)和Sequential(顺序读取)。

isSequential()用来判断具体的类型是啥。

当数据可读时,QIODevice发射readyRead()信号,例如新数据抵达网络,或者附加的数据追加到你正在读取的文件中。你可以调用bytesAvailable()来确定当前可读的字节数。在QTcpSocket中(零散的数据可能随时到达),经常把readyRead()信号和bytesAvailable()一块用。

当数据已经写入设备时,QIODevice会放射bytesWriten()信号.btyesToWriten()确定当前将要被写人的数据的字节数。

某些子类如QTcpSocket 和 QProcess 是异步的。意味着read() 和 write()总是立刻返回。QIODevice提供函数允许你从这些操作中立即返回,当阻塞在调用线程并且没有进入事件循环时。QIODevice 允许子类在没有事件循环的情况,或者在一个独立的线程中使用。

waitForReadyRead()将阻塞线程直到数据到来。

waitForBytesWriten()将阻塞线程直到数据写入。

waitFor…()子类会实现相应的函数为了特殊的操作。比如QProcess有个叫waitForStarted()的函数。它将会延迟调用的线程,直到那个process已经启动。

通过子类化QIODevice,可以提供相同的接口为自己I/O设备。QIODevice的子类仅需要实现protected的readData()和writeData(),QIODevice用这些函数实现了很多方便使用的函数。例如getChar(),readLine(),write()。QIODevice可以为你提供访问控制。可以安全的假设当writeData()函数被调用时,设备已打开。

一些子类,如QFile,QTcpSocket,会使用内存缓冲区实现存储临时的数据。这将减少设备访问的次数,从而提高读写效率。它将是getChar(),putChar()这样的函数更有效率,当你在内存缓冲区中操作数据而不是和访问设备本身。

转载自:http://www.cnblogs.com/lc-cnblong/archive/2013/02/03/2890532.html

0 0
原创粉丝点击