1.Java I/O系统概论
由于数据输入和接受端的多样性以及与他们通信方式的多样性(你可能需要按字节,按字符,顺序或随机地获得它们)存在,一个优秀的I/O系统对每门语言来说都是一个巨大挑战。
Java类库设计者的解决方法是创造了众多的类库,它们命名反复,使用起来也相当不直观(这是我初步体验后的感受)。然而,还是存在学习这些数量众多的类库的必要性,否则在有I/O需求的时候,我们会对使用哪些类,哪些类的读写性能更好而感到迷惑。
2.Java I/O类库分类
主要可以分为
1.File类
2.输入输出流类(Input/OutputStream)
★
3.序列化类(Serializable)
4.XML
5.Preference
3.输入输出流(Stream)中的装饰器模式
流代表任何有能力产生数据、接收数据的数据对象,并且它的特点在于屏蔽了实际I/O设备中处理数据的细节。
任何继承自InputStream或OutputStream的类都含有read()或write()方法。但我们通常不直接使用它们,而是用别的类使用它们以提供更加有用的接口。通过叠加多个对象来提供期望的功能,这就是装饰器模式。
这使得我们可以随意定制我们所需的I/O类,另一方面,创建了多个对象完成同一目的也正是Java I/O系统让人感到迷惑的点。
4.比较Reader/Writer类与流类库的异同
以Reader为例,它和InputStream都属于Java流类库。然而前者提供的是面向字符后者则是面向字节的输入,它们也并不存在相互替代的关系。
实际上,Java还提供了一种叫做InputStreamReader的适配器类来使它们互相转化。
5.实践常用的缓冲(BufferedReader)读入文件,并用PrintWriter类格式化输出
缓存读入
public class BufferedInputFile{
public static string read (String filename){
BufferedReader br = new BufferedReader(new FileReader(filename));
String content;
StringBuilder sb = new StringBuilder();
while(content =br.readline()!=null)
sb.append(content+"\n");
br.close();
retuen sb.toString();
}
}
基本输出
PrinterWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
out.println("some thing you want to print out");
6.深刻理解nio类中FileChannel和视图缓冲器的概念
JDK1.4的java.nio.*包中引入了新的Javal/O类库,其目的在于提高速度。
速度的提髙来自于所使用的结构更接近于操作系统执行I/O的方式:通道和缓冲器。我们可以把它想像成一个煤矿,通道是一个包含煤层(数据)的矿藏,而缓冲器则是派送到矿藏的卡车。卡车载满煤炭而归,我们再从卡车上获得煤炭。也就是说,我们并没有直接和通道交互; 我们只是和缓冲器交互,并把缓冲器派送到通道。通道要么从缓冲器获得数据,要么向缓冲器 发送数据。
旧I/O类库中有三个类被修改了,用以产生FileChannel。这三个被修改的类是
FilelnputStream、FileOutputStream以及用于既读又写的RandomAccessFile。
FilelnputStream、FileOutputStream以及用于既读又写的RandomAccessFile。
唯一直接与通道交互的缓冲器是ByteBuffer——也就是说,可以存储未加工字节的缓冲器。
视图缓冲器可以让我们通过某个特定的基本数据类型的视窗査看其底层的 ByteBuffer。ByteBuffer依然是实际存储数据的地方,“支持”着前面的视图,因此,对视图的 任何修改都会映射成为对ByteBuffer中数据的修改。