Java中的FileInputStream和FileOutputStream字节流(附带实例)
Java 中的 FileInputStream 类和 FileOutputStream 类用于从文件/向文件读取/写入字节数据:
二者在使用时,都不需要用 close() 关闭文档。接下来,通过实例来演示读取本地文件的流程。
为了方便,我们先在当前目录下新建一个名为 read.txt 的文件,并向其中写入“C语言中文网”,接着编写程序将文件中的内容读出并打印到控制台。
注意,如果程序中途出现错误,将直接中断,所以一定要将关闭资源的 close() 方法写到 finally 中。另外,由于 finally 中不能直接访问 try 中的内容,所以要将 FileInputStream 对象定义在 try 的外面。由于篇幅有限,后面的代码不再重复异常处理的标准写法,直接将异常抛出。
需要注意的是,当创建文件输入流时,一定要保证目录下有对应文件存在,否则会报 FileNotFoundException 异常,提示“java.io.FileNotFoundException: read.txt(系统找不到指定的文件)”。
明白了 FileInputStream 类的用法,下面我们来看看与之相对应的 FileOutputStream 类,它使用字节流向一个文件中写入内容:
程序的运行结果显示已保存到 read.txt,此时文件内容如下:
与输入流不同的是,当文件不存在时,输出流会先创建文件再向其中写入内容。当文件已经存在时,会先将原来的内容清空,再向其中写入。
程序执行之后,原来的内容被替换成了新的内容。如果想要保留原来内容,只需要在构造输出流时追加一个 Boolean 类型的参数,该参数用于指定是否为追加写入,如果为 true,就能够在源文件尾部的下一行写入内容了:
运行结果显示已保存到 read.txt,由于我们是自行创建了 read.txt 文件,并在程序中重写,而本次运行的结果是将对应内容追加到 read.txt 中,此时文件内容如下:
- FileInputStream 类是 InputStream 类的子类,用来从文件中读取数据,操作文件的字节输入流;
- FileOutputStream 类是 OutputStream 类的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来写入数据。
二者在使用时,都不需要用 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语言中文网欢迎你
专注于分享优质精品课程