java i/o 学习总结(二)

来源:互联网 发布:java相关的书籍 编辑:程序博客网 时间:2024/04/23 16:09
java i/o 学习总结(二)


在上一篇博客中,我总结了Java i/o中面向字节的部分。还有面向字符的部分没有总结,在这篇博客中,我会介绍面向字符部分的部分。
既然,已经有了面向字节的i/o,为什么还需要面向字符的i/o呢。我的理解是,面向字节无法处理汉字的问题,有汉字问题的时候,需要制定
编码方式,来保证正确的输出,否则只会出现乱码。面向字符部分,解决了这种问题,同时兼容Unicode。
reader和writer是面向字符的两个基本的类,他们的write()和read()方法是天然支持Unicode编码的。这为我们提供了便利。

下面,是reader和writer得继承体系结构。

Reader的常用子类有BufferedReader,CharArrayReader,PipedReader,StringReader.
Writer的常用子类有BufferedWriter,CharArrayWriter,PipedWriter,StringWriter.
还有两个用于转换字节和字符的流
InputStreamReader 用于字节向字符转换,它的子类是FileReader(很奇怪没有想字节系统一样,是Reader的子类)
OutputStreamWriter 用于字节向字符转换。它的子类是FileWriter。


下面是一个读入文件,输出到控制台的程序
public class Test{
public static void main(String [] args) throws IOException{
BufferedReader in=new BufferedReader(                            //这样写,是为了突出装饰器模式,File打开文件
new FileReader(                                          //FileReader用来将文件读入,BufferReader用来缓存。
new File("src\\com\\nuc\\Test.java")));     //
String s;
StringBuilder sb=new StringBuilder();
while((s=in.readLine())!=null)                                   //一次在文件中读一行,当读到末尾的时候为空,将其加入
sb.append(s+"\n");                                           //StringBuilder中,然后输出
in.close();
System.out.println(sb.toString());
}
}


下面,是一个复制文件的过程,当然也可以用InputStream和OutPutStream完成复制


public class Test2{
public static void main(String [] args) throws IOException{
BufferedReader in=new BufferedReader(
new FileReader("src\\com\\nuc\\Test.java"));
PrintWriter out=new PrintWriter(
new BufferedWriter(
new FileWriter("out")));
String s;
while((s=in.readLine())!=null){
out.print(s+"\n");
}
in.close();
out.close();
StringBuilder s1=new StringBuilder(); 
BufferedReader in1=new BufferedReader(
new FileReader("out"));
while((s=in1.readLine())!=null)
s1.append(s+"\n");
System.out.println(s1);
in1.close();
}
}


面向字符流和面向字节流都笔试孤立存在的,他们之间通常需要进行转换,例如GZip压缩文件的时候,就仅仅支持字节流,
所以,有的时候,需要字节流和字符流需药转换,如InputStreamReader,是把InpurSteam转换成Reader,OutputStream是把OutputStream转换成Writer


下面是对字符字节流转换,还有重定向的例子
System.in是一个InputStream,System.out是一个PrintStream()。
public class Test3{
public static void main(String [] args) throws IOException{
BufferedReader br=new BufferedReader(
new InputStreamReader(System.in));                  //InputStreamReader用于把System.in装换成字符输出

PrintStream ps=new PrintStream(
new BufferedOutputStream(
 new FileOutputStream("test")));                   //首先,建立一个PrintStreem的流  
System.setOut(ps);                                          //将标准输出重定向到ps
   PrintWriter out=new PrintWriter(System.out,true);
int i=5;
while(i!=0){
out.println(br.readLine());                             //在控制台读入,写到文件里
i--;
}
ps.close();
}
}
   
   



1 0