Java中IO流读写文本文件

这里想说的是用Java中的IO流去读取文本文件中的文件,其实主要是使用FileReader和FileWriter,以及BufferedReader和BufferedWriter去读写文本文件,只是可能每个类都会有不同的方式,以及组合起来使用的不同,其实把代码多敲两遍,就会感觉也不是很难理解。

1.系统换行符

不同的操作系统会有不同的文本换行符,主要是Windows、Linux以及Mac,这里先说明一下。

Windows: \r\n
Linux:       \n
Mac:      \r

为什么要先说明一下这个呢?因为在写Java程序读取文本文件时,里面的换行符也会作为字符被读取和写入,因此先了解一下也是很有必要的,起码会知道读取的应该是哪些字符,对api提供的功能也会多一点了解。

2.FileReader和FileWriter一次读写一个字符

这种方式是每次使用FileReader读取一个字符,然后再使用FileWriter写入一个字符,读取的时候,得到的是是该字符的数字值,然后在写入的时候会将该字符写入到文本文件中,又会将该数字值转换为原来读取的那个字符,当然,这个读写的过程要被放在一个循环之中,判断的条件就是读取到字符的数字值是否为-1,如果为-1,就说明文件被读取完了,没有的话就会继续循环。

public static void method1(String srcFile, String destFile)
        throws IOException {
    FileReader fr = new FileReader(srcFile);
    FileWriter fw = new FileWriter(destFile);

    int ch;
    while ((ch = fr.read()) != -1) {
        fw.write(ch);
    }
    fw.flush();
    fw.close();
    fr.close();
}

3.FileReader和FileWriter一次读写一个字符数组

这种方式是首先定义一个字符数组,然后每次使用FileReader读取和指定字符数组长度一样的字符到该数组中,当然如果最后一次读取的时候没有这么多长度的字符的话就会读取实际还剩余的字符,读取完之后,再将字符数组中的字符使用FileWriter写入到文本文件中,同时这一个循环读写的条件就是数组实际读写到字符的个数,如果读取到的字符个数为-1,那就说明该文件已经被读取完了,没有的话那就会继续循环读取。

public static void method2(String srcFile, String destFile)
        throws IOException {
    FileReader fr = new FileReader(srcFile);
    FileWriter fw = new FileWriter(destFile);

    char[] chs = new char[1024];
    int len;
    while ((len = fr.read(chs)) != -1) {
        fw.write(chs, 0, len);
    }
    fw.flush();
    fw.close();
    fr.close();
}

需要说明的两点是:

1.一般这个字符数组的长度都会设定为1024的倍数

2.关于fw.write(chs, 0, len);这一句代码,需要说明一下的是为什么写入的是chs这个字符数组从0开始len个长度的字符,而不是直接写入chs这个字符数组中的所有字符,这是因为在循环读写的过程中,最后一次读取到的字符个数可能小于chs数组的长度,这样因为最后一次读取后数组中后面的字符没有被覆盖,如果直接写入这个字符数组的话那么数据就会不准确,也就是说文件末尾会多了几个字符,而这多的几个字符就是在倒数第二次中读取的却没有在倒数第一次中被覆盖的,因此会产生错误。

4.BufferedReader和BufferedWriter一次读写一个字符

这种读写方式的话和FileReader以及FileWriter很像,都是一次读写一个字符,最大的不同就是这个是带缓冲区的,因此效率会来的更高一些,对于编码来说的话都差不多,直接把代码放在下面了。

public static void method3(String srcFile, String destFile)
        throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(srcFile));
    BufferedWriter bw = new BufferedWriter(new FileWriter(destFile));

    int ch;
    while ((ch = br.read()) != -1) {
        bw.write(ch);
    }
    bw.flush();
    bw.close();
    br.close();
}

5.BufferedReader和BufferedWriter一次读写一个字符数组

这个也和FileReader以及FileWriter差不多,同样因为是带缓冲区的,因此效率会比较高,编码也差不多,直接放代码了。

public static void method4(String srcFile, String destFile)
        throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(srcFile));
    BufferedWriter bw = new BufferedWriter(new FileWriter(destFile));

    char[] chs = new char[1024];
    int len;
    while ((len = br.read(chs)) != -1) {
        bw.write(chs, 0, len);
    }
    bw.flush();
    bw.close();
    br.close();
}

6.BufferedReader和BufferedWriter一次读写一行字符

这个和上面的BufferedReader以及BufferedWriter对比的话,就可以说是一种特殊方式了,以前都是一次读写一个字符或者一个字符数组,这一个就是一次读写一行了。

这种方式是每次使用BufferedReader读取文本文件中的一行文本,然后再使用BufferedWriter将这行文本写入到指定的文本文件中去,同样这个过程也是在一个循环之中,循环判断的条件就是读取到的这行字符是否为null,如果为null的话就说明文本文件已经读写完毕,不为null的话就将读取到的这行文本写入到指定的文本文件中。

public static void method5(String srcFile, String destFile)
        throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(srcFile));
    BufferedWriter bw = new BufferedWriter(new FileWriter(destFile));

    String line;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine();
    }
    bw.flush();
    bw.close();
    br.close();
}

需要注意的一点就是:使用BufferedReader读取到的一行文本是不包括换行符的,因此在写入文件的时候,会需要执行bw.newLine();这行代码,它会根据系统的不同而在文本的最后追加不同的换行符。

7.说明

最后想说明的一点是srcFile和destFile这两个参数,它们分别代表的是源文件路径名和目标文件路径名,可以是”D:\a.txt”这样的绝对路径,也可以是相对路径,比如在这里如果只写”a.txt”的话,就代表的是项目文件夹下会存在这个文件,而不是存在于和程序所在目录的同一级。

通过上面写的程序将一个文本文件,比如说小说,复制到另一个地方,成功之后也还是很有成就感的。

坚持原创技术分享,您的支持将鼓励我继续创作!