java IO流小结

小白程序员 2016-11-30

一周没有写文章了,对不住大家,工作忙的晕头转向,以后会加快写文章的频率。

首先,介绍一下流的概念:

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

IO流的分类:

根据处理数据类型的不同分为:字符流和字节流

根据数据流向不同分为:输入流和输出流

刚刚接触io流的同学们可能不太懂输入流和输出流的概念,大家请看图:

java IO流小结流的输入输出是相对于你的程序说的,也就是站在程序的方向看输入还是输出,这样就好理解了,inputStream(字节输入流:向程序里读),Reader(字符输入流:向程序里读),outputStream(字节输出流:向程序外写),Writer(字符输出流:想程序外写)

那么什么时候用字符流和字节流呢:

字符流只能对文本文件进行读取, 他比字节流对文本文件的操作效率高

字节流主要是对非文本文件(如一些媒体文件 :图片,电影,音乐等)进行操作的

注意:字节流可以对所有类型的文件进行操作。

如果用字节流操作文本文件,没有字符流操作文本文件 效率高。

下面的图是网上的流类图结构:

java IO流小结通过图我们可以看到基本上Reader,Writer,InputStream,outputStream就可以把这些都概括了

  1. 输入字节流:inputStream

    inputStream是所有输入字节流的父类,他是一个抽象类,像BufferedInputStream和DataInputStream等都是装饰类(这也是装饰者模式的典型应用:能大大提高侠侣,增加缓冲功能,和对多数据的支持)

  2. 输出字节流:outputStream

    outputStream是所有输入字节流的父类,他是一个抽象类,像BufferedOutputStream和DataOutputStream等都是装饰类(同上这也是装饰者模式的典型应用:能大大提高侠侣,增加缓冲功能,和对多数据的支持)

  3. 字符输入流:Reader

    Reader 是所有的输入字符流的父类,它是一个抽象类。CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。下面重点介绍一下inputStreamReader。

    InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。

  4. 字符输出流:Writer

    Writer 是所有的输出字符流的父类,它是一个抽象类。其他类的功能同上,OutputStreamWriter 是OutputStream 到Writer 转换的桥梁。

基础知识就讲到这,下面写示例操作演示:

字节流:

/**

* 文件复制(为了方便大家观看我直接把异常抛出了)

* 字节流

* @author 小白程序员

*

*/

public class StreamTest {

public static void main(String[] args) throws IOException {

String InFilePath = "E://InFileTest.txt";// 源文件

String OutFilePath = "E://OutFileTest.txt"; // 目标文件

InputStream in = new FileInputStream(InFilePath);

OutputStream out = new FileOutputStream(OutFilePath);

System.out.println("以字节为单位读取文件内容");

int tempbyte;

// 我们把InFileTest.txt文件里的文字按照字节的方式写到OutFileTest.txt中

// 数字、字母等符号都是字符,字符只占一个字节,汉字占两个,这么读汉字会乱码

while ((tempbyte = in.read()) != -1) {

out.write(tempbyte);

}

in.close();// 流用完必须关闭

out.close();

System.out.println("文件复制完毕!!!");

}

}

字符流:

/**

* 文件复制(为了方便大家观看我直接把异常抛出了)

* 字符流

* @author 小白程序员

*

*/

public class test {

public static void main(String[] args) throws IOException {

String InFilePath = "E://InFileTest.txt";// 源文件

String OutFilePath = "E://OutFileTest.txt"; // 目标文件

BufferedReader in = new BufferedReader(new FileReader(InFilePath));

BufferedWriter out = new BufferedWriter(new FileWriter(OutFilePath));

System.out.println("以字符为单位读取文件内容");

String tempbyte = null;

// 我们把InFileTest.txt文件里的文字按照字符的方式写到OutFileTest.txt中

while ((tempbyte = in.readLine()) != null) { // 按照行读取

out.write(tempbyte);

out.newLine();// 读完一行换行

}

in.close();// 流用完必须关闭

out.close();

System.out.println("文件复制完毕!!!");

}

}

由于时间的关系多余的例子我就不写了,大家可以自己试试,下一篇文章我会写nio 的东西,这个可是好东西,对提升io性能有很大的帮助,如果大家觉得我写的还不错,请关注,后续会为大家奉上更精彩的文章。

相关