Java 读写文件的内容

我们的编写的程序经常需要从磁盘上读取一个文件的内容或将一些内容写入到磁盘的上的文件里, 用以读取和存放一些特定的数据. 而在 Java 中, 用于向文件读取或写入内容的就需要特定的类了, 需要注意的是, 这个类, 不是 File 类. 接下来我们就看看具体如何使用Java实现文件的读写吧.

一. Java 读取文件内容

在 Java 中有多种类实现了文件的读取.

1.1 使用 FileReader 来读取文件

java.io.FileReader 是Java中专门用来读取文件内容的类. 在这里, 首先要提供文件名初始化 FileReader 对象, 然后调用的 read() 方法来读取文件中的内容. 具体的示例如下:

package com.yi21.course;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.CharBuffer;

public class Yi21FileReading {
    public static void main(String[] args) {
        String fileName = "D:/21yi.com/article/com/yi21/course/Yi21DateDemo.java";
        try {
            File file = new File(fileName);
            System.out.println("文件大小: " + file.length());
            FileReader reader = new FileReader(file);
            //数组的数量决定了 read 方法的数量
            char[] chars = new char[7];
            System.out.println("读取了 " + reader.read(chars) + " 个字符.");
            System.out.println("内容为: " + String.valueOf(chars));
            chars = new char[17];
            System.out.println("又读取了 " + reader.read(chars) + " 个字符.");
            System.out.println("内容为: " + String.valueOf(chars));
            System.out.println("读取余下全部内容:");
            CharBuffer buffer = CharBuffer.allocate(1024);
            System.out.println("又读取了 " + reader.read(buffer) + " 个字符.");
            System.out.println("节选余下内容的部分内容: ");
            System.out.println(String.valueOf(buffer.array()).substring(4, 27));
            reader.close();
        } catch (FileNotFoundException e) {
            System.err.println("未能找到文件: " + fileName);
        } catch (IOException e) {
            System.err.println("发生了读写错误: " + e.getMessage());
        }
    }
}

在这个示例中, 读取的文件内容是本站 Java 日期时间 文章中第一个示例的内容. 程序执行的结果如下:

文件大小: 330
读取了 7 个字符.
内容为: package
又读取了 17 个字符.
内容为:  com.yi21.course;
读取余下全部内容:
又读取了 286 个字符.
节选余下内容的部分内容:
import java.util.Date;

在例子中我们可以看到, 处理过程中需要处理 FileNotFoundExceptionIOException, 这两个异常分别在初始化 FileReader 和使用其 read() 方法时抛出. 然后我们将余下内容读取到一个 CharBuffer 对象中, 并转换成字符串, 截取了其中的部分用于展示. 最后记得调用 FileReaderclose() 方法来关闭读取器.

1.2 使用 BufferedReader 读取文件内容

java.io.BufferedReader 是专门用作字符输入流中读取文本的类. 在本文中, 首先要提供 FileReader 实例初始化 BufferedReader 对象, 然后调用的 read() 方法来读取文件中的内容或者调用 readLine() 方法整行读取内容. 具体的示例如下:

package com.yi21.course;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.CharBuffer;

public class Yi21FileReading2 {
    public static void main(String[] args) {
        String fileName = "D:/21yi.com/article/com/yi21/course/Yi21DateDemo.java";
        try {
            File file = new File(fileName);
            System.out.println("文件大小: " + file.length());
            BufferedReader reader = new BufferedReader(new FileReader(file));
            System.out.println("读取第一行问内容: " + reader.readLine());
            char[] chars = new char[25];
            System.out.println("又读取了 " + reader.read(chars) + " 个字符.");
            System.out.println("内容为: " + String.valueOf(chars));
            System.out.println("读取余下全部内容:");
            CharBuffer buffer = CharBuffer.allocate(1024);
            System.out.println("又读取了 " + reader.read(buffer) + " 个字符.");
            System.out.println("节选余下内容的部分内容: ");
            System.out.println(String.valueOf(buffer.array()).substring(3, 28));
            reader.close();
        } catch (FileNotFoundException e) {
            System.err.println("未能找到文件: " + fileName);
        } catch (IOException e) {
            System.err.println("发生了读写错误: " + e.getMessage());
        }
    }
}

输出结果如下:

文件大小: 330
读取第一行问内容: package com.yi21.course;
又读取了 25 个字符.
内容为:
import java.util.Date;
读取余下全部内容:
又读取了 259 个字符.
节选余下内容的部分内容:
public class Yi21DateDemo

就调用的方法而言, BufferedReaderFileReader 调用的方法差别不大, 但是 BufferedReader 提供了额外的 readLine() 方法读取文件流中的整行.

1.3 使用 FileInputStream 读取文件内容

FileInputStream 会创建一个流打开与实际文件的连接, 读取出的来内容为 byte[]. 使用示例如下:

