18 java IO
18.2.1 InputStream类型
每一种数据源都有相应的InputStream子类。另外,FilterInputStream也属于一种InputStream,为“装饰器”(decorator)类提供基类,其中,装饰器类可以把属性或有用接口与输入流连接在一起。
18.2.2 OutputStream类型
FilterOutSteam为“装饰器”类提供一个基类。
18.4 Reader和Writer
有时候我们需要把来自于“字节”层次结构中的类和“字符”层次结构中的类结合起来使用。为了实现这个目的,需要用到适配器类:InputStreamReader可以把InputStream转换为Reader,OutputStreamWriter可以把OutputStream转换为Writer。
18.8 标准IO
18.8.1 从标准输入中读取
java提供了System.in,System.err,和System.out。
其中System.out已经被事先包装成了printStream对象。System.err同样是PrintStream,但System.in却是一个没有被加工包装的InputStream。这意味着我们可以立即使用System.out和System.err但是在读取System.in之前必须对其进行包装。
通常我们会用readLine()一次一行读取输入,为此,我们将System.in包装成BufferedReader来使用。这要求我们必须用InputStreamReader把Syste.in转换成Reader。
BufferedReader stdin = new BufferedReader(new InputStreamReader (System.in);
String s;
while(s=stdin.readLine()!=null && s.length!=0){
System.out.println(s);
}
readLine()会抛出IOException。
18.8.2 将System.out转换成PrintWriter
System.out是一个PrintStream,而PrintStream是一个OutputStream。PirntWriter有一个可以接受OutputStream作为参数的构造器,因此,只要你需要,就可以把System.out转换成PrintWriter。
PrintWriter out = new PrintWriter(System.out,true);
out.println("hello,world");
将第二个参数设成true,以便开启自动清空功能,否则,你可能看不到输出。
18.8.3 标准IO重定向
java的System类提供了一些简单的静态方法调用,以允许我们对标准输入,输出和错误IO流进行重定向。
setIn(InputStream)
setOut(PrintStream)
setErr(PrintStream)
18.10 新IO
旧IO类库中有三个类被修改了,用以产生FileChannel。这三个被修改的类是FileInputStream,FileOutputStream和RandomAccessFile。
18.14 Preferences
Preferences API与对象序列化相比,前者与对象持久性更密切,因为它可以自动存储和读取信息。不过,它只能用于小的,受限的数据集合–我们只能存储基本类型和字符串,并且每个字符串的存储长度不能超过8k。
public class PreferencesDemo{
Preferences prefs = Preferences.userNodeForPackage(PreferencesDemo.class);
prefs.put("Localtion","OZ");
prefs.putInt("Companions",4);
Prefs.putBoolean("Are there witches",true);
int usageCount = prefs.getInt("UsageCount",0);
usageCount++;
prefs.putInt("UsageCount",usageCount);
for(String key:prefs.get(key,null){
print(key + ":" + prefs.get(key,null);
}
print(prefs.getInt("Companions",0));
}
当我们第一次运行程序时,UsageCount的值是0,但在随后引用中,它将会是非零值。