【Java】文件I/O-文件内容操作-输入输出流-Reader/Writer/InputStream/OutputStream四种流

导读

在文件I/O这一节的知识里,对文件的操作主要分为两大类:

☑️针对文件系统进行的操作

☑️针对文件内容进行的操作

上文已经讲了针对文件系统即File类的操作,这篇文章里博主就来带了解针对文件内容的操作,即输入输出流(Reader,Writer,InputStream,OutputStream)四种流相关知识📖

前置知识

1、流的分类

文件I/O中的流分为字节流和字符流

字符流:以字符为单位,每次读写的最小单位是字符;对应文本文件。包括Reader,Writer两个类

字节流:以字节为单位,每次读写的最小单位是字节;对应二进制文件。包括InputStream,OutputStream两个类

流的关系分类如下图 

注意,字符和字节的关系如下

一个字符可能是对应多个字节
GBK,一个中文字符 ->两个字节
UTF8,一个中文字符 ->三个字节 

2、输入输出的定义 

 计算机中的输入输出发生在CPU和硬盘之间,而我们所说的输入输出是以CPU为视角,即

 · 把数据从CPU保存到硬盘上,是输出/写(Input/Read)
 · 把内容从硬盘取到CPU里,是输入/读(Output/Write)

下图可以形象地表示输入输出的定义 

四种流的使用 

1、Reader

(1)Reader类

先创建一个Reader

Reader reader = new FileReader("/Users/liuwenwen/Desktop/test.txt");

(2)Reader类中的方法

Reader最常用的就是read方法,read方法分为下面几种

方法名说明
read(char[] cbuf)传入数组参数,读取数组长度的字符存放在数组中
read ()读一个字符
read(CharBuffer target)传入CharBuffer对象
read(char[] cbuf,int off, int length)传入数组参数,从字符串off位置开始读,读取length长度的字符存放在数组中

(3)代码实例

