4.Java IO

文章目录


前言

4.Java IO

一、字符流

数据流中最小的数据单元是字节。
Java 中的字符是 Unicode 编码,一个字符占用两个字节。所以字符流以两个字节(即 2 byte,16 bit)作为一个数据单元。字符流主要用于纯文本文件的读取和写入

1. CharArrayReader、CharArrayWriter

import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;

/**
 * @author Mr.Guo
 * @date 2021/2/8 下午5:25
 */
public class ChatIoTest {
    public static void main(String[] args) {
        CharArrayReader reader = new CharArrayReader("大家好,我是码农蝈蝈。".toCharArray());
        CharArrayWriter writer = new CharArrayWriter();
        try {
            int c = -1;
            while ((c = reader.read()) > -1) {
                System.out.println((char) c);
                writer.write(c);
            }
            System.out.println(new String(writer.toCharArray()));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            reader.close();
            writer.close();
        }

    }
}

2. StringReader、StringWriter

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * @author Mr.Guo
 * @date 2021/2/8 下午4:41
 */
public class IoTest {
    public static void main(String[] args) throws IOException {
        StringReader stringReader = new StringReader("大家好,我是码农蝈蝈。");
        StringWriter stringWriter = new StringWriter();
        try {
            int c = -1;
            while ((c = stringReader.read()) > -1) {
                System.out.println((char) c);
                stringWriter.write(c);
            }
            System.out.println(stringWriter.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            stringReader.close();
            stringWriter.close();
        }
    }
}

3. InputStreamReader、OutputStreamWriter

import java.io.*;

/**
 * @author Mr.Guo
 * @date 2021/2/9 上午8:32
 */
public class FileIoTest {
    public static void main(String[] args) {
        InputStreamReader reader = null;
        OutputStreamWriter writer = null;
        FileInputStream inputStream = null;
        FileOutputStream outputStream = null;
        try {
            File file;
            inputStream = new FileInputStream("/work/test.txt");
            reader = new InputStreamReader(inputStream);

            outputStream = new FileOutputStream("/work/test_.txt");
            writer = new OutputStreamWriter(outputStream);

            int c = -1;
            while ((c = reader.read()) > -1) {
                writer.write(c);
            }
            writer.flush();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != inputStream) {
                    inputStream.close();
                }
                if (null != reader) {
                    reader.close();
                }
                if (null != outputStream) {
                    outputStream.close();
                }
                if (null != writer) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4. FileReader、FileWriter

        try {
            FileReader fileReader = new FileReader("/work/test.txt");
            FileWriter fileWriter = new FileWriter("/work/test__.txt");

            int c = -1;
            while ((c = fileReader.read()) > -1) {
                fileWriter.write(c);
            }
            fileWriter.flush();

            fileReader.close();
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

5. BufferedReader、BufferedWriter

BufferedReader比上面几种高级的地方在于,上面的几种方式只能能一次读取一个字符,或者一个字符数组。而BufferedReader还能一次读取一行字符串。同时BufferedReader带缓冲,会比前面几种方式快很多。

import java.io.*;

/**
 * @author Mr.Guo
 * @date 2021/2/9 上午10:04
 */
public class BufferIoTest {
    public static void main(String[] args) {
        BufferedReader reader = null;
        BufferedWriter writer = null;
        try {
            reader = new BufferedReader(new FileReader("/work/test.txt"));
            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/work/buffer.txt")));
            if (reader.ready()) {
                String line = null;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                    writer.write(line);
                    writer.newLine();
                }
                writer.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != reader) {
                    reader.close();
                }
                if (null != writer) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

二、字节流

字节流以一个字符(即 1 byte,8 bit)作为一个数据单元。
字节流和字符流的使用方式基本一样,唯一的区别就是不能使用char和char[]接收,要使用byte和byte[]用来接收数据。

1. ByteArrayInputStream、ByteArrayOutputStream

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * @author Mr.Guo
 * @date 2021/2/9 上午11:02
 */
public class ByteIoTest {
    public static void main(String[] args) {
        ByteArrayInputStream inputStream = new ByteArrayInputStream("大家好,我是码农蝈蝈。".getBytes());
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            int c = -1;
            while ((c = inputStream.read()) != -1) {
                outputStream.write((byte) c);
            }
            System.out.println(outputStream.toString());
        } finally {
            try {
                inputStream.close();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2. FileInputStream、FileOutputStream

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author Mr.Guo
 * @date 2021/2/9 上午11:17
 */
public class FileByteIoTest {
    public static void main(String[] args) {
        FileInputStream inputStream = null;
        FileOutputStream outputStream = null;

        try {
            inputStream = new FileInputStream("/work/test.zip");
            outputStream = new FileOutputStream("/work/copy.zip");

            byte[] bytes = new byte[1024];
            while (inputStream.read(bytes) != -1) {
                outputStream.write(bytes);
            }
            outputStream.flush();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != inputStream) {
                    inputStream.close();
                }
                if (null != outputStream) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

3. PipedInputStream、PipedOutputStream

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.Random;

/**
 * @author Mr.Guo
 * @date 2021/2/9 下午1:32
 */
public class PipedIoTest {
    PipedInputStream pis = new PipedInputStream();
    PipedOutputStream pos = new PipedOutputStream();

    public static void main(String[] args) throws IOException {
        PipedIoTest piped = new PipedIoTest();
        piped.connect();
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    byte[] bytes = new byte[1024];
                    try {
                        int len;
                        while ((len = piped.pis.read(bytes)) != -1) {
                            System.out.println("len=>" + len);
                            System.out.println(">>>>>>>>>>>>" + new String(bytes));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                while (true) {
                    String tempStr = System.currentTimeMillis() + "" + new Random().nextInt(100000);
                    try {
                        piped.pos.write(tempStr.getBytes());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    public void connect() throws IOException {
        pis.connect(pos);
    }

}

各位,piped可以实现线程直接的通信哦~

上一篇:MR自定义OutputFormat


下一篇:Netty线程模型