Java 入门指南:Java IO流 —— 转换流、扫描流、打印流

转换流

转换流可以将一个 字节流 包装成 字符流,或者将一个字符流包装成字节流。这种转换通常用于处理文本数据,如读取文本文件或将数据从网络传输到应用程序。

转换流主要有两种类型:InputStreamReaderOutputStreamWriter

InputStreamReader 将一个字节输入流转换为一个字符输入流,而 OutputStreamWriter 将一个字节输出流转换为一个字符输出流。它们使用指定的字符集将字节流和字符流之间进行转换。常用的字符集包括 UTF-8、GBK、ISO-8859-1 等。

![[转换流.png]]

为提高读写效率,会在转换流上添加一层缓冲流

在使用转换流时,需要指定正确的字符集编码方式,否则可能会导致数据读取或写入出现乱码。

InputStreamReader

java.io.InputStreamReader 是 Reader 类的子类。它的作用是将字节流(InputStream)转换为字符流(Reader),同时支持指定的字符集编码方式,从而实现字符流与字节流之间的转换。

构造方法
  • InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流。

  • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集(ASCII、Unicode、GBK…)的字符流。

常用方法

InputStreamReader 类的常用方法包括:

  • read():从输入流中读取一个字符的数据。

  • read(char[] cbuf, int off, int len):从输入流中读取 len 个字符的数据到指定的字符数组 cbuf 中,从 off 位置开始存放。

  • ready():返回此流是否已准备好读取。

  • close():关闭输入流。

使用示例