package com.yi21.course;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Yi21FileReading3 {
    public static void main(String[] args) {
        String fileName = "D:/21yi.com/article/com/yi21/course/Yi21DateDemo.java";

        File file = new File(fileName);

        try {
            FileInputStream stream = new FileInputStream(file);
            byte[] bytes = new byte[25];
            System.out.println("读取了 " + stream.read(bytes) + " 个字符.");
            System.out.println("读取字节的内容为: " + new String(bytes));
            System.out.println("读取余下全部字节:");
            bytes = stream.readAllBytes();
            System.out.println("读部分剩余字节的内容为: " + new String(bytes).substring(3, 25));
            stream.close();
        } catch (FileNotFoundException e) {
            System.err.println("未能找到文件: " + fileName);
        } catch (IOException e) {
            System.err.println("发生了读写错误: " + e.getMessage());
        }

    }
}

执行结果如下:

读取了 25 个字符.
读取字节的内容为: package com.yi21.course;
读取余下全部字节:
读取字节的内容为: import java.util.Date;

FileReaderBufferedReader 不同, FileInputStream 主要通过 read() 方法将文件的内容读取到 byte[] 中, 因此在不同的需求中, 可以考虑使用不同的类, 同时  FileInputStream 还提供了 readAllBytes() 方法, 用于读取文件的全部内容, 有这类需求的也可以考虑使用  FileInputStream.

二. Java 向文件中写入内容

与读取文件内容类似, Java 也提供了多种类向文件中写入内容.

2.1 使用 FileWriter 向文件写入内容.

FileWriter 使用默认的缓冲区大小将文本写入字符文件. 示例代码如下:

package com.yi21.course;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

public class Yi21FileWriting {
    public static void main(String[] args) {
        String fileName = "D:/21yi.com/tmp_dir/FileWring.tmp";
        try {
            File file = new File(fileName);
            FileWriter writer = new FileWriter(file);
            writer.append("Hello
");
            writer.append("I'm 2");
            writer.write("1y");
            writer.append('i');
            writer.close();
            FileInputStream stream = new FileInputStream(file);
            System.out.println("文件的内容为: " + new String(stream.readAllBytes()));
            stream.close();
        } catch (FileNotFoundException e) {
            System.err.println("未能找到文件: " + fileName);
        } catch (IOException e) {
            System.err.println("发生了读写错误: " + e.getMessage());
        }
    }
}

执行结果如下:

文件的内容为: Hello
I'm 21yi

在示例中, 我们先初始化一个 FileWriter 实例, 然后通过 append()write() 方法添加内容. 需要注意的是, 调用这两个方法, 不会立刻将内容添加到文件中去, 需要 flush() 方法刷新或者 close() 方法关闭, 才会将内容写入到文件中去. 这一点, 可以注释掉 close() 这行代码, 看观察是否能够读出内容观察到.

2.2 使用 BufferedWriter 写入内容到文件

BufferedWriter 将文本写入字符输出流, 缓冲字符以提供单个字符、数组和字符串的高效写入. 示例代码如下:

package com.yi21.course;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

public class Yi21FileWriting2 {
    public static void main(String[] args) {
        String fileName = "D:/21yi.com/tmp_dir/FileWring.tmp";
        try {
            File file = new File(fileName);
            BufferedWriter writer = new BufferedWriter(new FileWriter(new File(fileName)));
            writer.append("Hello");
            writer.newLine();
            writer.append("I'm 2");
            writer.append("1y");
            writer.append('i');
            writer.write("
Good Job");
            writer.close();
            FileInputStream stream = new FileInputStream(file);
            System.out.println("文件的内容为: " + new String(stream.readAllBytes()));
            stream.close();
        } catch (FileNotFoundException e) {
            System.err.println("未能找到文件: " + fileName);
        } catch (IOException e) {
            System.err.println("发生了读写错误: " + e.getMessage());
        }
    }
}

执行结果如下:

文件的内容为: Hello
I'm 21yi

BufferedWriter 使用起来大体上和 FileWriter 是相似的, 也通过 append() 或 write() 方法添加内容, 也需要 flush() 方法刷新或者 close() 方法关闭后才能将内容写入到文件.  BufferedWriter 单独提供了 newLine() 方法为操作添加快捷的便于识别的添加行的方法.

2.3 使用 FileOutputStream 向文件写入内容

FileOutputStream 创建一个流打开与实际文件的连接, 并写入 byte[] 格式的内容. 使用示例如下:

package com.yi21.course;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Yi21FileWriting3 {
    public static void main(String[] args) {
        String fileName = "D:/21yi.com/tmp_dir/FileWring3.tmp";
        try {
            File file = new File(fileName);
            FileOutputStream out = new FileOutputStream(file);
            out.write("Hello,".getBytes());
            byte b = '2';
            out.write(' ');
            out.write(b);
            out.write("1yi".getBytes());
            out.close();
            FileInputStream in = new FileInputStream(file);
            System.out.println("文件的内容为: " + new String(in.readAllBytes()));
            in.close();
        } catch (FileNotFoundException e) {
            System.err.println("未能找到文件: " + fileName);
        } catch (IOException e) {
            System.err.println("发生了读写错误: " + e.getMessage());
        }
    }
}

执行结果如下:

文件的内容为: Hello, 21yi

几个写文件的类写入的流程都差不多, 主要的区分点在于一些额外的方法以及要求写入的内容的类型, 注意到这些区别, 使用起来不会有太多问题.

好了, 以上就是 Java 读写文件的全部内容了.