zoukankan      html  css  js  c++  java
  • java核心学习(十二) IO框架---理解IO流

    一、javaIO的基本模型----IO流(stream)

      javaIO框架把不同的输入、输出源抽象称作stream,所有的可作为输入输出源的存在,不论是物理设备如同键盘、显示器,还是软件比如管道,还是数据结构比如数组,都抽象成为了“流”,java代码通过对流的统一的输入与输出操作,来完成对不同真实设备或者软件的输入输出。在javaIO模型中,每一个软件硬件都可以作为当前java进程的一个输入流或输出流。

      总而言之,“流”的方式允许java程序使用相同的方式来访问不同的输入、输出源

    二、流的分类

        1、输入流:当前进程从中读取数据;输出流:当前进程写入数据(InputStream、OutputStream)

      2、字节流、字符流(Reader、Writer),字符流是特殊的字节流

      3、节点流:又称低级流,指特定节点的流;处理流:高级流,用处理流来包装节点流(装饰器设计模式)。

      普通节点流是一个单位一个单位的读取与写入(一个字符、一个字节),而处理流增加了缓冲可以提高效率,也提供了一系列方法来一次输入输出大批量内容

      但是“流”模型的IO方式说到底还是基于一个"水滴"一个"水滴"的输入与输出,所以效率会低。

      

    • InputStream

      • FileInputStream
      • ByteArrayInputStream
      • FilterInputStream
        • DataInputStream
        • BufferedInputStream
        • LineNumberInputStream
        • PushbackInputStream
      • ObjectInputStream
      • PipedInputStream
      • SequenceInputStream
      • StringBufferInputStream
    • OutputStream

      • FileOutputStream
      • ByteArrayOutputStream
      • FilterOutputStream
        • DataOutputStream
        • BufferedOutputStream
        • PrintStream
      • ObjectOutputStream
      • PipedOutputStream

      上面两颗树,根节点是两个抽象父类,第一层叶子结点都是节点流,第一层非叶子节点是过滤流(处理流)父类,第二层叶子节点是过滤流,过滤流都继承自FilterXxxXxxx

    三、用一用

      1、输入流InputStream 和 Reader

      read 方法返回值是读取的字节数

    package IOTest;
    
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class FileInputStreamTest {
        public static void main(String[] args) throws IOException{
            //创建字节输入流
            InputStream fis = new FileInputStream("./src/main/java/IOTest/FileInputStreamTest.java");
            //创建一个1024的byte数组用来保存读取的数据
            byte[] bbuf = new byte[1024];
            while (fis.read(bbuf) > 0){
                System.out.println(new String(bbuf));
            }
            fis.close();
        }
    }

      输出

      2、OutputStream

      

    package IOTest;
    
    import javax.wsdl.Input;
    import java.io.*;
    
    public class FileOutputStreamTest {
        public static void main(String[] args){
            try (
                    OutputStream fos = new FileOutputStream("newFile.txt");
                    InputStream fis = new FileInputStream("./src/main/java/IOTest/FileInputStreamTest.java");
                    ){
                byte[] bbuf = new byte[30];
                while (fis.read(bbuf) > 0){
                    fos.write(bbuf);
                    System.out.println(new String(bbuf));
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

        但是输出的文件变成这样

       这是因为bbuf数组大小为30,数组靠后的部分在最后一次循环中没有被覆盖上次循环所存的内容,所以会出现最后一行的乱入。

      3、处理流实例 PrintStreamTest

    //只需要在打开流的时候将节点流包装为处理流
    FileOutputStream fos = new FileOutputStream("xxx.txt");
    PrintStream ps=  new PrintStream(fos);
    //PrintStream的输出功能很强,若要输出文本最好用PrintStream
    ps.println("xxx");
    ps.println(new Xxx());
  • 相关阅读:
    oo——第三单元总结
    oo第三单元总结
    【BUAA软工】提问回顾与个人总结
    【BUAA软工】HTTP协议前后端实现及实战北航云盘爬取
    【BUAA软工】软件案例分析
    【BUAA软工】结对编程作业
    【BUAA 软工个人项目作业】玩转平面几何
    【BUAA 软工博客作业】个人博客作业
    【BUAA 软工热身作业】继往开来,勇攀高峰
    BUAA-OO-第四单元总结——终章
  • 原文地址:https://www.cnblogs.com/Theshy/p/7516149.html
Copyright © 2011-2022 走看看