Java IO系统——IO流分类说明

来源:互联网 发布:北京中标软件怎么样 编辑:程序博客网 时间:2024/05/16 08:28

     

     按照不同的分类方式,可以将流分为不同的类型,下面从不同角度来对流进行分类:    

     

     一、输入流和输出流


     1.输入流:


     ①基类:InputStream/Reader

     ②模型:把输入设备抽象成一个装水的"水桶",输入流是连接在这个"水桶"上的"水管",这个"水管"里的每个水滴依次排列,每次从"水管"中读取水滴

     ③方法:InputStream和Reader是所有输入流的抽象基类,本省并不能创建实例来执行输入,但它们是所有输入流的模板,所以它们的方法是所有输入流都可使用的方法。


     InputStream/Reader里包含三个方法:


     1>int read():从输入流读取单个字节/字符,返回所读取的字节/字符数据(字节/字符数据可直接转换为int类型);

     2>int read(byte[]/char[] b):从输入流中最多读取b.length个字节/字符的数据,并将其存储在字节数组/字符数组b中,返回实际读取的字节/字符数。

     3>int read(byte[]/char[] b,int off,int len):从输入流中最多读取len个字节/字符的数据,并将其存储在数组b中,放入数组b中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字节/字符数。


     InputStream实例代码:

public class FileInputStreamTest{public static void main(String[] args) throws IOException{//创建字节输入流FileInputStream fis = new FileInputStream("FileInputStreamTest.java");//创建一个长度为1024的“竹筒”byte[] bbuf = new byte[1024];//用于保存实际读取的字节数int hasRead = 0;//使用循环来重复“取水”过程,每次读取到1024个字节,将其存储在bbuf数组中while ((hasRead = fis.read(bbuf)) > 0 ){//取出“竹筒”中水滴(字节),将字节数组转换成字符串输入!System.out.print(new String(bbuf , 0 , hasRead ));}fis.close();}}

         

     2.输出流:


     ①基类:OutputStream/Writer

     ②模型:把输出设备抽象成一个空的"水桶",输出流是连在这个"水桶"上的"水管",当程序输出时,依次把"水滴"放入到输出流的"水管"中,再保存到空的"水桶"里;

     ③方法:OutputStream和Writer也非常相似,两个流提供了如下三个方法:


     1>void write(int c):将指定的字节/字符输入到输出流中,其中c既可以代表字节,也可以代表字符。

     2>void write(byte[]/char[] buf):将字节数组/字符数组中的数据输出到指定输出流中。

     3>void write(byte[]/char[] buf,int off,int len):将字节数组、字符数组从off位置开始,长度为len的字节/字符输出到输出流中。


     代码示例:

public class FileOutputStreamTest{public static void main(String[] args) throws IOException{FileInputStream fis = null;FileOutputStream fos = null;try{//创建字节输入流fis = new FileInputStream("FileOutputStreamTest.java");//创建字节输入流fos = new FileOutputStream("newFile.txt");byte[] bbuf = new byte[32];int hasRead = 0;//循环从输入流中取出数据while ((hasRead = fis.read(bbuf)) > 0 ){//每读取一次,即写入文件输出流,从bbuf的0处开始写,长度为hasRead写入输出流中fos.write(bbuf , 0 , hasRead);}}catch (IOException ioe){ioe.printStackTrace();}finally{//使用finally块来关闭文件输入流if (fis != null){fis.close();}//使用finally块来关闭文件输出流if (fos != null){fos.close();}}}}

     因为字符流直接以字符为操作单位,所以Writer可以用字符串来代替字符数组,即以String对象作为参数。Writer里还包含如下两个方法:


     1>void write(String str):将str字符串里包含的字符输出到指定输出流中。

     2>void write(String str,int off,int len):将str字符串从off位置开始,长度为len的字符输出到指定输出流中。


     代码示例:

public class FileWriterTest{public static void main(String[] args) throws IOException{FileWriter fw = null;try{//创建字符输出流fw = new FileWriter("poem.txt");fw.write("锦瑟 - 李商隐\r\n"); fw.write("锦瑟无端五十弦,一弦一柱思华年。\r\n");fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\r\n");fw.write("沧海月明珠有泪,蓝田日暖玉生烟。\r\n");fw.write("此情可待成追忆,只是当时已惘然。\r\n");}catch (IOException ioe){ioe.printStackTrace();}finally{//使用finally块来关闭文件输出流if (fw != null){fw.close();}}}}

       二、字节流和字符流

     

     字节流和字符流的用法几乎完全一样,区别如下:

     1.数据单元不同:字节流操作的是8位的字节(byte),而字符流操作的数据单元是16位的字符。

     2.基类不同:字节流InputStream和OutputStream作为基类,字符流已Reader和Writer作为基类。


     三、节点流和处理流


     1.节点流:

     构造参数:IO物理节点

     2.处理流:

     构造参数:已经存在的流


     示例代码:

public class PrintStreamTest{public static void main(String[] args)throws IOException{PrintStream ps = null;try{//创建一个节点输出流:FileOutputStreamFileOutputStream fos = new FileOutputStream("test.txt");//以PrintStream来包装FileOutputStream输出流ps = new PrintStream(fos);//使用PrintStream执行输出ps.println("普通字符串");ps.println(new PrintStreamTest());}catch (IOException ioe){ioe.printStackTrace(ps);}finally{ps.close();}}}

     以上就是关于IO系统中IO流的分类介绍,下一篇博文将继续为大家介绍IO系统的相关内容。  

     

     


     

0 0