J2SE系列之IO流(不断更新)

来源:互联网 发布:兼职插画知乎 编辑:程序博客网 时间:2024/06/07 21:50

写了这么几年java了,好多东西天天在用,但是没有系统的总结,因此应该把所学所用的东西多总结一下了,这是java基础系列的J2SE部分


java的io部分主要的类或接口如下:

从上表可以看出主要有字节,字符,输入,输出,文件这几类,然后组合成 字节(字符)输入流字节(字符)输出流,文件的输入输出均为随机存取文件类


字节流和字符流的区别

1.字节流单位为一个字节,字符流单位为一个Unicode码的长度,即2个字节长度,支持多国文字,因此若流要跨越多种平台传输,应使用字符流。

2.字节流无缓存,字符流有缓存。

3.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串。

4.字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

5.字节流直接操作文件,字符流操作缓冲区。

6.字节流使用后不许要关闭(最后关闭),而字符流必须关闭,否则会导致不能讲字符流中的内容全部读写。


字节流的输入与输出关系:


字符流的输入输出关系如下:


字节流与字符流之间的转换:

1、从字节流到字符流:InputStreamReader、OutputStreamWriter类可以实现。
 
2、从字符流到字节流:可以从字符流中获取char[]数组,转换为String,然后调用String的API函数getBytes() 获取到byte[],然后就可以通过ByteArrayInputStream、ByteArrayOutputStream来实现到字节流的转换。

IO流相关的特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):

首先,考虑最原始的数据格式是什么: 原则四

第二,是输入还是输出:原则五

第三,是否需要转换流:原则六第 1 点

第四,数据来源(去向)是什么:原则一

第五,是否要缓冲:原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)

第六,是否要格式化输出:原则二



java的IO相关类的父子关系如下:


java io流操作流程:

JavaIO操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:

使用File类打开一个文件

通过字节流或字符流的子类,指定输出的位置

进行读/写操作

关闭输入/输出

IO操作属于资源操作,一定要记得关闭



例子:

读取文件,生成字节流,转换为字符流

/** * 保证按照 行 的 顺序得到文件的每一行数据 * @param fileName 文件名(路径) * @return list */public static List<String> readFile(String fileName){if(fileName==null){log.info("输入的文件地址为空  : 请输入正确的地址");return null;}List<String> result = new LinkedList<String>();BufferedReader reader = null;try {    File file = new File(fileName);    if(file!=null&&file.exists()){    //1.生成自己流,并使用buffer提高性能    BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));    //2.转换为字符流,使用5M的缓冲    reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),5*1024*1024);String tmp = null;int i=0;//3.读取while((tmp = reader.readLine())  != null){    result.add(i++, tmp.trim());}//4.关闭reader.close();reader = null;    }else{    log.info(fileName+"  文件不存在  , 返回文件为空------");    }    } catch (IOException e) {log.error("read file [" + fileName + "] fail!");}finally{if(reader!=null){try {reader.close();} catch (IOException e) {e.printStackTrace();reader = null;}reader = null;}}return result;}






参考资料:

字节流与字符流的区别详解

http://blog.sina.com.cn/s/blog_4080505a0101hff1.html

java 字节流与字符流的区别

http://blog.csdn.net/cynhafa/article/details/6882061

字节流与字符流转换

http://www.blogjava.net/yxhxj2006/archive/2013/08/08/402590.html

字节流和字符流的相互转换

http://www.cnblogs.com/hnrainll/archive/2012/03/22/2412455.html

字符流转换为字节流

http://blog.csdn.net/nercon233/article/details/3110004

Java IO流学习总结

http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html

0 0
原创粉丝点击