Java FileOutputStream

时间:2020-01-09 10:36:02  来源:igfitidea点击:

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);

注意pathString。它需要双反斜杠(\)在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的更多信息,包括如何设置将字符转换为字节时使用的字符编码。