其中最常用的是read(char[] cbuf)方法,返回参数是读取字符的个数

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class demo {public static void main(String[] args){char[] buf = new char[12];try(Reader reader = new FileReader("/Users/liuwenwen/Desktop/test.txt")) {while (true){int n = reader.read(buf);if(n == -1){break;}System.out.println("n="+n);for (int i = 0; i < n; i++) {System.out.print(buf[i]);}System.out.println();}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

注意:代码中将Reader reader = new FileReader("/Users/liuwenwen/Desktop/test.txt放在try()代码块中是隐藏了reader.close()操作,相当于

try {Reader reader = new FileReader("/Users/liuwenwen/Desktop/test.txt")while (true){int n = reader.read(buf);if(n == -1){break;}System.out.println("n="+n);for (int i = 0; i < n; i++) {System.out.print(buf[i]);}System.out.println();}
} catch (FileNotFoundException e) {throw new RuntimeException(e);
} catch (IOException e) {throw new RuntimeException(e);
}finally{reader.close();
}

读取结果 

 

2、Writer类

 (1)Writer中的方法

Writer方法如下

方法名说明
write(String str)一次写一个字符串
write(char[] cbuf)一次写多个字符(字符数组)
write(int c)一次写一个字符
write(String str, int off, int len)带有 offset 和lenoffset指的是从字符串中的第几个字符开始写
write(char[] cbuf, int off, int len)带有 offset 和lenoffset 指的是从数组中的第几个字符开始写

(2)代码实例

我们最常用的是第一个即write(String str)方法

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class demo3 {public static void main(String[] args) {try(Writer writer = new FileWriter("/Users/liuwenwen/Desktop/test.txt")) {writer.write("驻跸怀千古,开襟望九州。太平词藻盛,长愿纪鸿休。");} catch (IOException e) {throw new RuntimeException(e);}}
}

 运行程序后,文本内容被修改了😦

可见我们原来的内容同时也被覆盖。如果不想覆盖原本的内容,怎么办呢?🤔

在创建Writer类时,加一个参数true,表示追加

try(Writer writer = new FileWriter("/Users/liuwenwen/Desktop/test.txt",true)) 

为了防止由于程序运行太快,内容在缓冲区中没有来得及写到硬盘里,我们加一个flush()方法

writer.flush();

 现在整体代码就变成

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class demo3 {public static void main(String[] args) {try(Writer writer = new FileWriter("/Users/liuwenwen/Desktop/test.txt",true)) {writer.write("驻跸怀千古,开襟望九州。太平词藻盛,长愿纪鸿休。");writer.flush();} catch (IOException e) {throw new RuntimeException(e);}}
}

用原来的文本再次运行程序 

​​​​​​​

可以看到,这次是追加,不再是覆盖 

3、InputStream类

 (1)方法

InputStream类和Reader类里的方法类似,不过将char[]数组变为了byte[]数组,返回值是读取字节的个数

 (2)代码实例

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class demo5 {public static void main(String[] args) {try (InputStream inputStream = new FileInputStream("/Users/liuwenwen/Desktop/test.txt")){byte[] buf = new byte[1024];int n = inputStream.read(buf);for (int i = 0; i < n; i++) {System.out.printf("%x ",buf[i]);//采用十六进制打印,更加直观}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

读取结果

4、OutputStream类

(1)方法 

OutputStream类和Writer类里的方法类似,不过将char[]数组变为了byte[]数组

 (2)代码实例

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class demo6 {public static void main(String[] args) {try(OutputStream outputStream = new FileOutputStream("/Users/liuwenwen/Desktop/test.txt",true)){String s = "驻跸怀千古,开襟望九州。太平词藻盛,长愿纪鸿休。";outputStream.write(s.getBytes());} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

由于OutputStream类write方法要传入的是byte[]参数,我们直接调用字符串的getBytes()方法,方便书写

最终追加结果

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

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

相关文章

04_网络编程

网络编程 什么是网络编程 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09; java.net.* 包下提供了网络编程的解决方案 通信的基本架构 CS 架构&#xff08;Client 客户端 / Server 服务端&#xff09;BS 架构&#xff08;…

Open Inventor 2023.2.1 Crack

Fixed Bugs List 2023.2 2023.2.1 Open Inventor 2023.2.1 MeshViz #OIV-4824 Crash in MeshViz PbNonLinearDataMapping::computeColor Cache #OIV-4867 SoText3 : Texture read access violation – CAS-44904 Core #OIV-4725 Invalid displayed PoCircle color…

MySQL笔记-第06章_多表查询

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第06章_多表查询1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. …

C#网络编程UDP程序设计(UdpClient类)

目录 一、UdpClient类 二、示例 1.源码 &#xff08;1&#xff09;Client &#xff08;2&#xff09;Server 2.生成 &#xff08;1&#xff09;先启动服务器&#xff0c;发送广播信息 &#xff08;2&#xff09;再开启客户端接听 UDP是user datagram protocol的简称&a…

基于Python的PyGame的俄罗斯方块游戏设计与实现

摘 要 近年来&#xff0c;随着游戏产业的突飞猛进&#xff0c;游戏玩家的技术也是与日俱增&#xff0c;当你看见游戏高手完美的表演时&#xff0c;你是否想过我也能达到那种水平&#xff0c;本程序用Python语言编写俄罗斯方块&#xff0c;左侧显示正在运行的游戏&#xff0c;右…

BFS求树的宽度——结合数组建树思想算距离

二叉树最大宽度 https://leetcode.cn/problems/maximum-width-of-binary-tree/description/ 1、考虑树的宽度一定是在一层上的所以进行BFS&#xff0c;树的BFS不建议直接使用队列&#xff0c;每次add/offer然后poll/remove&#xff0c;这样子层级关系不好显示。我们可以定义…

MySQL笔记-第05章_排序与分页

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第05章_排序与分页1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 第05章_排序与分页 讲师&#…

Apache Sqoop使用

1. Sqoop介绍 Apache Sqoop 是在 Hadoop 生态体系和 RDBMS 体系之间传送数据的一种工具。 Sqoop 工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。 Hadoop 生态系统包括&#xff1a;HDFS、Hi…

Ubuntu20.04安装向日葵、开机自启、解决windows系统远程黑屏(笔记)

这里写目录标题 动机1. Ubuntu20.04 安装向日葵2. 设置开机自启3. 解决windows不可远程的问题4. 大公告成 动机 办公室有个工作站&#xff0c;要比我的笔记本的CPU稍微好一点&#xff0c;用来跑陆面过程。我信心满满的装了个Ubuntu20.04双系统,但是发现向日葵安装不上了。我少…

从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

题目描述&#xff1a;从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 bool DeleteMin(SqList &L,int &min){if(L.length 0)return false;min L…

回溯和分支算法

状态空间图 “图”——状态空间图 例子&#xff1a;农夫过河问题——“图”状态操作例子&#xff1a;n后问题、0-1背包问题、货郎问题(TSP) 用向量表示解&#xff0c;“图”由解向量扩张得到的解空间树。 ——三种图&#xff1a;n叉树、子集树、排序树 ​ 剪枝 不满住条件的…

时间序列数据压缩算法简述

本文简单介绍了时间序列压缩任务的来源&#xff0c;压缩算法的分类&#xff0c;并对常见压缩算法的优缺点进行了简介&#xff0c;爱码士们快来一探究竟呀&#xff01; 引言 时间序列数据是在许多应用程序和领域中生成的一种基本数据类型&#xff0c;例如金融、医疗保健、交通和…

基于Python手把手教你实现flappy bird游戏

目录 前言开始前的准备工作进入正题结束语 前言 想必玩过游戏的都知道&#xff0c;Flappy Bird是一款简单却富有挑战性的经典的小鸟飞行游戏&#xff0c;让许多玩家为之痴迷&#xff0c;而作为开发者&#xff0c;那肯定要通过技术手段来再做一遍这款经典游戏。那么本文就来通…

春秋云镜:CVE-2022-28512

靶标介绍&#xff1a; Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。 该…

SQL基础理论篇(十):事务处理

文章目录 简介事务的四大特性ACID如何使用事务参考文献 简介 MySQL在5.5版本之前&#xff0c;默认的存储引擎是MyISAM&#xff0c;它是不支持事务的&#xff0c;而5.5版本之后默认的引擎是InnoDB&#xff0c;这个是支持事务的&#xff0c;这也是InnoDB最终取代MyISAM称为主流引…

vscode配置使用 cpplint

标题安装clang-format和cpplint sudo apt-get install clang-format sudo pip3 install cpplint标题以下settings.json文件放置xxx/Code/User目录 settings.json {"sync.forceDownload": false,"workbench.sideBar.location": "right","…

振动和震动的区别?

问题描述&#xff1a;振动和震动的区别&#xff1f; 问题解决&#xff1a; 震动&#xff08;Oscillation&#xff09;&#xff1a; 特点&#xff1a; 随机的、突发的、不经常的、无规律的运动。例子&#xff1a; 地壳震动、消息震动全国&#xff0c;强调的是运动的力度或幅度&…

Using Application Engine Meta-SQL 使用应用引擎元SQL

Using Application Engine Meta-SQL 使用应用引擎元SQL This section describes the meta-SQL constructs, functions, and meta-variables you can use in Application Engine. 本节描述可以在Application Engine中使用的元SQL构造、函数和元变量。 Note: The SQL Editor does…

RPG项目01_技能释放

基于“RPG项目01_新输入输出”&#xff0c; 修改脚本文件夹中的SkillBase脚本&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; //回复技能&#xff0c;魔法技能&#xff0c;物理技能…

分类变量组间差异分析

1&#xff0c;频数表列联表 一维频数表 table <- table(data$low) table 0 1 130 59 prop.table(table)#百分比0 1 0.6878307 0.3121693 二维频数表 table1 <- table(data$low,data$smoke) table10 1 0 86 44 1 29 30 addmargins(table1)0 1 Sum 0…