理解java的IO流

来源:互联网 发布:马克思 青少年 知乎 编辑:程序博客网 时间:2024/05/27 14:14

1.输入流和输出流

JAVA的输入和输出是相对于内存来说的,是从程序运行所在的内存考虑的。即从内存到硬盘应该视为输出。java的输入流主要有InputStream和Reader作为基类,输出流主要有OutputStream和Writer作为基类

2.字符流和字节流

字节流操作的最小单位是8位字节,主要的基类是InputStream和OutputStream;字符流操作的最小单位是16位字节,主要的基类是Reader和Writer

3.节点流和处理流

节点流和物理底层直接打交道,如果流的构造器参数是一个物理节点,那么它就是节点流。

处理流属于高级流,不与物理底层打交道,它的构造器参数是已存在的流

字符流和字节流的选取:如果进行输入/输出的内容是文本内容,则使用字符流;如果是二进制的内容,则使用字节流。

下面是一个转换流的例子:

package FileTest;import java.io.BufferedReader;import java.io.InputStreamReader;public class FileTest {public static void main(String[] args) {BufferedReader br=null;try{//将System.in转换为Reader对象,以便可以通过字符的形式进行输入InputStreamReader reader=new InputStreamReader(System.in);//包装成BufferedReader,可以使用readLinebr=new BufferedReader(reader);String buffer=null;while((buffer=br.readLine())!=null){if(buffer.equals("exit")){System.exit(1);}System.out.println("输入的内容为:"+buffer);}}catch(Exception e){e.printStackTrace();}finally{try{br.close();}catch(Exception e1){e1.printStackTrace();}}}}

将字节流通过InputStreamReader转换成字符流,可以提高输入效率,然后通过BufferedReader对Reader包装,可以提高读取效率。

4.重定向标准输入/输出

重定向标准输入/输出可以实现对输入/输出平台的改变。比如:可以将日志输出到文件中,而不是普通的控制台上。(这让我有点恍然大悟的感觉,在android真机测试时,就会有很多的这种日志文件,我一直不知道是如何产生的。)下面就是一个生成日志的例子:

package redirectout;import java.io.PrintStream;import java.io.FileOutputStream;public class RedirectOut {public static void main(String[] args) {// TODO Auto-generated method stubPrintStream ps=null;try{ps=new PrintStream(new FileOutputStream("out.txt"));//实现将日志输出到ps所对应的文件中System.setOut(ps);System.out.println("普通字符串");System.out.println(new RedirectOut());}catch(Exception e){e.printStackTrace();}finally{if(ps!=null){ps.close();}}}}
out.txt
普通字符串<a target=_blank href="mailto:redirectout.RedirectOut@1db9742">redirectout.RedirectOut@1db9742</a>


0 0