zoukankan      html  css  js  c++  java
  • Java I/O常用的类结构图

    今天读了《Thinking in Java》中的I/O流的章节,整理了下关于I/O流常用的一些类,类图如下:

    常用的类大概就是这些,接下来简单的说下这些类的作用,关键的类我会加上代码的实例:

    一、先说Java1.0的InputStream和outputStream

    这两个类不多说,就是抽象父类。

    1、FileInputStream和FileOutputSteam

    文件的写入和读出,主要结合BufferedInputStream和BufferedOutputStream使用。

    2、ByteArrayInputStream和ByteArrayOutputSteam

    主要是对字节数组进行的操作下面是一个实例,结合DataInputStream的使用

    package com.example.io.demo.readerTest;
    
    
    import java.io.*;
    
    /**
     *  @Author: caesar
     *  @Date:2021年01月13日 20:01:03
     *  @Description:
     */
    public class Test4 {
        public static void main(String[] args) throws IOException {
            DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(new ByteArrayInputStream("This is a dog!!!".getBytes())));
            while (dataInputStream.available() != 0){
                System.out.println((char)dataInputStream.readByte());
            }
            dataInputStream.close();
        }
    }

    3、StringBufferInputSream已经弃用

    4、PipedInputSteam和PipedOutputSteam

    主要用于两个线程之间来传递数据,尽量不要使用单个线程来操作管道流,容易出现死锁。

    package com.example.io.demo.writetest;
    
    import java.io.IOException;
    import java.io.PipedInputStream;
    import java.io.PipedOutputStream;
    
    /**
     * @Author: caesar
     * @Date:2021年01月14日 09:01:38
     * @Description: 管道流
     * 官方说明不建议使用单个线程,可能会死锁。所以在实际开发过程中要注意尽量不要写在单个线程中。
     *
     * 另外在jdk1.1中还出现了另外两个管道流:PipedReader和PipedWriter
     *
     * 这两个流是用来传递字符的。在使用范围上只能传递文本文件。不能用来传递多媒体文件。
     * 如果单线程操作,会出现死锁的情况,也就是notifyAll()和wait()循环执行
     */
    public class Test4 {
        static class Receiver implements Runnable {
            private PipedInputStream pipedInputStream;
    
            public Receiver() {
                this.pipedInputStream = new PipedInputStream();
            }
    
            public PipedInputStream getPipedInputStream() {
                return pipedInputStream;
            }
    
            @Override
            public void run() {
                byte[] b = new byte[1024];
                int length;
                try {
                    while ((length = pipedInputStream.read(b)) != -1) {
    
                        System.out.println(new String(b,0,b.length));
    
                    }
                } catch (IOException io) {
                    System.out.println(io.getMessage());
                }
            }
        }
    
        static class Send implements Runnable {
            private PipedOutputStream pipedOutputStream;
    
            public Send() {
                pipedOutputStream = new PipedOutputStream();
            }
    
            public PipedOutputStream getPipedOutputStream() {
                return pipedOutputStream;
            }
    
            String s = "This is a luck dog!!!";
    
            @Override
            public void run() {
                try {
                    pipedOutputStream.write(s.getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) throws IOException {
            Send send = new Send();
            Receiver receiver = new Receiver();
            // 连接管道流
            send.getPipedOutputStream().connect(receiver.getPipedInputStream());
            // 开启线程
            new Thread(send).start();
            new Thread(receiver).start();
        }
    }

    5、BufferedInputStream和BufferedOutputSteam

    主要是缓冲流,先写道缓冲区,可以提升读取和写入的速度,使用广泛,作为装饰者类,可以配合其他的类进行使用

    6、DataInputSteam和DataOutputSteam

    平台编码不一致的问题,但是必须按照数据存放的位置,来进行读取。。。

    package com.example.io.demo.writetest;
    
    import java.io.*;
    
    /**
     *  @Author: caesar
     *  @Date:2021年01月14日 09:01:20
     *  @Description: 平台编码不一致的问题,但是必须按照数据存放的位置,来进行读取。。。
     */
    public class Test3 {
        // 数据的存储和恢复
        public static void main(String[] args) throws IOException {
            DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("G://Test/test.txt")));
            dataOutputStream.writeDouble(3.1415926);
            dataOutputStream.writeUTF("This is a good boy!!!");
            dataOutputStream.writeDouble(1.23456789);
            dataOutputStream.writeUTF("This is a dog!!!");
            dataOutputStream.close();
            DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream("G://Test/test.txt")));
            System.out.println(dataInputStream.readDouble());
            System.out.println(dataInputStream.readUTF());
            System.out.println(dataInputStream.readDouble());
            System.out.println(dataInputStream.readUTF());
        }
    }

    二、Java1.1的Reader和Writer

    其他的和上面的类都有对应,我说一下特有的,比如说

    1、StringReader、StringWriter和PrintWriter(其实也有PrintSteam,在此也说一下)

       StringReader和StringWriter就是字符串的读取和写入,PrintWriter可以在写入时候,添加内容。

      

    package com.example.io.demo.writetest;
    
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.StringReader;
    
    /**
     *  @Author: caesar
     *  @Date:2021年01月13日 21:01:09
     *  @Description: PrintWriter简单实现
     */
    public class Test2 {
        public static void main(String[] args) throws IOException {
            BufferedReader bufferedReader = new BufferedReader(new StringReader("This is a cat!!!"));
            PrintWriter printWriter = new PrintWriter("G://Test/test2.txt");
            int line = 1;
            String s;
            while ((s = bufferedReader.readLine()) != null){
                printWriter.println("第" + (line++) + "行:"+s);
            }
            printWriter.close();
            bufferedReader.close();
        }
    }

    补充:

    标准I/O

    System.in:没有被包装过的InputStream

    System.out、System.err:被PrintStream包装过的OutputStream

    InputStreamReder,outputStream转换流:

    Scanner中就有System.in的转换流,转化为了Reader,PrintStream中也有转化流转化为了Writer

    来看一个我们自己使用的转化流,其实和Scanner类似,只不过,咱可以判断,输入的为空就跳出:

    package com.example.io.demo.writetest;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Scanner;
    
    /**
     * @Author: caesar
     * @Date:2021年01月14日 16:01:25
     * @Description: 转换流的使用
     */
    public class Test5 {
        public static void main(String[] args) {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String s;
            try {
                while ((s = bufferedReader.readLine()) != null && s.length() != 0) {
                    System.out.println(s);
                }
            } catch (IOException io) {
                System.out.println(io.getMessage());
            }
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    butter
    医院设置
    NOIP 2000 进制转换
    图的M 着色问题
    闭合区域面积统计
    字符序列
    装载问题
    n皇后问题
    跳马问题
    数独
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/14277846.html
Copyright © 2011-2022 走看看