在保存数据时,可以选择二进制格式或文本格式。尽管二进制格式的I/O高速且高效,但是不宜人阅读。
在存储文本字符串时,需要考虑字符编码(character encoding)方式。ISO-8859-1编码在美国和西欧最常用的常用的编码方式。
OutputStreamWriter类将使用选定的字符编码方式,把Unicode字符流转换为字节流。而InputStreamReader类将包含字节的输入流转换为可以产生Unicode码元的读入器。
一、如何写出文本输出
对于文本输出,可以使用PrintWriter。这个类拥有以文本格式打印字符串和数字的方法,它甚至还有一个将PrintWriter链接到FileWriter的便捷方法。
二、如何读入文本输入
众所周知:
1)以二进制格式写出数据,需要使用DataOutputStream。2)以文本格式写出数据,需要使用PrintWriter。
在Java SE 5.0之前,处理文本输入的唯一方式就是通过BufferedReader类,它拥有一个readLine方法,使得我们可以读入一行文本。你需要将带缓冲区的读入器与输入源组合起来:
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("employee.txt"),"UTF-8"));
readLine方法在没有输入时返回null。因此,一个典型的输入循环类似:
String line;
while((line = in.readLine())!=null){
do something with line
}
然而,BufferedReader没有任何用于读入数字的方法。建议使用Scanner来读入文本输入。
三、以文本格式存储对象
使用PrintWriter来写出文件
四、字符集
在过去,国际化字符集已经得到了处理,但是处理得很不系统,散布在Java类库的各处。在Java SE 1.4中引入的java.nio包用Charset类统一了对字符集的转换。
字符集建立了两字节Unicode码元序列与使用本地字符编码方式的字节序列之间的映射。ISO-8859-1是最流行的字符编码方式之一,这是一种对Unicode前256个字符进行单字节编码的方式。ISO-8859-1则更加重要,它用法语和芬兰语中带有重音符号的字母取代了ISO-8859-1中某些不常用的字符,更重要的是,它用欧元符号取代了编码为0xA4的“国际货币”字符。通常用于日语和中文的可变字节编码方式是另一个字符编码方式的例子。
本地编码方式模式不能表示所有的Unicode字符,如果某个字符不能表示,它将被转换成?
一旦有了字符集,就可以使用它在包含Unicode码元的Java字符串和编码而成的字节序列之间进行转换,下面是如何编码Java字符串的代码:
String str = "";
ByteBuffer buffer = cset.encode(str);
byte[] bytes = buffer.array();
与之相反,要想解码字节序列,需要有字节缓冲区。使用ByteBuffer数组的静态方法,wrap可以将一个字节数组转换成一个字节缓冲区。
decode方法的结果是一个CharBuffer,调用它的toString方法可以获得一个字符串。
byte[] bytes = ...;
ByteBuffer bbuf = ByteBuffer.wrap(bytes,offset,length);
CharBuffer cbuf = cset.decode(bbuf);
String str = cbuf.toString();