Java IO流(三)

news2024/11/23 11:43:40

1. 字符流

1.1 什么是字符流

        在Java中,字符流是指提供了基于字符的I/O能力的API。

        Java 1.0中提供的基于字节的I/O流API只能支持8位字节流,无法妥善地处理16位Unicode字符。由于需要支持Unicode处理国际化字符,因此Java 1.1 对基础流式I/O库进行了重大的修改,核心是增加了字符流相关的API,处理国际化Unicode字符的编码和解码。

        字符流是以字符(char)为单位读写数据的:一次处理一个 Unicode。字符流的底层仍然是基本的字节流,它封装了字符的编码解码算法。

        字符流以Reader和Writer为核心抽象类,所有的字符输入流类均继承Reader,所有的字符输出流均继承Writer。如下图所示:

        字符流相关子类可以分为节点流和处理流:上图中带阴影的是节点流,不带阴影的是处理流。

1.2 FileWriter示例

        编写代码,使用FileWriter将字符写入文件。代码示意如下:

package api_04;

import java.io.FileWriter;
import java.io.Writer;

public class WriterDemo1 {
    public static void main(String[] args){
        Writer writer = null;
        try{
            writer = new FileWriter("./src/api_04/demo");
            writer.write("Hello World!\n");
            writer.write("Hello FileWriter!\n");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (writer != null){
                try{
                    writer.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

1.3 FileReader示例

  1.         编写代码,使用FileReader从文件中读取字符。代码示意如下:
package api_04;

import java.io.FileReader;
import java.io.Reader;

public class ReaderDemo1 {
    public static void main(String[] args) {
        Reader reader = null;
        try{
            reader = new FileReader("./src/api_04/demo");
            char[] data = new char[5];
            int len = 0;
            while (len !=-1){
                System.out.print(new String(data,0,len));
                len = reader.read(data);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (reader != null){
                try{
                    reader.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

1.4 try-with-resources语法

        在前面的案例中,为了妥善的处理I/O操作中可能出现的异常,并保证在程序结束后关流,我们使用了try-catch-finally语句块。但在实际编码中遇到很多不方便的情况,例如:

  • finally语句块不能访问try语句块中声明的变量
  • finally语句块中需要再次添加try-catch语句块

        幸好Java 7 引入了try-with-resources语法,可以很好地简化上述代码。

        这种称为try-with-resources语法。其要求为:

        1、try后面的括号称为资源说明头,用于创建语句块中使用的资源对象

        2、资源说明头中创建的对象必须实现java.lang.AutoCloseable接口,该接口只有一个方法-close()

        3、资源说明头中可以包含多个创建对象的语句,用分号隔开,最后的分号可以省略

        4、不论如何退出try语句块,都会自动调用所有资源对象的close方法

        5、退出try语句块时,会以与声明资源对象相反的顺序去调用资源对象的close方法

        编写代码,测试try-with-resources的用法。代码示意如下:

package api_04;

import java.io.Closeable;
import java.io.IOException;

public class TWRDemo {
    public static void main(String[] args) {
        try(
            MyStream1 stream1 = new MyStream1();
            MyStream2 stream2 = new MyStream2();
        ){
            System.out.println("try...");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

class MyStream1 implements Closeable{
    @Override
    public void close() throws IOException {
        System.out.println("MyStream1 close...");
    }
}

class MyStream2 implements Closeable{
    @Override
    public void close() throws IOException {
        System.out.println("MyStream2 close...");
    }
}

2. 字符缓冲流

2.1 字符缓冲流概述

        BufferedReader和BufferedWriter分别是字符输入流和字符输出流对应的缓冲流,内置了缓冲区,通过缓冲区来减少实际的物理读写操作,进而提高读写效率。这两个类默认的缓冲区大小均为8192个字符,并支持通过构造器来设置缓冲区大小。

        BufferedReader中还提供了一些增强的I/O操作方法,例如:

  • readLine:读取文本中的一行内容,以'\n','\r'来识别,返回的内容不包含换行符
  • skip:跳过指定数量的字符

        BufferedWriter中没有提供相似的writeLine方法,但是提供了newLine方法,调用时可以向流中输出一个换行符,以达到换行的效果。

2.2 BufferedWriter示例

        编写代码,测试BufferedWriter的用法。代码示意如下:

package api_04;

import java.io.*;

public class BufferedWriterDemo {
    public static void main(String[] args) {
        try(
            Writer writer = new FileWriter("./src/api_04/demo2");
            BufferedWriter bufferedWriter = new BufferedWriter(writer);
        ){
            bufferedWriter.write("Hello world!");
            bufferedWriter.newLine();
            bufferedWriter.write("Hello BufferedWriter!");
            bufferedWriter.newLine();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

2.3 BufferedReader示例

        编写代码,测试BufferedReader的用法。代码示意如下:

package api_04;

import java.io.*;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        try(
            Reader reader = new FileReader("./src/api_04/demo2");
            BufferedReader bufferedReader = new BufferedReader(reader);
        ){
            String line = bufferedReader.readLine();
            while (line!=null) {
                System.out.println(line);
                line = bufferedReader.readLine();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

3. 转换流

3.1 转换流概述

        转换流用于实现字节流和字符流之间的转换。

        InputStreamReader是字节输入流到字符输入流的桥梁,用于将InputStream转换为Reader,可以读取字节数据并根据指定的字符集转换为字符数据。

        OutputStreamWriter是字符输出流到字节输出流的桥梁,用于将OutputStream转换为Writer,可以根据指定的字符集将写出的字符数据转换为字节数据。

3.2 指定字符编码

        InputStreamReader 的构造方法允许设置字符集

  • InputStreamReader(InputStream in,String charsetName):基于给定的字节输入流以及字符编码创建
  • InputStreamReader(InputStream in):该构造方法会根据系统默认字符集创建

        OutputStreamWriter 的构造方法:

  • OutputStreamWriter(OutputStream out,String charsetName):基于给定的字节输出流以及字符编码创建
  • OutputStreamWriter(OutputStream out):该构造方法会根据系统默认字符集创建

3.3 OutputStreamWriter示例

        编写代码,测试OutputStreamWriter的用法,并指定字符编码。代码示意如下:

package api_04;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class OutputStreamWriterDemo {
    public static void main(String[] args) {
        try(
            FileOutputStream fos
                        = new FileOutputStream("./src/api_04/demo3");
            OutputStreamWriter osw
                        = new OutputStreamWriter(fos,"utf-8");
            BufferedWriter bw = new BufferedWriter(osw)
        ){
            bw.write("世界你好!");
            bw.newLine();
            bw.write("转换流你好!");
            bw.newLine();
            System.out.println("写出完毕!");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

3.4 InputStreamReader示例

        编写代码,测试InputStreamReader的用法,并指定字符编码。代码示意如下:

package api_04;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class InputStreamReaderDemo {
    public static void main(String[] args) {
        try(
            FileInputStream fis
                        = new FileInputStream("./src/api_04/demo3");
            InputStreamReader isr
                        = new InputStreamReader(fis,"utf-8");
            BufferedReader br = new BufferedReader(isr);
        ){
            String line =br.readLine();
            while(line!=null){
                System.out.println(line);
                line = br.readLine();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1638860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3+ts 原生 js drag drop 实现

vue3ts 原生 js drag drop 实现 一直以来没有涉及的一个领域就是 drag drop 拖动操作,研究了下,实现了,所以写个教程。 官方说明页面及实例:https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API 最终效果&…

SpringCloud整合Gateway结合Nacos

目录 一、引入依赖 二、开启两个测试项目 2.1 order service ​编辑 2.2 user service 三、gateway项目 3.1 新建一个bootstrap.yml文件 3.2 将我们的的网关配置写道nacos里的配置里 3.3 测试:看能够根据网关路由到两个测试的项目 四、 优化 4.1 将项目打包…

数据库(MySQL)—— DQL语句(聚合,分组,排序,分页)

数据库(MySQL)—— DQL语句(聚合,分组,排序,分页) 聚合函数常见的聚合函数语法 分组查询语法 排序查询语法 分页查询语法 DQL的执行顺序 我们今天来继续学习MySQL的DQL语句的聚合和分组查询&…

【面试经典 150 | 数组】接雨水

文章目录 写在前面Tag题目来源解题思路方法一:预处理方法二:单调栈方法三:双指针 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主&#xff…

【大模型学习】Transformer(学习笔记)

Transformer介绍 word2vec Word2Vec是一种用于将词语映射到连续向量空间的技术,它是由Google的Tomas Mikolov等人开发的。Word2Vec模型通过学习大量文本数据中的词语上下文信息,将每个词语表示为高维空间中的向量。在这个向量空间中,具有相似…

【C++】学习笔记——string_2

文章目录 六、string类2. 反向迭代器const迭代器 string类对象的容量操作(补)size() 3. string类的元素访问4. string类的修改 未完待续 结合文档食用~ 六、string类 2. 反向迭代器 一般来说,迭代器都是正向的遍历容器,虽然可以…

LuaJIT源码分析(三)字符串

LuaJIT源码分析(三)字符串 要表示一个字符串,核心就是需要知道字符串的长度,以及存放字符串具体数据的地址。lua的字符串是内化不可变的,也就是lua字符串变量存放的不是字符串的拷贝,而是字符串的引用。那么…

C语言⼆级指针如何操作字符串数组(指针数组)?

一、问题 对于字符串数组该如何操作(⽽且是使⽤指针数组存储)? 二、解答 使⽤指针的指针实现对字符串数组中字符串的输出。指向指针的指针即是指向指针数据的指针变量。这⾥创建⼀个指针数组 strings,它的每个数组元素相当于⼀个…

springcloud自定义全局异常

自行创建一个实体类 /*** 全局异常处理类**/ ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(Exception.class) ResponseBody public Result error(Exception e){e.printStackTrace(); return Result.fail();}/*** 自定义异常处理方法* param e * re…

神奇的Vue3 - 组件探索

神奇的Vue3 第一章 神奇的Vue3—基础篇 第二章 神奇的Vue3—Pinia 文章目录 神奇的Vue3了解组件一、注册组件1. 全局注册​2. 局部注册3. 组件命名 二、属性详解1. Props(1)基础使用方法(2)数据流向:单项绑定原则&…

深入图像分类:使用美国手语数据集训练定制化神经网络

引言 在前一篇博客中,我们探讨了如何使用MNIST数据集训练一个基础的神经网络来进行手写数字识别。在本文中,我们将更进一步,使用美国手语字母表(ASL)数据集来构建一个定制化的图像分类模型。通过这个过程,…

YOLOv9/YOLOv8算法改进【NO.128】 使用ICCV2023超轻量级且高效的动态上采样器( DySample)改进yolov8中的上采样

前 言 YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通: 首推…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…

Docker 安装部署 postgres

Docker 安装部署 postgres 1、拉取 postgres 镜像文件 [rootiZbp19a67kznq0h0rgosuxZ ~]# docker pull postgres:latest latest: Pulling from library/postgres b0a0cf830b12: Pull complete dda3d8fbd5ed: Pull complete 283a477db7bb: Pull complete 91d2729fa4d5: Pul…

C#知识|汇总方法重载与静态方法应用技巧

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 今天学习C#方法重载与静态方法应用技巧的相关内容。 01 方法重载有什么好处&#xff1f; 1.1、可以有效的减少类的对外接口&#xff08;只显示一个方法比较简洁&#xff09;&#xff0c;从而降低类的复杂度。 1.2、方便…

ubuntu开启message文件

环境&#xff1a;ubuntu 20.04 1、首先需要修改 /etc/rsyslog.d/50-default.conf 文件&#xff1b;源文件中message被注释&#xff0c;如下图&#xff1a; 2、打开注释&#xff1a; 3、重启服务 systemctl restart rsyslog.service 如此即可&#xff01;

freeRTOS事件标志组(1-16)

def&#xff1a;事件标志组简介 事件标志位&#xff1a;用一个为来表示事件是否发生 事件标志组是事件标志位的集合可以简单的理解事件标志组&#xff0c;就是一个整数 事件标志组的特点: 1&#xff1a;它的每一个位表示一个事件&#xff08;高8位不算&#xff09; 2&#…

分布式与一致性协议之Raft算法与一致哈希算法(一)

Raft算法 Raft与一致性 有很多人把Raft算法当成一致性算法&#xff0c;其实它不是一致性算法而是共识算法&#xff0c;是一个Multi-Paxos算法&#xff0c;实现的是如何就一系列值达成共识。并且&#xff0c;Raft算法能容忍少数节点的故障。虽然Raft算法能实现强一致性&#x…

打印机-STM32版本 硬件部分

最终PCB EDA工程: 一、确定芯片型号 根据项目需求&#xff0c;梳理需要用到的功能&#xff0c; 电量检测&#xff1a;ADC 按键&#xff1a;IO input外部中断 LED&#xff1a;IO output 温度检测&#xff1a;ADC 电机控制&#xff1a;IO output 打印通讯&#xff1a;SPI …

HarmaonyOS鸿蒙应用科普课

一、什么是鸿蒙OS&#xff1f; 1.概念&#xff1a; 先给大家讲讲今天讲课的主题&#xff0c;鸿蒙OS是什么&#xff1f;鸿蒙系统大家都知道&#xff0c;就是一个操作系统&#xff0c;我们未来是为的成为鸿蒙程序员。所以我们不要将鸿蒙os完全等同于手机操作系统&#xff0c;太…