假设有一个字节流 InputStream,需要将其转换为字符流进行读取。

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;public class InputStreamReaderExample {public static void main(String[] args) {// 假设有一个字节流 InputStreamInputStream inputStream = getClass().getResourceAsStream("/example.txt");try (InputStreamReader isr = new InputStreamReader(inputStream);BufferedReader br = new BufferedReader(isr)) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

示例说明

  • 创建 InputStream:这里使用 getClass().getResourceAsStream() 方法来获取资源文件 example.txtInputStream

  • 创建 InputStreamReader:使用 inputStream 创建一个 InputStreamReader,默认使用系统默认的字符集。

  • 创建 BufferedReader:使用 InputStreamReader 创建一个 BufferedReader,以便逐行读取数据。

  • 读取数据:通过 BufferedReaderreadLine() 方法逐行读取数据,并打印出来。

如果想要指定字符集编码,可以在创建 InputStreamReader 时传递编码名称:

InputStreamReader isr = new InputStreamReader(inputStream, "UTF-8");

OutputStreamWriter

java.io.OutputStreamWriter 是 Writer 的子类,字面看容易误以为是转为字符流,其实是将字符流转换为字节流,是字符流到字节流的桥梁。

构造方法
  • OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流。

  • OutputStreamWriter(OutputStream in, String charsetName):创建一个指定字符集的字符流。

常用方法
  • write(int c):向输出流中写入一个字符的数据。

  • write(char[] cbuf, int off, int len):向输出流中写入指定字符数组 cbuf 中的 len 个字符,从 off 位置开始。

  • flush():将缓冲区的数据写入输出流中。

  • close():关闭输出流。

使用示例

假设要将字符数据写入一个字节流 OutputStream

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.IOException;public class OutputStreamWriterExample {public static void main(String[] args) {// 假设有一个字节流 OutputStreamOutputStream outputStream = System.out;  // 这里使用标准输出流try (OutputStreamWriter osw = new OutputStreamWriter(outputStream, "UTF-8");BufferedWriter bw = new BufferedWriter(osw)) {String content = "Hello, World!";bw.write(content);bw.newLine();  // 写入换行符bw.flush();  // 确保所有数据都被写入} catch (IOException e) {e.printStackTrace();}}
}

示例说明:

  • 创建 OutputStream:这里使用标准输出流 System.out 作为 OutputStream

  • 创建 OutputStreamWriter:使用 outputStream 创建一个 OutputStreamWriter,并指定字符集为 "UTF-8"

  • 创建 BufferedWriter:使用 OutputStreamWriter 创建一个 BufferedWriter,以便高效地写入数据。

  • 写入数据:通过 BufferedWriterwrite() 方法写入字符串 content

  • 换行:使用 newLine() 方法写入换行符。

  • 刷新:使用 flush() 方法确保所有数据都被写入。

使用转换流进行文件读写

假设有一个文本文件 input.txt,需要读取该文件的内容,并将内容写入另一个文件 output.txt

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;public class FileReadWriteExample {public static void main(String[] args) {String inputFilePath = "input.txt";String outputFilePath = "output.txt";try (InputStreamReader isr = new InputStreamReader(new FileInputStream(inputFilePath), "UTF-8");BufferedReader br = new BufferedReader(isr);OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(outputFilePath), "UTF-8");BufferedWriter bw = new BufferedWriter(osw)) {String line;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}} catch (IOException e) {e.printStackTrace();}}
}

示例说明:

  • 创建 InputStreamReader:使用 FileInputStream 创建一个 InputStreamReader,并指定字符集为 "UTF-8"

  • 创建 BufferedReader:使用 InputStreamReader 创建一个 BufferedReader,以便逐行读取数据。

  • 创建 OutputStreamWriter:使用 FileOutputStream 创建一个 OutputStreamWriter,并指定字符集为 "UTF-8"

  • 创建 BufferedWriter:使用 OutputStreamWriter 创建一个 BufferedWriter,以便高效地写入数据。

  • 读取和写入数据:通过 BufferedReaderreadLine() 方法逐行读取数据,并通过 BufferedWriterwrite() 方法写入数据。

  • 换行:使用 newLine() 方法写入换行符。

  • 刷新:使用 flush() 方法确保所有数据都被写入。

扫描流

扫描流 Scannerjava.util.Scanner 中的一个类,它可以用来从标准输入、文件、字符串等多种来源中获取输入。使用 Scanner 类能够方便、快速地从输入流中读取数据。

Scanner 类还提供了许多其他方法,例如 nextInt()nextDouble() 等,用于读取不同数据类型的输入。

构造方法

Java 中 java.util.Scanner 类提供了多个构造方法,用于创建不同类型的 Scanner 对象。

  1. Scanner(File source):创建一个从指定文件中读取数据的 Scanner 对象。
File file = new File("input.txt");
Scanner scanner = new Scanner(file);
  1. Scanner(InputStream source):创建一个从指定输入流中读取数据的 Scanner 对象。
InputStream inputStream = System.in;
Scanner scanner = new Scanner(inputStream);
  1. Scanner(String source):创建一个从指定字符串中读取数据的 Scanner 对象。
String text = "Hello, world!";
Scanner scanner = new Scanner(text);
  1. Scanner(File source, String charsetName):创建一个从指定文件使用指定字符集编码中读取数据的 Scanner 对象。
File file = new File("input.txt");
Scanner scanner = new Scanner(file, "UTF-8");
  1. Scanner(InputStream source, String charsetName):创建一个从指定输入流使用指定字符集编码中读取数据的 Scanner 对象。
InputStream inputStream = System.in;
Scanner scanner = new Scanner(inputStream, "UTF-8");

上述构造方法中的 source 参数均为输入源,charsetName 参数用于指定字符集编码(可选参数)。

System.in

System.in 是 Java 标准库中的一个静态字段,它是 java.io.InputStream 类型的对象,用于表示标准输入流。在控制台应用程序中,System.in 表示标准输入(键盘输入)。

可以通过创建 Scanner 对象,并将 System.in 作为参数传递给 Scanner 构造方法,使用 Scanner 对象读取从键盘输入的数据。

Scanner scan = new Scanner(System.in);
String string = scan.nextline();
int age = scan.nextInt();
scan.close();

打印流

System.out 实际是用于获取一个 PrintStream 对象,print方法实际调用的是 PrintStream 对象的 write 方法。

PrintStream 属于字节打印流,与之对应的孪生兄弟是 PrintWriter (字符打印流)。PrintStreamOutputStream 的子类,PrintWriterWriter 的子类。

打印流具有以下几个特点:

  • 可以自动进行数据类型转换:打印流可以将各种数据类型转换为字符串,并输出到指定的输出流中。

  • 可以自动进行换行操作:打印流可以在输出字符串的末尾自动添加换行符,方便输出多个字符串时的格式控制。

  • 可以输出到控制台或者文件中:打印流可以将数据输出到控制台或者文件中,方便调试和日志记录(生产环境下更推荐使用 Logback、ELK 等)。

PrintStream 类的常用方法包括:

  • print():输出一个对象的字符串表示形式。

  • println():输出一个对象的字符串表示形式,并在末尾添加一个换行符。

  • printf():使用指定的格式字符串和参数输出格式化的字符串。

Java 的常用转换说明符

转换符说明
%d or %i输出一个十进制整数。
%s输出一个字符串。
%x or %X输出一个十六进制整数,%x 输出小写字母,%X 输出大写字母。
%f or %F输出一个浮点数。
%e or %E输出一个科学计数法表示的浮点数,%e 输出小写字母 e,%E 输出大写字母 E。
%g or %G输出一个浮点数,自动选择 %f 或 %e/%E 格式输出。
%c输出一个字符。
%b输出一个布尔值。
%h输出一个哈希码(16进制)。
%n换行符。

Java printf 支持的修饰符

Java 的 printf 方法还支持一些修饰符,用于指定输出的宽度、精度、对齐方式等(类似C、C++)。

  • 宽度修饰符:用数字指定输出的最小宽度,如果输出的数据不足指定宽度,则在左侧或右侧填充空格或零。

  • 精度修饰符:用点号(.)和数字指定浮点数或字符串的精度,对于浮点数,指定小数点后的位数,对于字符串,指定输出的字符数。

  • 对齐修饰符:用减号(-)或零号(0)指定输出的对齐方式,减号表示左对齐,零号表示右对齐并填充零。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文档翻译软件哪个好用?这里有5个顶尖选择

在我的书架上摆满琳琅满目的书籍,这些数据不断的在拓宽我的眼界,但其实我还有秘密武器——5款文献翻译app。 每当我遇到那些充满智慧却难以理解的外文文献时,这些工具总能伸出援手,让复杂的专业术语变得亲切,让晦涩的…

Kafka事件(消息、数据、日志)的存储

1、查看有关kafka日志配置文件的信息 2、查看kafka全部主题的日志文件 3、查看每个主题的日志文件 4、__consumer_offsets-xx文件夹的作用 package com.power;public class Test {public static void main(String[] args) {int partition Math.abs("myTopic".hashCo…

无线通信频率分配

首先看看无线电信号的频谱如何划分: 一、5G NR 3GPP已指定5G NR 支持的频段列表,5G NR频谱范围可达100GHz,指定了两大频率范围: ① Frequency range 1 (FR1):就是我们通常讲的6GHz以下频段 频率…

Java算法—排序篇之快速排序(Quick sort)

快速排序(Quick sort) 核心思路: 从数列中挑出一个元素,一般都是左边第一个数字,称为 “基准数”;创建两个指针,一个从前往后走,一个从后往前走。先执行后面的指针,找出第一个比基…

灵魂 20 问帮你彻底搞定Transformer

1.Transformer为何使用多头注意力机制?(为什么不使用一个头) 捕捉多种依赖关系: 多头注意力机制允许模型同时关注输入数据的不同部分和特征。每个“头”都能够学习输入序列的不同表示子空间,从而捕捉到不同类型的依赖关…

霸王茶姬小程序(8月优化版)任务脚本——带教程

文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/BTQ1HK 若失效,可用地址 https://www.aliyun.com/daily-act/ecs/ecs_trial_benefits?source5176.29345612&userCode49hts92d 2.部署…

Java基础(4)- IDEA

目录 一、Module 1.创建module 2.关闭modue 3.导入module 4.src灰色 二、Package 1.创建package 2.删除package 3.package取名规范 三、类 1.创建类 2.快捷语法 3.HelloWorld 四、IDEA基本设置说明 1.字体 2.提示的快捷键 五、常用快捷键 一、Module 1.创建mod…

SpringData-ElasticSearch入门

文章目录 1、创建demo工程2、application.properties3、Goods 实体类4、EsDemoApplicationTests 测试类5、pom.xml6、查看索引库7、查看单个索引(数据库)8、从goods索引中检索出符合特定搜索条件的文档(或记录) 1、创建demo工程 2…

ctfhub-web-SSRF通关攻略

一、内网访问 1.打开ctfhub给的环境地址 2.观察题目 发现让我们访问127.0.0.1下的flag.php 在地址栏后面有一个url参数 ?urlhttp://127.0.0.1/flag.php 提交即可 二、伪协议读取文件 1.打开ctfhub给的环境 2.观察题目 发现让我们读取flag.php文件 读取文件用到的协议是…

mathtype 公式编号 添加章节号 章节编号错乱 解决方法

1 怎么添加编号 左编号方法和右编号一样。 打开word软件,选择mathtype工具,点击右编号以后会打开mathtype软件界面,在mathtype软件界面中对于公式进行编写,编写完成后退出并且保存,就可以完成编号添加。 如果是对已有的公式进行编写的话,则通过ctrl+A进行全文选择,选择…

基于SpringBoot+Vue实现的高校心里辅导(咨询)管理系统设计与实现

本高校心理教育辅导系统的开发基于springboot框架,采用Java技术,同时使用MYSQL数据库对系统数据进行储存,充分保证系统数据的安全性和稳定性。系统根据高校心理教育辅导的需求开发功能模块,实现对信息数据的添加、删除、修改、查询…

前端项目部署到服务器上(nginx)

我这个之前已经部署过项目,所以要进行这个操作 docker imagedocker rm -f nginx //用于强制删除名为“nginx”的容器docker ps //用于列出当前正在运行的Docker容器docker volume -fdocker volume prune //用于删除所有未使用的Docker数据卷,‌释放存…

OpenCV绘图函数(2)绘制圆形函数circle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 绘制一个圆。 cv::circle 函数用于绘制一个给定中心和半径的简单圆或填充圆。 函数原型 void cv::circle (InputOutputArray img,Point cen…

驱动:mknod-misc 杂项自动

一、杂项设备驱动 #include <linux/init.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/module.h> #include <linux/device.h> #include <asm/io.h> #include <asm/string.h> #include <asm/uaccess.h>…

简易指南:迅速构建个性化RAG(Retrieval-Augmented Generation)应用

前面的章节&#xff0c;我们已经完成了可用的基于知识库回答的ai助手&#xff0c;尽管RAG容易上手&#xff0c;但是要真正掌握其精髓却颇有难度&#xff0c;实际上&#xff0c;建立一个的有效的RAG系统不仅仅是将文档放入向量数据库并叠加一个llm模型那么简单&#xff0c;这种方…

心觉:赚钱是修行最快的一种方式

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松搞定人生挑战&#xff0c;实现心中梦想&#xff01; 挑战日更写作152/1000(完整记录在下面) 公门洞开纳百川 众心逐梦越千山 号召引领潜力绽 心觉潜意识无间 人生就是一场体…

【网络】P2P打洞原理

本文首发于 ❄️慕雪的寒舍 1. 引入 如果你折腾过NAS或者BT下载等等玩意&#xff0c;可能听说过“P2P打洞”这一技术名词。简单来说&#xff0c;P2P打洞可以让我们直接在外网访问内网的设备&#xff0c;从而让没有公网IP的家庭设备也能获得“公网直连”的速度。 比如绿联、极…

ES 根据条件删除文档

随着业务量的增多&#xff0c;es中数据越来越多&#xff0c;但有些数据其实后期并无业务用途&#xff0c;可直接做物理删除&#xff0c;程序里做兼容&#xff0c;但历史每个月的索引里的数据需要处理这部分冗余数据。 es提供_delete_by_query 根据查询条件进行删除的操作&…

呼入的电话通过http接口转接(mod_cti基于FreeSWITCH)

文章目录 前言联系我们配置流程1.呼入路由配置2.呼入安全配置3.配置生效规则4. 动作解析动作说明接口返回说明 5.创建拨号方案并启用 前言 呼叫流程&#xff1a;任意手机呼叫指定的号码&#xff0c;进入到中间件中&#xff0c;然后通过接口转接到对应的坐席分机中。接口作用&a…

警惕!血脂偏高,这些身体信号你不可不知!

在快节奏的现代生活中&#xff0c;高血脂&#xff0c;这个看似“沉默的杀手”&#xff0c;正悄然威胁着越来越多人的健康。它不像感冒发烧那样有明显的症状&#xff0c;却能在不知不觉中侵蚀血管&#xff0c;增加心血管疾病的风险。今天&#xff0c;我们就来揭开高血脂的神秘面…