QT文件系统:

    • QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
    • QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。
    • QFlie:访问本地文件或者嵌入资源;
    • QTemporaryFile:创建和访问本地文件系统的临时文件;
    • QBuffer:读写QbyteArray, 内存文件;
    • QProcess:运行外部程序,处理进程间通讯;
    • QAbstractSocket:所有套接字类的父类;
    • QTcpSocket:TCP协议网络数据传输;
    • QUdpSocket:传输 UDP 报文;
    • QSslSocket:使用 SSL/TLS 传输数据;

    文件系统分类:

    • 顺序访问设备
      是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,这其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备.

    • 随机访问设备
      可以访问任意位置任意次数,还可以使用QIODevice


      基本文件操作:


    • QFile提供了从文件中读取和写入数据的能力。

    • 我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改。
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        QFile file("in.txt");
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "Open file failed.";
            return -1;
        } else {
            while (!file.atEnd()) {
                qDebug() << file.readLine();
            }
        }
     
        QFileInfo info(file);
        qDebug() << info.isDir();//检查该文件是否是目录
        qDebug() << info.isExecutable();//检查该文件是否是可执行文件等
        qDebug() << info.baseName();//可以直接获得文件名
        qDebug() << info.completeBaseName();//获取完整的文件名
        qDebug() << info.suffix();//则直接获取文件后缀名
        qDebug() << info.completeSuffix();//获取完整的文件后缀
     
        return app.exec();
    }


    二进制文件读写:

    QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。


    QFile file("file.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);
    out << QString("the answer is");
    out << (qint32)42;
    file.close(); // 如果不想关闭文件,可以使用 file.flush();

    接下来我们将存储到文件中的答案取出来

    QFile file("file.dat");
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    QString str;
    qint32 a;
    in >> str >> a;

    唯一需要注意的是,你必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃。
    那么,既然QIODevice提供了read()、readLine()之类的函数,为什么还要有QDataStream呢?QDataStream同QIODevice有什么区别?区别在于,QDataStream提供流的形式,性能上一般比直接调用原始 API 更好一些。我们通过下面一段代码看看什么是流的形式:

    QFile file("file.dat");
    file.open(QIODevice::ReadWrite);
     
    QDataStream stream(&file);
    QString str = "the answer is 42";
    
    stream << str;

    文本文件读写:

    二进制文件比较小巧,却不是人可读的格式。而文本文件是一种人可读的文件。为了操作这种文件,我们需要使用QTextStream类。QTextStream和QDataStream的使用。

    QTextStream会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。QTextStream使用 16 位的QChar作为基础的数据存储单位,同样,它也支持 C++ 标准类型,如 int 等。实际上,这是将这种标准类型与字符串进行了相互转换。
    QTextStream同QDataStream的使用基本一致,例如下面的代码将把“The answer is 42”写入到 file.txt 文件中:
    类似,只不过它是操作纯文本文件的。

    QFile data("file.txt");
    if (data.open(QFile::WriteOnly | QIODevice::Truncate)) 
    {
        QTextStream out(&data);
        out << "The answer is " << 42;
    }

    我们在open()函数中增加了QIODevice::Truncate打开方式。我们可以从下表中看到这些打开方式的区别:

    QIODevice::NotOpen		    未打开
    QIODevice::ReadOnly		    以只读方式打开
    QIODevice::WriteOnly		以只写方式打开
    QIODevice::ReadWrite		以读写方式打开
    QIODevice::Append			以追加的方式打开,
    新增加的内容将被追加到文件末尾
    QIODevice::Truncate		   以重写的方式打开,在写入新的数据时会将原有
    							数据全部清除,游标设置在文件开头。
    QIODevice::Text			    在读取时,将行结束符转换成 \n;在写入时,
    将行结束符转换成本地格式,例如 Win32 平台
    QIODevice::Unbuffered	   忽略缓存

    我们在这里使用了QFile::WriteOnly | QIODevice::Truncate,也就是以只写并且覆盖已有内容的形式操作文件。注意,QIODevice::Truncate会直接将文件内容清空。

    QFile data("file.txt");
    if (data.open(QFile::ReadOnly)) 
    {
        QTextStream in(&data);
        QString str;
        int ans = 0;
        in >> str >> ans;
    }
    	QTextStream::readLine()//	读取一行
    	QTextStream::readAll()//读取所有文本
    		//这种函数之后再对获得的QString对象进行处理。
    	stream.setCodec("UTF-8");
    	//QTextStream的编码格式是 Unicode,