美文网首页
JAVA IO流相关内容总结

JAVA IO流相关内容总结

作者: 橘子炒年糕 | 来源:发表于2019-05-15 19:29 被阅读0次

    最近刚看完b站上高淇老师的java300集教程,中间IO流那趴尤其云里雾里,前前后后看了几遍又对比了代码,IO流这部分的知识点差不多在脑子里也形成了一个体系,下面就总结一下教程中166到193讲的IO流部分的内容,就是我对这部分知识的理解。

    首先IO流有三种分类:第一,输入流,输出流。这就很好理解,就是从程序的角度看,获得信息就是输入,给出信息就是输出;第二,字节流,字符流。字节流就是二进制的存储方式,可以处理一切文件,而字符流就只能处理纯文本;第三,节点流,处理流。节点流就是直接代表信息的源头,而处理流只能起到增强功能,所以必须包裹节点流才行。

    IO流中有两个重要的抽象类,InputStream和OutputStream,他们是字节流,也就是用byte处理数据。一种具体实现有FileInputStream和FileOutputStream,这里的File代表着一个源头或目的地的意思,就是从文件读或写入文件。举个栗子:

    // 从文件读取

    File src = new File("e:/a.txt");

    InputStream is = new FileInputStream(src);

    byte[] flush = new byte[1024];

    int len = 0;

    while(len=is.read(flush)!=-1){

        String info = new String(flush, 0, len);

    }

    // 写入文件

    OutputStream os = new FileOutputStream(f, true);

    byte data = "some information".getBytes();

    os.write(data);

    os.flush();

    os.close();

    这里的FileInputStream和FileOutputStream是字节流,所以读取和写入都用了byte数组。另外,在读取时,采用了分段读取的方法,就是一部分一部分地读进flush中。

    另外还有就是字符流,读纯文本的,Reader和Writer,实现类FileReader和FileWriter。具体方法找API吧,反正都是read write这种方法。

    处理流,BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter。这些是要包在节点流外面的,起到一种提高性能的效果。还有另外一个处理流,转换流,起到解码,编码的作用,能字符流和字节流相互转换。InputStreamReader和OutputStreamWriter。

    其他的一个节点流,ByteArrayInputStream和ByteArrayOutputStream。这里ByteArray和File那对的命名有一定区别,比如FileOutputStream是指输出到File上,而ByteArrayOutputStream是指把ByteArray写到OutputStream上,就是ByteArray是被操作的对象,而File是目的地,这里很容易搞晕。这个节点流和上面一样,用分段读取的方法来操作,举个栗子,分析这个题目,把文件中的一张图,写到byte数组中:从程序的角度看,首先我们要把图读到程序中,就是输入,从文件,那就是FileInputStream;接下来,把程序中的内容,写出去,就是输出,到byte数组,就是ByteArrayOutputStream,大致相关的代码如下,省略了异常还有声明等部分:

    InputStream is = new FileInputStream(new File("..."));

    OutputStream os = new ByteArrayOutputStream();

    while(len=is.read(flush)!=-1){

        os.write(flush, 0, len);

    }

    os.flush();

    return os.toByteArray();

    还有两种处理流,DataInputStream, DataOutputStream和ObjectInputStream, ObjectOutputStream。对命名的理解和ByteArray是一样的,就是被操作的对象是什么类型。其中一个很重要的应用就是序列化反序列化。把object写到流中再读出来,深克隆就用了这个操作。因为这俩是处理流,所以需要包裹节点流。举一个序列化反序列化的例子,把object写到流中,即输出,用ObjectOutputStream,因为要包裹OutputStream,所以还要用到ByteArrayOutputStream;之后,把流中的object读到程序里,即输入,用ObjectInputStream,要包裹InputStream,所以还要用到ByteArrayInputStream。代码:

    // 写到流中

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    ObjectOutputStream oos = new ObjectOutputStream(baos);

    oos.writeObject(obj);

    // 从流中读

    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

    ObjectInputStream ois = new ObjectInputStream(bais);

    return ois.readObject();

    相关文章

      网友评论

          本文标题:JAVA IO流相关内容总结

          本文链接:https://www.haomeiwen.com/subject/cqvmaqtx.html