【Java EE】文件内容的读写——数据流

目录

1.InputStream概述

1.1方法

2.FileInputStream概述

2.1构造方法

2.2代码示例

2.3.利用Scanner进行字符读取

3.OutputStream概述

3.1方法

3.2利用OutputStreamWriter进行字符写入

3.3利用PrintWriter找到我们熟悉的方法


1.InputStream概述

1.1方法
修饰符及返回值类型方法签名说明
intread()读取一个字节的数据,返回-1代表已经完全读完了。
intread(byte [] b)最多读取b.length字节的数据到b中,返回实际读取到的数量;-1代表以及读完了
int

read(byte []b,int off,int len)

最多读取len-off字节的数据到b中,放在off开始,返回实际读取到的数量;-1代表以及读取完了
voidclose()关闭字节流

说明

InputStream只是一个抽象类,要使用还需要具体的实现类。关于InputStream的实现类有很多,基于可以认为不同的输入设备都可以对应一个InputStream类,我们现在只关心从文件中读取,所以使用FileInputStream

2.FileInputStream概述

2.1构造方法
签名说明
FileInputStream(File file)利用File构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流
2.2代码示例

示例1

将文件完读完的两种方式。相比较而言,后一种的IO次数更少,性能更好。

import java.io.*;
// 需要先在项⽬⽬录下准备好⼀个 hello.txt 的⽂件,⾥⾯填充 "Hello" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {while (true) {int b = is.read();if (b == -1) {// 代表⽂件已经全部读完break;}System.out.printf("%c", b);}}}
}
import java.io.*;
// 需要先在项⽬⽬录下准备好⼀个 hello.txt 的⽂件,⾥⾯填充 "Hello" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {byte[] buf = new byte[1024];int len;while (true) {len = is.read(buf);if (len == -1) {// 代表⽂件已经全部读完break;}for (int i = 0; i < len; i++) {System.out.printf("%c", buf[i]);}}}}
}

示例2

这里我们把文件内容中填充中文看看,注意,写中文的时候使用UTf-8编码。hello.txt中填写“你好中国”

注意:这里我们用了这几个中文的UTF-8编码后长度刚好是3个字节和长度不超过1024字节的现状,但这种方式并不是通用的。

import java.io.*;
// 需要先在项⽬⽬录下准备好⼀个 hello.txt 的⽂件,⾥⾯填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {byte[] buf = new byte[1024];int len;while (true) {len = is.read(buf);if (len == -1) {// 代表⽂件已经全部读完break;}// 每次使⽤ 3 字节进⾏ utf-8 解码,得到中⽂字符// 利⽤ String 中的构造⽅法完成// 这个⽅法了解下即可,不是通⽤的解决办法for (int i = 0; i < len; i += 3) {String s = new String(buf, i, 3, "UTF-8");System.out.printf("%s", s);}}
}
}
}
2.3.利用Scanner进行字符读取

上述例子中,我们看到了对字符类型直接使用InputStream进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成工作,就是Scanner类。

构造方法说明
Scanner(InputStream is, String charset)使用charset字符集进行is的扫描读取

示例1

import java.io.*;
import java.util.*;
// 需要先在项⽬⽬录下准备好⼀个 hello.txt 的⽂件,⾥⾯填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNext()) {String s = scanner.next();System.out.print(s);}}}}
}

3.OutputStream概述

3.1方法
修饰符及返回值类型方法签名说明
voidwrite(int b)写入要给字节的数据
voidwrite(byte [] b)将b这个字符数组中的数据全部写入os中
intwrite(byte[] b,int off,int len)将b这个字符数组中从off开始的数据写入os中,一共写len个
voidclose()关闭字节流
voidflush()重要:我们知道I/O的速度是很慢的,所以,大多的OutPutStream为了减少设备操作的次数,在写数据的时候会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,但可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用flush(刷新)操作,将数据刷到设备中。

说明

OutputSream同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用FileOutputStream

3.2利用OutputStreamWriter进行字符写入

示例1

import java.io.*;
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {os.write('H');os.write('e');os.write('l');os.write('l');os.write('o');// 不要忘记 flushos.flush();}}
}
import java.io.*;
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {byte[] b = new byte[] {(byte)'G', (byte)'o', (byte)'o', (byte)'d'};os.write(b);// 不要忘记 flushos.flush();}}
}
import java.io.*;
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {byte[] b = new byte[] {(byte)'G', (byte)'o', (byte)'o', (byte)'d', (byte)'B', (byte)'a'};os.write(b, 0, 4);// 不要忘记 flushos.flush();}}
}
import java.io.*;
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {String s = "Nothing";byte[] b = s.getBytes();os.write(b);// 不要忘记 flushos.flush();
}
}
}
import java.io.*;
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {String s = "你好中国";byte[] b = s.getBytes("utf-8");os.write(b);// 不要忘记 flushos.flush();}}
}
3.3利用PrintWriter找到我们熟悉的方法

