Java基础 -- IO流

IO流

1.概念

  1. 流:数据传输通道

  2. 模型:采用Decorator装饰者模式。依照功能可以对流进行分类。

2.分类

  1. 按数据流方向:

    • 输入流
    • 输出流
  2. 按传输类型:

    这4种均是抽象流,为所有IO流的超类

    • 字节流(用来处理图像,视频,PPT,Word)
      • Reader
      • Writer
    • 字符流(只能处理纯文本)
      • InputStream
      • OutputStream

    字符字节流区别:

    • 字节输出流没有缓冲区,直接输出,字符流必须经过缓冲区,正常情况下只有调用close()才会输出,否则需要手动调用flush()才可输出

      字节 字符
      读写单位 Byte 字符(根据码表映射)
      处理对象 视频,图片 纯文本(优先考虑
  3. 按功能:

    • 节点流:特定节点读取数据的过程
    • 处理流:连接和封装一个已存在的流,通过该封装流调用实现数据读写。ep:BufferedReader。处理流的构造方法传入一个流对象作参数。
  4. 字符流:Java中采用Unicode标准,字符流指基于字节流读取查询对应的Unicode表。

3.特性

  1. FIFO,先写入的数据也先被读取
  2. 顺序存取,不可随机访问。(RandomAccessFile可从任意位置访问IO,此类继承自Object)
  3. 只读/只写,流只有一种功能,传输通道同时存在需要两个流。

4.五类一接口

Java.io包:

    • File:文件特征与管理,对文件系统中文件以及文件夹进行封装的对象,可通过对象的思想操作文件和文件夹,保存文件或目录的元数据信息,包括文件名,文件大小,最后修改时间,是否可读,获取文件路径,判断文件是否存在,获取当前文件列表,创建/删除文件或目录

    • InputStream

    • OutputStream

    • Reader

    • Writer

      RandomAccessFile:随机文件操作

  • 接口:Serializable

5.IO流对象

6.System类

输入输出 读取方式
System.out(标准输出) 显示器
System.err(标准错误输出) 显示器
System.in(标准输入) 键盘输入

7.Scanner

//字节流套接
Scanner(InputStream source)
//字符流套接
Scanner(Readable source)

8.序列化

  1. 序列化:具体对象数据 --> 二进制数据

    • 实现方法:java.io.Serializable
  2. 反序列化:二进制数据 --> 具体对象数据

    • 实现方法:Object readObject()方法从ObjectInputStream读取对象
    • 基本类型和String默认都实现了这个接口,所以不需要处理。

    • 类中的一个属性不参与序列化:transient,表示标记的属性不参与序列化。

      transient关键字:某些属性不需要保存。

      private transient String name;
      
    • static定义的变量也不参与序列化。

  3. 标记接口:Serializable,Cloneable.

    只定义了一种功能,没有具体内容。它的功能由JVM实现。

优先使用的:

输入流 输出流
字节流 Scanner(首选 printStream(打印流)
字符流 BufferReader(次选,缓冲流) printWriter(打印流)
Scanner简单不赘述
BufferedReader
  1. 单字符
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BRRead {
    //单字符读写
    public static void main(String[] args) throws IOException {
        char c;
        //使用System.in创建BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("输入'q'退出:");
        /*读取:读取一个字符使用read()方法
            int read() throws IOException
         */
        do{
            c = (char)br.read();
            System.out.println("退出");
        }while(c != 'q');
    }

}
  1. 字符串

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class BRReadLine {
        //多字符读取
        public static void main(String[] args) throws IOException {
            String str;
            //System.in创建BufferedReader
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入一行字符如'end'来结束");
            /*读取一行字符
                String readLine() throws IOException
             */
            do{
                str = br.readLine();
                System.out.println("您输入了一行字符,已退出");
            }while(!str.equals("end"));
        }
    }
    
    
  2. FileInputStream

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class Fileinputstream {
        public static void main(String[] args) throws IOException {
            int i = 0;
            FileInputStream fi = null;
            try {
                fi = new FileInputStream("C:\\Users\\Administrator\\Desktop\\a.txt");
            } catch (FileNotFoundException e) {
                System.out.println("找不到文件");
                System.exit(-1);
            }
    
            try {
                int num = 0;//计数
                while((i=fi.read()) != -1){
                    System.out.println((char)i);
                    num++;
                }
                fi.close();
                System.out.println("传输个数:"+num);
            } catch (IOException e) {
                System.out.println("读取文件错误");
            }
        }
    }
    
  3. FileOutputStream

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Fileoutputstream {
        public static void main(String[] args) throws IOException {
            int i = 0;
            FileInputStream fi = null;
            FileOutputStream fo = null;
            try {
                fi = new FileInputStream("C:\\Users\\Administrator\\Desktop\\a.txt");
                fo = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\b.txt");
                while((i=fi.read())!=-1){
                    fo.write(i);
                    System.out.println((char)i);
                }
                fi.close();
                fo.close();
                System.out.println("文件已复制");
            } catch (IOException e) {
                System.out.println("文件复制错误");
                System.exit(-1);
            }
        }
    }
    
  4. Reader,Writer

    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class Filereaderwriter {
        public static void main(String[] args) throws IOException {
            int i = 0;
            try {
                FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\a.txt");
                FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\c.txt");
                while((i=fr.read())!=-1){
                    fw.write(i);
                    System.out.println((char)i);
                }
                fr.close();
                fw.close();
            } catch (IOException e) {
                System.out.println("文件复制错误");
            }
        }
    }
    
posted @ 2020-06-21 22:45  一个慵懒的人  阅读(105)  评论(0编辑  收藏  举报