首页 > 编程笔记 > Java笔记 阅读:1

Java中的FileInputStream和FileOutputStream字节流(附带实例)

Java 中的 FileInputStream 类和 FileOutputStream 类用于从文件/向文件读取/写入字节数据:
二者在使用时,都不需要用 close() 关闭文档。接下来,通过实例来演示读取本地文件的流程。

为了方便,我们先在当前目录下新建一个名为 read.txt 的文件,并向其中写入“C语言中文网”,接着编写程序将文件中的内容读出并打印到控制台。
import java.io.*;

public class Demo {
    public static void main(String[] args) {
        FileInputStream fileInput = null;
        try {
            fileInput = new FileInputStream("read.txt"); // 创建文件输入流对象
            int n = 1024; // 设置读取的字节数
            byte buffer[] = new byte[n];
            // 读取输入流
            while ((fileInput.read(buffer, 0, n) != -1) && (n > 0)) {
                System.out.print(new String(buffer));
            }
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            if (fileInput != null) {
                try {
                    fileInput.close(); // 释放资源
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
程序的运行结果如下:

C语言中文网

程序中建立了一个长度为 1024 的 byte 数组,将其传入 read() 方法中,并设置始末位置分别为 0 和 n,此时 read() 方法一次读 1024 个字节。运行之后,我们看到控制台打印出“C语言中文网”。

注意,如果程序中途出现错误,将直接中断,所以一定要将关闭资源的 close() 方法写到 finally 中。另外,由于 finally 中不能直接访问 try 中的内容,所以要将 FileInputStream 对象定义在 try 的外面。由于篇幅有限,后面的代码不再重复异常处理的标准写法,直接将异常抛出。

需要注意的是,当创建文件输入流时,一定要保证目录下有对应文件存在,否则会报 FileNotFoundException 异常,提示“java.io.FileNotFoundException: read.txt(系统找不到指定的文件)”。

明白了 FileInputStream 类的用法,下面我们来看看与之相对应的 FileOutputStream 类,它使用字节流向一个文件中写入内容:
import java.io.*;

public class Demo {
    public static void main(String[] args) throws Exception {
        System.out.print("请输入要保存到文件的内容:");
        int count, n = 1024;
        byte buffer[] = new byte[n];
        count = System.in.read(buffer); // 读取标准输入流
        // 创建文件输出流对象
        FileOutputStream fileOutput = new FileOutputStream("read.txt");
        fileOutput.write(buffer, 0, count); // 写入输出流
        System.out.println("已保存到read.txt!");
        fileOutput.close(); // 释放资源
    }
}
程序的运行结果如下:

请输入要保存到文件的内容:C语言中文网欢迎你
已保存到read.txt!


程序的运行结果显示已保存到 read.txt,此时文件内容如下:

C语言中文网欢迎你


与输入流不同的是,当文件不存在时,输出流会先创建文件再向其中写入内容。当文件已经存在时,会先将原来的内容清空,再向其中写入。

程序执行之后,原来的内容被替换成了新的内容。如果想要保留原来内容,只需要在构造输出流时追加一个 Boolean 类型的参数,该参数用于指定是否为追加写入,如果为 true,就能够在源文件尾部的下一行写入内容了:
import java.io.*;

public class Demo {
    public static void main(String[] args) throws Exception {
        System.out.print("请输入要保存到文件的内容:");
        int count, n = 1024;
        byte buffer[] = new byte[n];
        count = System.in.read(buffer); // 读取标准输入流
        // 创建文件输出流对象
        FileOutputStream fileOutput = new FileOutputStream("read.txt", true);
        fileOutput.write(buffer, 0, count); // 写入输出流
        System.out.println("已保存到read.txt!");
        fileOutput.close(); // 释放资源
    }
}
程序的运行结果如下:

请输入要保存到文件的内容:专注于分享优质精品课程
已保存到read.txt!


运行结果显示已保存到 read.txt,由于我们是自行创建了 read.txt 文件,并在程序中重写,而本次运行的结果是将对应内容追加到 read.txt 中,此时文件内容如下:

C语言中文网欢迎你
专注于分享优质精品课程

通过实例程序可以看出,构造 FileOutputStream 对象时声明 append 参数为 true,即可在原文件基础上写入新内容。

相关文章