上述,我们其实已经完成输出工作,但总是有所不方便,我们接下来将OutputStream处理下,使用PrintWriter类中完成输出,因为 PrintWriter类中提供了我们熟悉的print/println/printf方法

outputStream os = ...;
OutputStreamWriter osWriter = new OutputStreamWriter(os, "utf-8"); // 告诉
PrintWriter writer = new PrintWriter(osWriter);
// 接下来我们就可以⽅便的使⽤ writer 提供的各种⽅法了
writer.print("Hello");
writer.println("你好");
writer.printf("%d: %s\n", 1, "没什么");
// 不要忘记 flush
writer.flush();

示例1

import java.io.*;
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8try (PrintWriter writer = new PrintWriter(osWriter)) {writer.println("我是第⼀⾏");writer.print("我的第⼆⾏\r\n");writer.printf("%d: 我的第三⾏\r\n", 1 + 1);writer.flush();}}}}
}

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

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

相关文章

iOS 在OC旧项目中使用Swift进行混编

iOS 在OC旧项目中使用Swift进行混编 1、创建桥接文件 ​ 第一次在Swift创建OC文件&#xff0c;或者第一次OC创建Swift时&#xff0c;xcode会提示桥接&#xff0c;Creat Bridging Header即可,这个文件用于Swift调用OC文件&#xff0c;与OC调用Swift无关。 2、在TARGETS中设置D…

Linux文件系统 软硬链接

文章目录 文件背景知识磁盘文件磁盘物理结构磁盘存储结构对磁盘的存储进行逻辑抽象Boot BlockSuper blockData blocksInode TableBlcokBitmapinode BitmapGroup Descriptor Table 文件名和inode编号创建文件删除文件查找文件 软硬链接软链接硬链接查看文件信息stat命令取消软硬…

玩转智能:深度强化学习在游戏AI中的应用

玩转智能&#xff1a;深度强化学习在游戏AI中的应用 1 引言 1.1 简述深度强化学习(DRL)在游戏AI中的革命性影响。 当我们回顾人工智能的发展历程&#xff0c;可以明显地看到深度强化学习&#xff08;Deep Reinforcement Learning, DRL&#xff09;的出现&#xff0c;在游戏AI…

Docker容器的原理及应用详解(二)

本系列文章简介: Docker是一种开源的容器化技术,它将应用程序及其依赖项打包为一个容器,以便在任何环境下运行。与传统的虚拟机相比,Docker容器更加轻量级且快速,可以在几秒钟内启动和停止。Docker的原理和应用非常广泛,可以用于开发、测试、部署和扩展应用程序。 在传统…

【埋点探针】微信小程序SDK安装

一、下载微信小程序SDK埋点代码 选择Wechat&#xff0c;复制sdk代码 在项目根目录下&#xff0c;创建sdk文件&#xff0c;webfunny.event.js 二、在app.js文件中&#xff0c;引入埋点SDK代码 首先引入sdk代码 require("./webfunny.event.js")引入兼容代码&#x…

python网页篇

爬取网页动态数据通常涉及到JavaScript渲染的内容&#xff0c;这类数据并不是在原始HTML文档中直接提供的&#xff0c;而是通过AJAX请求、WebSocket通信或者其他客户端渲染技术生成的。以下是几种常见的处理方法&#xff1a; 方法1&#xff1a;使用带有JavaScript渲染功能的库 …

DHT11实验

文章目录 11.11.2 234 DS18B20 只能检测温度 右边这几个 都能 1 1.1 数字信号输出 指 0/1使用单总线通信 1个IO口就能获取温湿度 T/H要有 模数转化&#xff08;内部还有个8位单片机&#xff09;电容感湿元件 白色的 还有个ic NTC测温 可能在ic内部 使用单片机内部测温 精确度不…

STM32存储左右互搏 SDIO总线FATS文件读写SD/MicroSD/TF卡

STM32存储左右互搏 SDIO总线FATS文件读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元&#xff0c;由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡&#xff0c;手机领域用的TF卡实际就是MicroSD卡&#xff0c;尺寸比SD卡小&#xff0c;而…

