IO流(一)IO流概述以及字节流使用

IO流(一)IO流概述以及字节流使用

IO流的主要作用:主要是为了操作读取计算机中的文件进行读取,操作,写入,生成新的文件。

其中根据数据流向分为输入流和输出流。
也可根据数据的传输单位分为字节流(InputStream 和OutputStream)和字符流。(Reader和 Writer)
字节流直接操作文件本身,没有使用缓冲区(硬盘中所有的文件都是以字节的方式存在的,字符只存在于内存中)

最常用的FileInputStream和FileOutputStream 访问文件,实现对文件的读写操作
结合ObjectOutputStream 和 ObjectInputStream 实现一下简单将对象写入文件,和从文件中读取对象

    public static void main(String[] args) throws IOException {
        testIO();
    }
    @Data
    @Accessors(chain = true)
    private static class TestIoObject implements Serializable {
        private Integer objectId;
        private String objectName;

        @Override
        public String toString() {
            return "TestIoObject{" +
                    "objectId=" + objectId +
                    ", objectName='" + objectName + '\'' +
                    '}';
        }
    }
    private static void testIO() throws IOException {
        //在E盘testOutput文件夹下创建output.txt文本文件
        String fileAddress = "E:\\testOutput\\output.txt";
        //获取输出文件流
        FileOutputStream fileOutputStream = new FileOutputStream(fileAddress);
        //文件作为写入目标地址
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        //新建对象
        TestIoObject testObject = new TestIoObject().setObjectId(1)
        .setObjectName("对象1");
        //写入对象,流对象写入
        objectOutputStream.writeObject(testObject);

        //获取读取文件流
        FileInputStream fileInputStream = new FileInputStream(fileAddress);
        //文件作为读取目标地址
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        TestIoObject testIoObject = null;
        try {
            //读取文件中的对象
            testIoObject = (TestIoObject) objectInputStream.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(testIoObject);
    }

输出读取文件对象结果:
在这里插入图片描述

ByteArrayInputStream和ByteArrayOutputStream 字节数组处理流,在内存中建立一个缓冲区作为流使用,从缓存区读取数据比从存储介质(如磁盘)的速率快。相较于fileInputStream和FileOutputStream的数据来源是真实文件,那么ByteArrayInputStream和ByteArrayOutputStream的数据来源是来做电脑的内容中的东西,可以是“abc”,也可以是123,数组,对象…速度快,不建议量太大占用过多内存。

PipedInputStream和PipedOutputStream 管道流,适用在两个线程中传输数据,一个线程通过管道输出流发送数据,另一个线程通过管道输入流读取数据,实现两个线程间的数据通信

和NIO中的channel(通道)差不多,但是channel是双向通道可读可写,管道流是单向的(读写功能固定)

NIO入口待开放:链接地址。。。。

SequenceInputStream 用于合并文件流,将小文件合并为一个大文件。

 String fileAddress = "E:\\testOutput\\output.txt";
        InputStream s1 = new FileInputStream(fileAddress);
        InputStream s2 = new FileInputStream(fileAddress);
        //合并两个inputStream并输出到outputSequence.txt中
        SequenceInputStream sis = new SequenceInputStream(s1, s2);
        InputStreamReader isr = new InputStreamReader(sis);
        BufferedReader br = new BufferedReader(isr);
        BufferedWriter bw = new BufferedWriter(
        					new FileWriter("E:\\testOutput\\outputSequence.txt"));
        String line = null;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        s1.close();
        s2.close();
        br.close();
        bw.close();      

待整理:
FilterInputStream和FilterOutputStream 用于装饰Stream(装饰者设计模式),他如下四个子类用于补充功能

1.DataInputStream和DataOutputStream :用于装饰输入流的格式不同,可以输入不同的格式,并对应的读取流中的该格式的数据。

//输出流写入double类型数据、long类型,String类型(所有的基本数据类型)
 dataOutputStream.writeDouble(dounbleNum);
 dataOutputStream.writeLong(longNum);
 dataOutputStream.writeUTF(string);
//对应类型读取
dataInputStream.readDouble();
dataInputStream.readLong();
dataInputStream.readUTF();

2.BufferedInputStream和BufferedOutputStream :是带缓冲区的输入输出流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能;
可以结合DataInputStream和ByteArrayInputStream一起使用

public static void main(String[] args) throws IOException {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        DataOutputStream dataOutputStream = 
        new DataOutputStream(new BufferedOutputStream(os));
        dataOutputStream.writeUTF("abc");
        dataOutputStream.flush();
        dataOutputStream.close();
        byte[] src =os.toByteArray();
        os.close();
        DataInputStream dataInputStream =
                new DataInputStream(new BufferedInputStream
                (new ByteArrayInputStream(src)));
        String string = dataInputStream.readUTF();
        dataInputStream.close();
        System.out.println(string);
    };

3.PushBackInputStream 推回输入流:
用于截取一些标识字符串,对流进行处理。

String str = "abc-123456-";
        PushbackInputStream push = new PushbackInputStream(
        new ByteArrayInputStream(str.getBytes()));
        System.out.print("输出:");
        int temp = 0;
        while ((temp = push.read()) != -1) {  // 读取内容
            // 判断是否读取到了“.”
            if (temp == '-') {
                // 放回到缓冲区之中
                push.unread(temp);
                //读取剩余的除了'-'符号的
                temp = push.read();
                System.out.print("(拿到了符号" + (char) temp + ")");
            } else {
                System.out.print((char) temp);  // 输出内容
            }
        }
        push.close();

!](https://img-blog.csdnimg.cn/20201119145209312.png#pic_center)

PrintStream 打印流,System.out 就是一个PrintStream。

 PrintStream printStream = System.out;
 printStream.println(12313);

字节流的输入流(InputStream)和输出流OutputStream的类继承图
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值