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();
        }
    }
}

 

posted @ 2021-01-14 16:11  码在江湖  阅读(446)  评论(0编辑  收藏  举报