1、QIODevice
QIODevice是QFile、QBuffer、QTcpSocket等I/O设备的基类,可以使用open()打开设备(打开模式如下)、read()/write()进行文件读写、close()关闭设备。
QTcpSocket、QUdpSocket、QProcess等属于顺序存储设备,它们不支持seek()来改变文件指针,QFile、QBuffer属于随机存取设备,可以使用seek()方法。
QFile和QBuffer使用内部缓冲区进行数据的中间存储以减少设备的访问次数来提高效率,可以在open()设备的时候指定QIODevice::Unbuffered来取消缓冲区模式。
可以通过子类化QIODevice来为自己的I/O可以通过子类化QIODevice来为自己的I/O设备提供相同的接口,只需要实现readData()和writeData()两个方法。
2、QFile和QDir
QFile是文件类,其打开的文件名的分隔符需要使用'/',有exists()、remove()等成员方法。QFileInfo是文件信息类,可以获得文件名称(包括基本名称、后缀)、路径、文件类型(文件、目录、符号链接)、访问权限、最近修改时间等信息。
QTemporaryFile是临时文件类,当QTemporaryFile对象销毁的时候文件被自动删除,临时文件所在的路径可以通过QDir::tempPath()来获取。
QDir是目录类,使用'/'作为目录分隔符,可以直接传入带文件名的路径给它,使用它可以获得目录的名称、当前路径、设置新的路径、创建/删除目录、重命名目录等。cd()和cdUp()会跳转到指定目录、上一级目录。count()方法可以返回目录下条目数,entryList()返回条目名称列表,entryInfoList()返回QFileInfo类型的条目列表。还可以设置一个过滤器来过滤目录中文件的列出,如下面的名称过滤器setNameFilters(),多个过滤器可以使用或|来进行组合后使用setFilters()来设置。文件列出的顺序可以通过setSorting()来设置通过名称、大小、时间等排序。静态方法current()、currentPath()可以获得当前工作目录,静态方法drives()获得系统根目录,可以通过QCoreApplication::applicationDirPath()来获得当前应用程序所在目录。
QFileSystemWatcher提供了对文件或目录的监控,调用addPath()来监视一个文件或目录,当文件、目录被修改、重命名、删除后会发射fileChanged()、directoryChanged()信号。
3、QTextStream
QIODevice配合QTextStream可以很方便的对文本进行读写,QTextStream还可以在QString和QByteArray上使用:
QFile file("output.txt"); if(file.open(QFile::ReadWrite |QFile::Truncate)) { QTextStream outStream(&file); //写入字符串"Result: 3.14 2.7 "; outStream << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7; QTextStream inStream(&file); while(!inStream.atEnd()) { //读取一行字符 QString line =inStream.readLine(); } } QString str("hello world!"); QTextStream in(&str); //读取一个单词到s QString s; in >>s; //读取一个字符到ch QChar ch; in >> ch;
QTextStream内部使用一个基于unicode的缓冲区,默认的使用QTextCodec::codecForLocale()返回的编码来进行读写,可以使用setCodec()来设置编码。
当从文本流中读取数字时QTextStream会自动判断数字使用的基数(进制),如果以0x开头则会被认为是16进制,可以使用dec等流操作符或setIntegerBase()来设置整数基数从而停止自动检测。
4、QDataStream
QIODevice配合QDataStream可以实现串行化操作,其支持的类型有int、char*等基本类型和QString、QDateTime、QBrush等Qt类型(Qt帮助的Serializing Qt Data Types关键字对应的文档列出了支持的所有Qt类型)。读取和写入Qt类型数据应该使用相同的数据流版本,可以使用setVersion()来明确使用的数据流的版本号。
//写入数据 QFile file("file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); out << QString("test"); out << (qint32)42; //读取数据 QFile file(file.dat); file.open(QIODevice::ReadOnly); QDataStream in(&file); QString str; qint32 i; in >> str >> i;
如果要串行化自定义的格式,需要在数据流前面写入一个数据头,包含magic number和版本号:
//写入数据 QFile file("file.xxx"); file.open(QIODevice::WriteOnly); QDataStream out(&file); out << (quint32)0xA0B0C0D0; //写入幻数 out << (qint32)123; //写入版本号 out.setVersion(QDataStream::Qt_4_0); //数据流版本号 cout <<myData; //读取数据 QFile file("file.xxx"); file.open(QIODevice::ReadOnly); QDataStream in(&file); quint32 magic; in >>magic; qint32 version; in >>version; in >> myData;
在《QT Creator快速入门》第十八章 网络编程中的TCP客户端、服务器的示例程序中也可以看到QDataStream的应用。
在《QT Creator快速入门》第十九章 (1) 进程 中的共享内存的示例中也可以看到QDataStream的应用。
5、QBuffer和QByteArray
QByteArray通过QBuffer可以使用QIODevice接口,如下所示:
//QBuffer来向QByteArray写入数据 QByteArray byteAry; QBuffer buf(&byteAry); buf.open(QIODevice::WriteOnly); QDataStream out(&buf); out <<QApplication::palette(); //从QByteArray读取数据 QBuffer buf(&byteAry); buf.open(QIODevice::ReadOnly); QDataStream in(&buf); QPalette palette; in >> palette;
当有新的数据可从设备读取的时候,QIODevice会发射readyRead()信号,通过管理这个信号可以使用QBuffer来存储临时的数据,而后再对它们进行处理。可以在Qt帮助中查看Shared Memory Example示例程序。
6、其它类
QSetting类提供了持久的应用程序设置功能,类似在windows系统注册表中存储应用程序的设置信息,它基于QVariant,可以保存大多数基于值的类型,如QString、QRect、QImage等。
QUrl是URL类,可以传入一个url样式的QString给它,提供了操作URL的接口,如设置协议、设置用户名等。URL可以表示为编码和未编码两种格式,编码格式用于发送到服务器,未编码格式用于向用户展示。
QUrlInfo存储了URL的相关信息,包括文件名、权限、组、修改日期等。关于QUrl和QUrlInfo的使用可以参考FTP Example示例。
QResource类提供了接口来直接读取资源文件,QResource也可以使用一个绝对路径进行加载,绝对路径可以使用文件系统表示法,以一个‘/’开始,或者使用资源表示法,以':'开始,数据也可以使用qCompress()来进行压缩,使用qUncompress()解压缩。一个资源可以等运行需要它时再使用registerResource()来加载,传递给它的资源文件必须是rcc生成的二进制资源,二进制资源的更多内容可以在Qt帮助中参考The Qt Resource System关键字。