Java FileOutputStream
Java FileOutputStream类java.io.FileOutputStream可以将文件作为字节流写入。 JavaFileOutputStream
类是Java OutputStream的子类,这意味着我们可以将FileOutputStream
用作OutputStream
。
Java FileOutputStream示例
这是一个简单的Java FileOutputStream示例:
OutputStream output = new FileOutputStream("c:\data\output-text.txt"); while(moreData) { int data = getMoreData(); output.write(data); } output.close();
注意:为清楚起见,此处已跳过适当的异常处理。要了解有关正确的异常处理的更多信息,请转到Java IO异常处理。在本教程的底部,有关关闭JavaFileOutputStream
的部分中还有一个更好的异常处理示例。
FileOutputStream构造函数
JavaFileOutputStream
类包含一组不同的有用的构造函数。我将在这里介绍最常用的构造函数。
第一个构造函数使用一个" String",其中包含要写入的文件的路径。这是一个例子:
String path = "C:\users\HymanHyman\data\datafile.txt"; FileOutputStream output = new FileOutputStream(path);
注意path
String。它需要双反斜杠(
\)在
String`中创建一个反斜杠,因为反斜杠是Java字符串中的转义字符。要获得一个反斜杠,我们需要使用转义序列" \"。
在Unix上,文件路径可能如下所示:
String path = "/home/HymanHyman/data/datafile.txt";
第二个FileOutputStream构造函数接受一个Java File对象,该对象指向文件系统中的文件。这是一个例子:
String path = "C:\users\HymanHyman\data\datafile.txt"; File file = new File(path); FileOutputStream output = new FileOutputStream(file);
覆盖与追加文件
当创建指向文件的JavaFileOutputStream
时,我们可以决定是要覆盖现有文件,还是要追加到现有文件。我们可以根据选择使用哪个FileOutputStream构造函数来决定。
仅使用一个参数(文件名)的此构造函数将覆盖任何现有文件:
OutputStream output = new FileOutputStream("c:\data\output-text.txt");
还有一个构造函数也需要两个参数:文件名和一个布尔值。布尔值指示是否添加到文件。因此,值" true"表示我们想要添加到文件,而值" false"表示我们想要覆盖文件。这是两个JavaFileOutputStream
构造函数示例:
OutputStream output = new FileOutputStream("c:\data\output-text.txt", true); //append OutputStream output = new FileOutputStream("c:\data\output-text.txt", false); //overwrite
当我们省略第二个布尔值参数,从而仅使用采用文件路径的构造函数时,默认模式是覆盖给定路径上的任何现有文件。
write()
要将数据写入Java FileOutputStream,可以使用其write()方法。 write()方法采用一个int,其中包含要写入的字节的字节值。因此,仅将传递的int的低8位写入到FileOutputStream目标中。这是一个使用其write()方法将数据写入Java FileOutputStream的示例:
OutputStream outputStream = new FileOutputStream("c:\data\output-text.txt"); outputStream.write(123);
本示例将字节值123写入给定的Java FileOutputStream。
写入字节数组
由于Java的FileOutputStream是OutputStream的子类,因此我们也可以将字节数组写入FileOutputStream,而不是一次写入一个字节。这是将字节数组写入JavaFileOutputStream
的示例:
OutputStream outputStream = new FileOutputStream("c:\data\output-text.txt"); byte bytes = new byte[]{1,2,3,4,5}; outputStream.write(bytes);
写的性能
将字节数组写入Java FileOutputStream比一次写入一个字节更快。高达10倍甚至更高的加速比可能是非常显着的。因此,建议尽可能使用write(byte [])方法。
我们获得的确切速度取决于运行Java代码的计算机的基础操作系统和硬件。加速取决于诸如内存速度,硬盘速度和缓冲区大小之类的问题。
通过BufferedOutputStream进行透明缓冲
通过将其包装在Java BufferedOutputStream中,可以对写入JavaFileOutputStream
的字节进行透明缓冲。写入" FileOutputStream"的所有字节将首先在" BufferedOutputStream"的内部字节数组内进行缓冲。当缓冲区已满时,缓冲区会立即全部刷新到磁盘。这是将JavaFileOutputStream
包装在BufferedOutputStream
中的示例:
int bufferSize = 8 * 1024; FileOutputStream output = new BufferedOutputStream( new FileOutputStream("c:\data\output-file.txt"), bufferSize );
我们可以在我的BufferedOutputStream教程中进一步了解BufferedOutputStream
。
flush()
当我们将数据写入Java FileOutputStream时,数据可能会在内部缓存在计算机内存中,并在以后写入磁盘。例如,每次要写入X数量的数据,或者关闭FileOutputStream
时。
如果我们想确保所有写入的数据都写入磁盘而不必关闭FileOutputStream
,则可以调用其flush()
方法。调用flush()
将确保到目前为止所有已写入FileOutputStream
的数据也已完全写入磁盘。这是一个调用JavaFileOutputStream``flush()
方法的示例:
OutputStream outputStream = new FileOutputStream("c:\data\output-text.txt"); byte bytes = new byte[]{1,2,3,4,5}; outputStream.write(bytes); outputStream.flush()
关闭FileOutputStream
像其他任何OutputStream一样,FileOutputStream实例在使用后需要关闭。我们可以通过调用它的close()
方法来实现。这是通过调用Java的close()方法关闭Java的FileOutputStream的示例:
OutputStream outputStream = new FileOutputStream("c:\data\output-text.txt"); outputStream.write(123); outputStream.close();
不幸的是,如果在上例中的write()调用期间引发了异常,则该异常将导致程序流在调用close()方法之前中断。因此,最好使用带有资源构造的Java try关闭JavaFileOutputStream
。这是一个使用try-with-resources构造关闭JavaFileOutputStream
的示例:
try( OutputStream outputStream = new FileOutputStream("c:\data\output-text.txt") ) { outputStream.write(123); }
注意如何在try
关键字后面的括号内声明FileOutputStream
。一旦程序流退出" try"块,这些括号内声明的所有资源都会自动关闭,无论是否引发异常。换句话说,FileOutputStream``close()
将自动为我们调用。
将FileOutputStream转换为Writer
JavaFileOutputStream
是基于字节的流。我们可以使用Java OutputStreamWriter类将" FileOutputStream"转换为基于字符的" Writer"。这是一个使用OutputStreamWriter
将JavaFileOutputStream
转换成Writer
的例子:
FileOutputStream outputStream = new FileOutputStream("c:\data\output.txt"); Writer outputStreamWriter = new OutputStreamWriter(outputStream); outputStreamWriter.write("Hello World");
在我的OutputStreamWriter教程中,我们可以阅读有关如何使用OutputStreamWriter
的更多信息,包括如何设置将字符转换为字节时使用的字符编码。