基于STM32温控风扇冷却系统设计

摘要&#xff1a; 在当前社会&#xff0c;随着大家对生活质量的追求和环保意识的加强&#xff0c;温控风扇作为一种节能产品备受社会的关注。温控风扇广泛应用于工业生产、家用电器、医疗美容设备和公共场所&#xff0c;提高了人们的生活效率和生活上的便利。这篇文章是根据单…

【网络协议】 TCP与UDP协议区别及应用场景深度分析

1. TCP与UDP简介 1.1 TCP 1.1 定义 TCP&#xff08;TransmissionControl Protocol&#xff09;传输控制协议。 是一种可靠的、面向连接的协议&#xff08;eg:打电话&#xff09;、传输效率低全双工通信&#xff08;发送缓存&接收缓存&#xff09;、面向字节流。使用TCP的应…

电子印章盖骑缝章

电子印章盖骑缝章是指在电子文档&#xff08;如PDF文件&#xff09;中&#xff0c;使用电子印章技术&#xff0c;为文档添加一个跨越多页、连续显示的电子印章图像&#xff0c;以模拟传统纸质文档上的骑缝章效果。以下是实现电子印章盖骑缝章的步骤&#xff1a; 一. 准备电子印…

docker的安装以及docker中nginx配置

机器 test3 192.168.23.103 1机器初始化配置 1.1关闭防火墙&#xff0c;清空防火墙规则 systemctl stop firewalld iptables -F setenforce 01.2部署时间同步 yum install ntp ntpdate -y1.3安装基础软件包 yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c make…

读《零基础学PYthon》有感

前言&#xff1a; 2023年&#xff0c;网络安全竞赛上看见大学同学用python解出了一个谜题&#xff0c;意气风发的我也决心花钱买书把python系统的学习一遍。 结果事与愿违&#xff0c;自己抑郁了半年&#xff0c;再加上繁杂的工作让我不得不放弃计划。今年&#xff0c;我基本能…

测试的面试题

测试问题 什么是测试? 测试在生活中处处可见。 我个人认为测试尝试以达到自己期望的状态 1.2为什么需要软件测试 企业为何需要招聘大量的测试人员呢&#xff1f; 额外的花费额外的时间 企业最终的目的是“盈利” 受众群体主要是广大的使用用户&#xff0c;而用户的使用…

【webrtc】m98 RoundRobinPacketQueue的优先级处理

m98 代码 PacedSender::EnqueuePackets 的调用者可能是多个地方,所以这个要加锁保护。RoundRobinPacketQueue 本身是没有锁的发现m98和新版本不同,参考:【webrtc】m114自己实现的PrioritizedPacketQueuepush和pop都是RtpPacketToSend 但是实际上,内部是封装为QueuedPacket 处…

基于Springboot的人职匹配推荐系统

基于SpringbootVue的人职匹配推荐系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 企业信息 岗位信息 新闻资讯 后台管理 用户管理 企业信息管理 岗位信…

Docker之注册中心的使用与操作

一、Docker注册中心与仓库 Reastry 可译为注册中心或注册服务器&#xff0c;是存放仓库的地方&#xff0c;一个注册中心往往有很多仓库。Docker默认的注册中心是Docker Hub&#xff0c;其可以通过浏览器访问&#xff0c;也可以使用docker search命令访问。 仓库是集中存放镜像…

html2Canvas截图包含滚动条解决思路

概况描述 在项目中使用html2Canvas进行截图时发现无法截取滚动条部分&#xff0c;前端是使用vue2的版本&#xff0c;网上找了很多方式都没效果&#xff0c;冷静思考后&#xff0c;给出解决办法。 解决思路 当我们截取的div容器的宽和高与内部的子容器div的宽和高不一样时&am…

如何写好单片机毕业设计的论文

如何写好单片机毕业设计的论文 引言 单片机毕业设计是大学生在专业课程中的重要组成部分,它不仅要求学生能够独立进行科学研究,还要求学生能够将自己的研究成果进行合理的总结和表达。本文将从选题、论文结构、写作技巧等方面,探讨如何写好单片机毕业设计的论文。 选题 …

Django模型的属性与方法

本节介绍Django模型的属性和方法&#xff0c;以及如何重写之前定义的模型方法等内容。 3.5.1 模型属性 Django模型中最重要的属性就是Manager&#xff0c;它是Django模型和数据库查询操作之间的接口&#xff0c;并且被用作从数据库当中获取实例的途径。如果Django模型中没有…