zoukankan      html  css  js  c++  java
  • java中IO流的知识点总结

    1.流的概念

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

    2.IO流的分类

    IO流分为字符流和字节流. 
    字符流

    字节流

    3.字节流和字符流的区别

    1.字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。 
    2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

    4.通过代码体现IO流中各种流的方法的使用

    1.用普通字节流复制a文件的内容到b文件中

    public class CopyFileDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("a.txt");
        FileOutputStream fos=new FileOutputStream("b.txt");
    
        //方式一:一次读取写入单个字节
        int i=0;
        while((i=fis.read())!=-1){
            fos.write(i);
        }
        fos.close();
        fis.close();
    
        //方式二:一次读取写入一个字节数组
        byte[] by=new byte[1024];
        int len=0;
        while((len=fis.read(by))!=-1){
            fos.write(by,0,len);
        }
        fos.close();
        fis.close();
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    2.使用高效字符流复制文件

    public class CopyFileDemo3 {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new FileReader("a.txt"));
        //如果d文件中有数据,true表示继续往文件中追加数据
        BufferedWriter bw=new BufferedWriter(new FileWriter("d.txt",true));
    
        String line=null;
        //高效字符输入流的特有方法readline(),每次读取一行数据
        while((line=br.readLine())!=null){
            bw.write(line);
            //高效字符输出流的特有方法newline()
            bw.newLine();
            //将缓冲区中的数据刷到目的地文件中
            bw.flush();
        }
        //关闭流,其实关闭的就是java调用的系统底层资源。在关闭前,会先刷新该流。
        bw.close();
        br.close();
    }
    }
    注:
    a.高效流不能直接对文件进行操作,必须通过普通流操作.高效流是从输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了
    b.字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的,并且可以使用flush方法强制进行刷新缓冲区
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5.转换流

    InputStreamReader 是字节流通向字符流的桥梁 
    OutputStreamWriter 是字符流通向字节流的桥梁 
    转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。 
    转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流

    6.打印流

    PrintWriter 
    PrintStream 
    注: 
    A:只操作目的地,不操作数据源 
    B:可以操作任意类型的数据 
    C:如果启用了自动刷新,在调用println(),printf(),format()方法的时候,能够换行并刷新 
    D:可以直接操作文件

    7.序列化流

    ObjectOutputStream序列化流 
    ObjectInputStream反序列化流 
    序列化:把对象作为一个整体按照流一样的方式传输或者存储。 
    反序列化:把网络中的流数据或者文件中的流数据还原成对象 
    主要方法有: 
    1.Object readObject();该方法抛出异常:ClassNotFountException。 
    2. void writeObject(Object):被写入的对象必须实现一个接口:Serializable,否则就会抛出:NotSerializableException 
    3.如果实现了该接口,想解决黄线问题就生成一个随机的serialVersionUID号码

    8.综合小案例:键盘录入数据保存到文件中

    public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
        //创建键盘录入
        InputStream is=System.in;
        //将字节流转换为字符流
        InputStreamReader isr=new InputStreamReader(is);
        //高效字符流读取数据
        BufferedReader br=new BufferedReader(isr);
        //打印流写入数据,第一个true表示如果文件中有内容就追加数据,第二个true表示启用自动刷新
        PrintWriter pw=new PrintWriter(new FileWriter("a.txt",true),true);
    
        String line=null;
        while((line=br.readLine())!=null){
            if("over".equals(line)){
                break;
            }
            //PrintWriter启用自动刷新
            pw.println(line);
        }
        pw.close();
        br.close();
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    链表
    Wonder团队承接各种Web3D业务
    真我的信息
    一个人独自做长期项目,如何提高工作效率?
    【Java】类的结构
    【长知识】找书攻略
    【长知识】语义化版本控制
    【Java】Debug调试常用技巧
    【Web】Servlet三大作用域、JSP四大作用域
    【Web】Servlet基本概念
  • 原文地址:https://www.cnblogs.com/qy6868668/p/8580294.html
Copyright © 2011-2022 走看看