Java基础 -- IO流

Java基础 -- IO流

Java中流可以理解为数据的序列:输入流用于从origin侧读取数据;输出流用于向destination侧写入数据。换而言之,流是用于读或写操作的数据流。

IO流

在Java中执行流操作包括两种方式:字节流字符流

对于IO流所涵盖的内容,此处借用菜鸟教程中的图片:

IO流

本文分别采用字节流和字符流实现对文件的写入和读取操作。值得一提的是:文件输入流是针对当前程序而言的,用于从文件读取数据;同理,文件输出流用于向文件写入数据。

字节流

什么是Java中的字节流

Java中的字节流用于执行8位字节的输入和输出操作,以stream结尾。Java字节流逐字节处理数据,是用于处理二进制文件原始数据

字节流操作常用类是FileInputStreamFileOutputStreamFileInputStream用于从源文件读取数据,FileOutputStream用于向目标文件写入数据。

文件输出字节流

当前程序通过文件输出字节流,向文件写入字节

/**
 * 向文件写入数据:输出数据到文件,文件是输出方
 * 文件输出字节流
 */
private static void writeStreamToFile() throws IOException {
    final FileOutputStream outputStream = new FileOutputStream(file);
    byte[] bytes = {12, 23, 34, 56};
    for (int i=0; i<bytes.length; i++) {
        outputStream.write(bytes[i]);
    }
    outputStream.close();
}

文件输入字节流

当前程序通过文件输入字节流,从文件中读取字节

/**
 * 从文件读取数据:从文件读取数据,文件是输入方
 * 输入字节流
 */
private static void readStreamFromFile() throws IOException {
    final FileInputStream inputStream = new FileInputStream(file);
    final int size = inputStream.available();
    for (int i=0; i<size; i++) {
        System.out.println(inputStream.read());
    }
    inputStream.close();
}

字符流

什么是Java中的字符流

Java中使用Unicode存储字符,Java中字符流用于逐字符读/写数据,执行16位Unicode的输入和输出,字符流以ReaderWriter结尾。

Java中常见的字符流类是FileReaderFileWriterFileReader内部使用FileInputStream(属性)实现,FileWriter内部使用FileOutputStrem(属性)实现。

文件输出字符流

/**
 * 使用OutputStreamWriter向文件写入,解决保存字节时存在的显示乱码
 * 输出字符流
 */
private static void writeCharacterToFile() throws IOException {
    // 构建FileOutputStream对象,文件不存在会自动创建
    final FileOutputStream outputStream = new FileOutputStream(file);
    final OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
    // 写入到缓存区
    writer.append("中文输入");
    writer.append("\r\n");
    writer.append("English");
    // 刷新缓存区
    writer.flush();
    // 关闭输出流,同时会将缓存区中的数据写入文件
    writer.close();
    outputStream.close();
}

文件输出字符流是对文件输出字节流的包裹,同时指定文件输出字符流采·用的编码格式:UTF-8

文件输入字符流

/**
 * 使用InputStreamReader从文件读取,解决乱码
 * 输入字符流
 */
private static void readCharacterFromFile() throws IOException {
    // 构建FileInputStream对象
    final FileInputStream inputStream = new FileInputStream(file);
    final InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
    // 读取文件内容
    final StringBuilder builder = new StringBuilder();
    while(reader.ready()) {
        // 将char追加到StringBuilder对象中
        builder.append((char) reader.read());
    }
    // 输出内容
    System.out.println(builder.toString());
    // 关闭流
    reader.close();
    inputStream.close();
}

文件输入字符流是对文件输入字节流的包裹,同时指定与上述文件输出字符流一致的编码格式:UTF-8

FileWriter与FileReader

FileWriter

FileWriter继承OutputStreamWriter,默认使用编码方式UTF-8

/**
 * 覆盖写入文件
 * @param file
 * @throws IOException
 */
private static void writeToFile(String file) throws IOException {
    final FileWriter writer = new FileWriter(file);
    for (int i=1; i<=10; i++) {
        writer.append("This is the message from guest " + i + "\n");
        writer.append("本消息来自于客人 " + i + "\n");
    }
    writer.flush();
    writer.close();
}

/**
 * 追加写入文件
 * @param file
 * @throws IOException
 */
private static void appendToFile(String file) throws IOException {
    final FileWriter writer = new FileWriter(file, true);
    for (int i=1; i<=10; i++) {
        writer.append("This is the message from guest " + i + "\n");
        writer.append("本消息来自于客人 " + i + "\n");
    }
    writer.flush();
    writer.close();
}

FileReader

FileReader继承InputStreamReader,默认使用编码方式UTF-8

/**
 * 从文件读取数据
 * @param file
 * @throws IOException
 */
private static void readFromFile(String file) throws IOException {
    final FileReader reader = new FileReader(file);
    final StringBuilder builder = new StringBuilder();
    while (reader.ready()) {
        builder.append((char) reader.read());
    }
    System.out.println(builder.toString());
    reader.close();
}

JDK5之前控制台输入

多字符读取

JDK5之前程序获取console端数据输入,通过BufferedReader类实现,通过循环实现多次调用单个字符读写方法bufferedReader.reader()实现程序对于console端多字符的获取。

private static void consoleReadCharacters() throws IOException {
    final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("输入字符,按下'q'键退出");
    char c;
    do {
        // read()用于读取单个字符输入
        c = (char) br.read();
        System.out.println(c);
    } while (c != 'q');
}

字符串读取

JDK5之前程序获取console端数据输入,通过BufferedReader类实现

private static void consoleReadString() throws IOException {
    final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter lines of text");
    System.out.println("Enter 'end' to quit");
    String input;
    do {
        input = br.readLine();
        System.out.println(input);
    } while (!input.equals("end"));
}

字符流与字节流的区别

定义不同

字节流执行8位字节输入和输出的机制,基本单元为字节;

字符流执行16位Unicode输入和输出的机制,基本单元为Unicode码元。

字节流以Stream结尾;字符流以WriterReader结尾。

处理方式不同

字节流用于处理二进制数据,按字节处理,采用ASCII编码;实际上可以处理任意类型的数据,但是不支持直接写入或读取Unicode码元。

字符流采用Unicode编码,实际按照虚拟机的encode处理,需要进行字符集的转化;通常用于处理文本数据,支持写入和读取Unicode码元。

是否使用缓冲区

字节流默认不使用缓冲区,字符流使用缓冲区。

参考链接

  1. 菜鸟教程 | Java教程
  2. Java中字节流与字符流的区别是什么
posted @ 2021-02-22 17:53  LinPerfei  阅读(94)  评论(0)    收藏  举报