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发送字节,整个过程是如何工作的?
答案 0 :(得分:3)
文件包含字节。总是
通过使用编码将字符转换为字节,将字符写入文件。存在许多这样的编码。例如,ASCII允许将128个不同的字符转换为字节。 UTF-8允许将任何Unicode字符编码为字节。例如,这两个编码将字符'1'转换为字节49.'2'将转换为字节50。
当使用带有文件名作为参数的PrintWriter时,PrintWriter实际上会打开FileOuptutStream以将字节写入文件。当您将字符写入PrintWriter时,PrintWriter使用编码将字符转换为字节,然后将这些字节写入FileOutputStream,后者将字节写入文件。
因此,例如,如果您使用以下程序:
public class Main {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream(new File("data")) ;
for(int i = 49; i <= 58; ++i)
fos.write(i);
fos.close();
}
}
然后使用文本编辑器打开文件,您应该在文件中看到123456789
,因为代码直接写入这些字符的字节表示(ASCII或UTF8)。
答案 1 :(得分:2)
查看文档。
来自FileOutputStream.html#write(int)
:
将指定的字节写入此文件输出流。
来自PrintWriter.html#print(int)
:
打印整数。
String.valueOf(int)
生成的字符串根据平台的默认字符编码转换为字节,这些字节的写入方式与write(int)方法完全相同。
也就是说,此方法会在您看到它们时写入数字。 另一个写字节。 字节值9不是数字9,而是不可读的字符。