文本流
前面讨论的是二进制的输入输出,如果直接打开文件,会发现里面不是我们能读懂的内容。(用记事本打开里面是些空格)虽然二进制I/O速度快且效率高,但不易于人们阅读。java中的字符串,使用的是Unicode字符,例如字符串"1234"在字符编码中实际上是【00 31 00 32 00 33 00 34】,然而,Java所运行的环境有自己的字符编码,例如Windows用ASCII码,编码为【31 32 33 34】。为了在运行环境的编码和Unicode编码之间转换,Java提供了一套流过滤器。例如InputStreamReader/OutputStreamWriter
InputStreamReader in = new InputStreamReader(System.in);//从控制台读入,并自动将其转化为Unicode码。
字符集
在JDK1.4中引入的java.nio包通过引入Charset类来统一字符集的转换。
字符集给出了双字节Unicode码序列与在本地字符编码中采用的字节序列间的映射。一旦有了字符集,就可以用它在Unicode字符串和字节序列编码之间进行转换。
文本输出
进行文本输出时,应该使用PrintWriter。
PrintWriter out = new PrintWriter(new FileOutputStream("employee.txt"));
PrintWriter(OutputStream)构造器自动增加一个OutputStreamWriter来将Unicode字符转换为本地字符。
PrintWriter中有print方法和println方法,用以写入数据。
String name = "Harry Hacker"; double salary = 75000; out.print(name); out.print(‘ ‘); out.println(salary);
这将下列字符
Harry Hacker 75000
写入输出流out中。随后字符被转换为字节病最终进入文件employee.txt中。
PrintWriter总是缓冲的,可以通过PrintWriter(Writer, boolean)构造器中的第二个参数来开启或关闭自动刷新。如果开启,那么println将刷新缓冲区。
文本输入
BufferedReader类,readLine方法,以行的方式读取文本。
BufferedReader in = new BufferedReader(new FileReader("employee.txt"));
如果没有输入数据,readLine方法返回null。
FileReader类已经把本地字节转化为Unicode字符。对于其他输入源,需要使用InputStreamReader
BufferedReader in = BufferedReader(new InputStreamReader(System.in));