The QIODevice class is the base interface class of all I/O devices in Qt.
QIODevice为了支持读写块数据,提供了一个共同的实现和一个通用的接口,这些块数据如: QFile, QBuffer 和 QTcpSocket.
QIODevice是abstract不能instantiated, 但通常会用到它定义的接口,这些接口提供设备无关的I/O特性。例如Qt的XML类通过操作一个QIODevice 的指针,可以使用各种各样的设备(files,buffers等)。
在访问设备之前,必须先调用open(),并设置正确的OpenMode(such as ReadOnly or ReadWrite)。你可以用write(),putChar()来写入设备。也可以用read(),readLine()来读设备。使用完毕后调用close().
QIODevice distinguishes between two types of devices: random-access devices and sequential devices.
random-access devices(随机访问设备):support seeking to arbitrary positions using seek(). The current position in the file is available by calling pos(). QFile and QBuffer are examples of random-access devices.
sequential devices(顺序访问设备): don't support seeking to arbitrary positions. The data must be read in one pass. The functions pos() and size() don't work for sequential devices. QTcpSocket and QProcess are examples of sequential devices.
可以使用 isSequential()判断设备的类型
QTcpSocket and QProcess是QIODevice的子类,是异步的,这意味着 I/O 函数 write() or read()的结果总是立即返回,然而,当控件返回到事件循环时,可能会发生与设备本身的通信。QIODevice提供函数在阻塞调用线程和不输入事件循环的同时,允许程序立即执行,这使得QIODevice的子类可以被使用,在没有循环事件或者是单线程的条件下:
waitForReadyRead()将阻塞线程直到数据到来。
waitForBytesWriten()将阻塞线程直到数据写入。
waitFor...()子类会实现相应的函数为了特殊的操作。比如QProcess 有个叫waitForStarted()的函数。它将会延迟调用的线程,直到那个process已经启动。
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的子类仅需要实现protected的readData()和writeData(),QIODevice 用这些函数实现了其他方便使用的函数。例如getChar(),readLine()和write()。QIODevice 可以为你提供访问控制,如果你已经调用writeData()函数,就可以认为设备已打开。
一些子类,如QFile 和QTcpSocket,会使用内存缓冲区实现存储临时的数据,这将减少设备访问的次数,设备访问的效率很低。Buffering makes functions like getChar() and putChar() fast, as they can operate on the memory buffer instead of directly on the device itself.(当你在内存缓冲区中操作数据而不是和访问设备本身。)
成员函数:
QIODevice() QIODevice(QObject * parent) virtual ~QIODevice() virtual bool atEnd() const virtual qint64 bytesAvailable() const virtual qint64 bytesToWrite() const virtual bool canReadLine() const virtual void close() QString errorString() const bool getChar(char * c) bool isOpen() const bool isReadable() const virtual bool isSequential() const bool isTextModeEnabled() const bool isWritable() const virtual bool open(OpenMode mode) OpenMode openMode() const qint64 peek(char * data, qint64 maxSize) QByteArray peek(qint64 maxSize) virtual qint64 pos() const bool putChar(char c) qint64 read(char * data, qint64 maxSize) QByteArray read(qint64 maxSize) QByteArray readAll() qint64 readLine(char * data, qint64 maxSize) QByteArray readLine(qint64 maxSize = 0) virtual bool reset() virtual bool seek(qint64 pos) void setTextModeEnabled(bool enabled) virtual qint64 size() const void ungetChar(char c) virtual bool waitForBytesWritten(int msecs) virtual bool waitForReadyRead(int msecs) qint64 write(const char * data, qint64 maxSize) qint64 write(const char * data) qint64 write(const QByteArray & byteArray)
Signals:
void aboutToClose() void bytesWritten(qint64 bytes) void readChannelFinished() void readyRead()
Protected Functionsvirtual qint64 readData(char * data, qint64 maxSize) = 0 virtual qint64 readLineData(char * data, qint64 maxSize) void setErrorString(const QString & str) void setOpenMode(OpenMode openMode) virtual qint64 writeData(const char * data, qint64 maxSize) = 0