[英]FileWriter vs FileOutputStream in Java
我对FileWriter
和FileOutputStream
有点困惑。 正如我看到的 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"));
除了我通常建议使用接受Charset
的OutputStreamWriter
构造函数的重载。
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.