【发布时间】:2015-12-24 04:52:55
【问题描述】:
PrintWriter 用于将数据以文本形式写入文件,而FileOutputStream 用于以二进制形式写入。
考虑
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
PrintWriter pw = new PrintWriter(new File("data"));
for(int i=1;i<=10;++i)
pw.print(i);
pw.close();
}
}
输出:
12345678910
但是,如果我使用FileOutputStream,我得到的二进制数据在文本中是不可读的。
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream(new File("data")) ;
for(int i= 1; i<=10; ++i)
fos.write(i);
fos.close();
}
}
给出输出:
现在,如果我将PrintWriter 与FileOutputStream 一起使用,那么我仍然会得到如下所示的文本数据。为什么?它是如何变成文本的,为什么?
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
PrintWriter pw = new PrintWriter( new FileOutputStream(new File("data")));
for(int i=1 ;i<=10;++i)
pw.print(i);
pw.close();
}
}
输出:
12345678910
******编辑:***
现在考虑,案例
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws Exception
{
PrintWriter pw = new PrintWriter( new DataOutputStream(new FileOutputStream(new File("data"))));
for(int i=1 ;i<=10;++i)
pw.print(i);
pw.close();
}
}
输出仍然是: 12345678910
根据JavaDocs:
数据输出流允许应用程序写入原始 Java 数据 以可移植的方式输入输出流。然后一个应用程序可以 使用数据输入流将数据读回。
那么,现在如果 PrintWriter 正在向 DataOutputStream 发送字节,那么整个事情是如何工作的?
【问题讨论】:
-
DataOutputStream 在您的示例中是多余的。它没有做任何有用的事情,这就是它起作用的原因,但它令人困惑,如果您正在编写文本,则不应使用它。
-
是什么让 DataOutputStream 变得多余?我无法得到它。
-
如果你取出 DataOutputStream ,它会做同样的事情(稍微快一点)。因此它是多余的。
-
但是 DataOutputStream 采用原语,将它们转换为二进制,然后将其发送到 FileOutputStream。在这里,DataOutputStream 正在获取编码字节。那么,这如何解释呢?
-
PrintWriter 调用
dataOutputStream.write(),它只是将字节写入底层 FileOutputStream。查看javadoc和源代码。
标签: java file-io fileoutputstream printwriter