繁体   English   中英

Java 中的 FileWriter 与 FileOutputStream

[英]FileWriter vs FileOutputStream in Java

我对FileWriterFileOutputStream有点困惑。 正如我看到的 FileWriter 的源代码只有 4 个构造函数,每个构造函数都在调用FileOutputStream的构造函数。

public FileWriter(String fileName) throws IOException {
       super(new FileOutputStream(fileName));
}
public FileWriter(String fileName, boolean append) throws IOException {
        super(new FileOutputStream(fileName, append));
}
public FileWriter(File file) throws IOException {
        super(new FileOutputStream(file));
}
public FileWriter(File file, boolean append) throws IOException {
        super(new FileOutputStream(file, append));
}
public FileWriter(FileDescriptor fd) {
        super(new FileOutputStream(fd));
}

在搜索它们之间的差异后,我发现这里提到了

FileOutputStream 用于写入原始字节流,例如图像数据。 要写入字符流,请考虑使用 FileWriter。

FileWriter如何发挥作用? 即使它仍然调用FileOutputStream的构造函数而没有任何更改。

FileWriter是一个Writer 这是关于编写文本- 它恰好是将其写入文件。 它通过持有对FileOutputStream的引用来实现,该引用在FileWriter构造函数中创建并传递给超类构造函数。

FileOutputStream是一个OutputStream 这是关于写入二进制数据。 如果你想向它写入文本,你需要一些东西来将该文本转换为二进制数据——这正是FileWriter所做的。 我个人更喜欢使用FileOutputStream包装在OutputStreamWriter 以允许我指定字符编码(因为FileWriter总是使用平台默认编码,很烦人)。

基本上,认为FileWriter是一种让您编写的简单方法:

Writer writer = new FileWriter("test.txt");

而不是

Writer writer = new OutputStreamWriter(new FileOutputStream("test.txt"));

除了我通常建议使用接受CharsetOutputStreamWriter构造函数的重载。

FileOutputStream是写原始类型的数据,比如int ,而FileWriter是写面向字符的数据。

FileOutputStream没有提供处理字符串的方法。 如果要使用FileOutputStream将字符串写入文件,则必须像这样:

FileOutputStream fos=new FileOutputStream();
String str="Hello";
byte b[]=str.getBytes();
fos.write(b);
fos.close();

Filewriter ,字符串和字节数组之间没有转换。 你可以简单地使用:

FileWriter fr=new FileWriter("C:\\");
fr.write("Hello");
fr.close();

如果需要,不要忘记抛出任何异常。

FileOutputStream直接写入字节。 FileWriter封装了FileOutputStream (通过在FileWriter构造函数中创建它,如您的问题一样)并提供方便的方法来编写字符和字符串。

实际上,问题是什么时候使用 Reader/Writer,什么时候使用 Stream?

如何决定使用哪个:

1.If you are dealing with binary data (e.g. an image) use Streams.
2.If you are using non-ASCII Unicode characters, use Readers/Writers.
3.If you are using ordinary ASCII text you can (usually) use either.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM