QIodevice

QIODevice为设备提供了一个共同的实现和抽象接口,它支持读取和写入像QFile、QBuffer和QTcpSocket等以块为单位的数据。QIODevice是抽象类,不能被实例化(instantiated),但是利用它定义的接口来提供独立于设备的I / O功能是普遍的。例如,Qt的XML类来操作一个QIODevice的指针,允许他们用于各种设备(如文件和缓冲区)。
  在访问设备前,open()必须被调用以设置正确的OpenMode(如ReadOnly或ReadWrite)。然后,您可以用write()或者putChar()写进设备,或者调用read(),readLine()的,或readAll()来读。调用close()当你使用完设备后。

QIODevice中区分了两种类型的设备:随机存取设备和顺序设备(sequentialdevices)。

随机存取设备可以用seek()支持任意位置的寻找。调用pos()可以调用该文件中的当前位置。QFile和QBuffer是随机存取设备的例子。

sequential devices不支持任意位置的查找。数据必须在一道。函数pos()和size()不能用于序列设备。

QTcpSocket和QProcess 是sequential devices的例子。

 

您可以使用isSequential()来判断设备的类型。

当新的数据可读取的时候,例如,如果新的数据到达网络或额外的数据添加到您正在读取的的​​文件,QIODevice发出readyRead()。您可以调用bytesAvailable()来确定当前可供读取的字节数。

当数据片段可以在任意时间到达例如QTcpSocket的异步设备编程的时候,

bytesAvailable()和readyRead()信号一起使用和很常见的

每一次有效载荷的数据已写入设备的时候,QIODevice发出的bytesWritte()信号。调用bytesToWrite()来确定目前等待要写入的数据量。

 

QIODevice的若干子类,如QTcpSocket和QProcess,是异步的。这意味着,I/O函数如write()或read()总是立即返回的,只要当控制回到事件循环,设备与自身的通信可能发生。QIODevice提供了函数,允许您强制立即执行这些操作,同时阻塞调用线程,阻止进入事件循环。这使得使用QIODevice子类没有事件循环,或在一个单独的线程中:

l  waitForReadyRead() - 这个函数挂起调用线程的操作,直到新的数据可供读取。

l  waitForBytesWritten() - 这个函数挂起调用线程的操作,直到一个有效载荷的数据已被写入设备。

l  WaitFor....()  - QIODevice的子类为设备具体的操作实施阻塞函数。例如,QProcess有一个叫做waitForStarted()的函数挂起调用线程的操作,直到该进程已经开始。


  在主函数调用这些函数从,GUI thread,可能造成您的用户界面被冻结。

For example:

QProcess gzip;

 gzip.start("gzip", QStringList()<< "-c");

 if (!gzip.waitForStarted())

     return false;

 

 gzip.write("uncompressed data");

 

 QByteArray compressed;

 while (gzip.waitForReadyRead())

     compressed += gzip.readAll(

通过子类化QIODevice,可以给你自己的I / O设备提供相同的接口。 QIODevice的子类只需要重载保护函数readData()和writeData()函数。 QIODevice使用这些函数来实现其所有的便捷函数,如getchar函数(),readLine()和write()。 QIODevice还为您处理了访问控制,所以如果writeData()被调用,你可以放心地假设该设备是在写模式打开。

一些子类,如QFile和QTcpSocket是使用内存缓冲区来中间数据存储的。这减少了所需的访问设备调用的数量,是非常缓慢的。缓存使得譬如getchar函数()和putchar()是比较快速的,因为它们可以运行在内存缓冲区,而不是直接运行在设备本身。然而,某些I / O操作,在缓存中并不尽人意。出于这个原因,QIODevice允许你通过传递Unbufferedflag给open()来绕过缓存。当子类化QIODevice时,当设备是再在非缓冲模式下打开的时候,记得绕过你可能使用的任何缓存。

你可能感兴趣的:(thread,编程,xml,网络,存储,qt)