IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Java IO(四)高级流之转换流、缓冲字符流 -> 正文阅读

[开发工具]Java IO(四)高级流之转换流、缓冲字符流

高级流

字符流

  • java将流按照读写单位划分为字节流与字符流。
  • java.io.InputStreamOutputStream是所有字节流的超类。
  • java.io.ReaderWriter则是所有字符流的超类,它们和字节流的超类是平级关系。
  • ReaderWriter是两个抽象类,里面规定了所有字符流都必须具备的读写字符的相关方法。
  • 字符流最小读写单位为字符(char),但是底层实际还是读写字节,只是字符与字节的转换工作由字符流完成。

转换流

java.io.InputStreamReaderOutputStreamWriter
它们是字符流非常常用的一对实现类同时也是一对高级流,实际开发中我们不直接操作它们,但是它们在流连接中是非常重要的一环。

使用转换输出流向文件中写入文本数据

请添加图片描述

/**
 * 字符流
 * java将流按照读写单位划分为字节流与字符流.
 * java.io.InputStream和OutputStream是所有字节流的超类
 * 而java.io.Reader和Writer则是所有字符流的超类,它们是平级关系.
 *
 * Reader和Writer是两个抽象类,里面规定了所有字符流都必须具备的读写字符的相关方法.
 * 字符流最小读写单位为字符(char),但是底层实际还是读写字节,只是字符与字节的转换工作由
 * 字符流完成.
 *
 * 转换流
 * java.io.InputStreamReader和OutputStreamWriter
 * 它们是字符流非常常用的一对实现类同时也是一对高级流,实际开发中我们不直接操作它们,但是
 * 它们在流连接中是非常重要的一环.
 */
public class OSWDemo {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("demo.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);

        osw.write("你好");
        osw.write("HIEU");

        System.out.println("写出完毕");

        osw.close();
    }
}

使用转换输入流读取文本文件

/**
 * 转换字符输入流
 * 可以将读取的字节按照指定的字符集转换为字符
 */
public class ISRDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("demo.txt");
        InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);

        /*
            循环将文件中的所有字符读出来
         */
        int d;
        while ((d = isr.read()) != -1) {
            System.out.print((char) d);
        }
    }
}

转换流的意义

实际开发中我们还有功能更好用的字符高级流,但是其他的字符高级流都有一个共通点:不能直接连接在字节流上,而实际操作设备的流都是低级流,同时也都是字节流,因此不能直接在流连接中串联起来。转换流是一对可以连接在字节流上的字符流,其他的高级字符流可以连接在转换流上,在流连接中起到"转换器"的作用(负责字符与字节的实际转换)。

缓冲字符流

java.io.BufferedWriterBufferedReader
缓冲字符流内部也有一个缓冲区,读写文本数据以块读写形式加快效率。并且缓冲流有一个特别的功能:可以按行读写文本数据。

缓冲字符输出流:java.io.PrintWriter

java.io.PrintWriter具有自动行刷新的缓冲字符输出流,实际开发中更常用。它内部总是会自动连接BufferedWriter作为块写加速使用。
请添加图片描述

/**
 * 缓冲字符流
 * 缓冲字符流是一对高级流,在流连接中的作用是提高读写文本数据的效率,并且
 * 可以按行读写字符串.
 * java.io.BufferedReader和BufferedWriter
 *
 * 实际开发中缓冲字符输出流我们更常用的是PrintWriter,具有自动行刷新功能
 * 的缓冲字符输出流,其内部总是连接BufferedWriter作为缓冲加速使用.
 */
public class PWDemo1 {
    public static void main(String[] args)
            throws FileNotFoundException, UnsupportedEncodingException {
        PrintWriter pw = new PrintWriter("demo.txt", "UTF-8");
        pw.println("hi");
        pw.println("你好");

        System.out.println("写出完毕");
        pw.close();
    }
}

在流链接中使用pw

/**
 * 在流连接中使用PW
 */
public class PWDemo2 {
    public static void main(String[] args) throws IOException {
        // 低级流,字节流
        FileOutputStream fos = new FileOutputStream("demo.txt");
        // 高级流,转换流
        OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
        // 高级流,字符流,块文本写加速
        BufferedWriter bw = new BufferedWriter(osw);
        // 高级流,字符流,行刷新
        PrintWriter pw = new PrintWriter(bw);
        pw.println("你好");
        pw.println("再见");
        System.out.println("写出完毕");
        pw.close();
    }
}

PrintWriter的自动行刷新功能

如果实例化PW时第一个参数传入的是一个流,则此时可以再传入一个boolean型的参数,此值为true时就打开了自动行刷新功能。 即: 每当我们用PW的println方法写出一行字符串后会自动flush。

/**
 * 自动行刷新功能
 */
public class PWDemo3 {
    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter(
                new BufferedWriter(
                        new OutputStreamWriter(
                                new FileOutputStream("demo.txt")
                        )
                ), true);

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入内容,单独输入exit停止");
        while (true) {
            String line = scanner.nextLine();
            if ("exit".equals(line)) {
                break;
            }
            //pw.print(line);//不会flush
            pw.println(line);//自动flush
        }

        System.out.println("再见!");
        pw.close();
    }
}

缓冲字符输入流:java.io.BufferedReader

是一个高级的字符流,特点是块读文本数据,并且可以按行读取字符串。

/**
 * 使用java.io.BufferedReader按行读取文本数据
 */
public class BRDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis =
                new FileInputStream("demo.txt");
        InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
        BufferedReader br = new BufferedReader(isr);

        String line;
        /*
            BufferedReader提供了一个读取一行字符串的方法:
            String readLine()
            该方法会返回一行字符串,返回的字符串不含有最后的换行符。
            当某一行是空行时(该行内容只有一个换行符)则返回值为空字符串。
            如果流读取到了末尾,则返回值为null。
         */
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();
    }
}

Java IO总结

请添加图片描述

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:40:00  更:2022-04-09 18:40:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 15:02:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码