Java研学-IO流(二)

三 流资源类结构

1 Java中的流资源可操作文件中的数据 – IO流

  ① 将数据写入到指定的文件中

  ② 将数据从指定的文件中读出

2 分类 – 四大基流,八大子流

按照流向分:输入流和输出流
按照操作数据源的类型分:

  ① 字符流

  Reader – 字符输入流 – InputStream – 基流

  FileReader/BufferedReader

  Writer – 字符输出流 – OutputStream – 基流

  FileWriter/BufferedWriter

  ② 字节流

  InputStream – 字节输入流

  FileInputStream/BufferedInputStream

  OutputStream – 字节输出流

  FileOutputStream/BufferedOutputStream

  ③ 子流的名字,前缀表示该子流操作的是什么(File表示文件本身,Buffered表示存储缓存区);后缀表示该子流属于那种流资源

3 由于四大基流都是抽象类,仅参考,具体实现操作要通过对应的子流完成

四 字符流 – 字符输出流系列 Writer体系

1 Writer类-用于写入字符流的抽象类

// Writer类设计 
public abstract class writer

Writer – FileWriter/BufferedWriter

IO流通用编写的步骤

① 将对象声明放在try块外 ,并且赋初始值为null

② 在try块中实例化对象,编写操作数据的代码

③在finally块中编写关闭资源代码,一定要在关闭前进行对象非空判断

2 FileWriter类设计–需要flush

// Writer类设计 可实例化FileWriter类
Class FileWriter// 根据指定文件名直接构造一个新的文件
public FileWriter(String fileName)// 例子
public class Test {public static void main(String[] args) {// 提升作用域,并赋初值为nullFileWriter fw=null;try {// 项目目录下创建play.txtfw=new FileWriter("play.txt");// 向文件中添加数据// public Writer append(char ch) 写一个字符fw.append('a');// public void write() 写一个字符(可以是ASCII码)fw.write(97);// public void write(char[] chs)   写一个字符数组fw.write(new char[]{'c','q','q'});// public void write(char[] chs,int start,int len)   写入某字符数组的其中一段(含首尾)fw.write(new char[]{'a','b','h'},1,2);// public void write(String str)   写入字符串// 换行操作 java \n  linux \n  windows \r\nfw.write("想吃橙子了\r\n");// public void write(String str,int start,int len)   写入字符串的一部分fw.write("风也温柔",1,3);// 将flush之前的内容写入文件fw.flush();} catch (IOException e) {e.printStackTrace();} finally {try {// 若资源没关闭,将资源关闭if(fw!=null){// 当结束所有操作后,关闭流资源,并且将最后书写的内容加载到文件中fw.close();System.out.println("资源fw已关闭");}} catch (IOException e) {e.printStackTrace();}}}
}

① FileWriter构造器必须传文件名,不能带有路径

② 使用FileWriter可以直接创建文件,并且如果没有就创建,如果有就覆盖

③ 可用flush方法将前面的内容加载到指定文件中

④ close方法 当结束所有操作后,关闭流资源,并且将在最后书写的内容加载到指定文件中

⑤ 可通过转义字符实现换行,但此写法Windows下识别换行 但linux识别不了 \r\n,为了避免此类问题定义了一个新的类实现操作,也就是BufferedWriter类

3 BufferedWriter类

常用方法,与Writer类同名方法用法一致,参考FileWriter

// Writer的具体实现类
Class BufferedWriter// 根据Writer的实现对象,于缓存区定义,创建默认大小的输出缓冲区的缓冲字符输出流
public BufferedWriter(Writer out)// 例子
public class Test2 {public static void main(String[] args) {// 声明IO流对象,定义在try外,赋值为nullBufferedWriter bw = null;try {// 实例化对象,创建一个名为"Bf.txt"的新文件,并将其用于创建一个新的BufferedWriter对象bw。// BufferedWriter类是用于写入文本的高效类,而FileWriter类是用于将字符写入文件的类。bw=new BufferedWriter(new FileWriter("Bf.txt"));bw.write("今晚月色很美");// 换行操作bw.newLine();bw.write("风也温柔");bw.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if(bw!=null) {bw.close();}} catch (IOException e) {e.printStackTrace();}}}
}

五 字符流 – 字符输入流系列 Reader 体系

1 Reader–用于读取字符的抽象类

// Reader类设计
public abstract class Reader

Reader – FileReader/BufferedReader

2 FileReader类设计

// 用于读取字符流 可实例化Reader类对象
Class FileReader// 例子-读一个
public class Test3 {public static void main(String[] args) {FileReader fr=null;try {fr=new FileReader("play.txt");// public int read()  读取一个字符// public int read(char[] chs)  读取多个字符存放在指定数组中,最后显示数组中的内容// public int read(char[] chs,int start,int len)// 读取多个字符存放在指定数组中,从start位置开始,执行len的长度// 文件字符不确定,故读取时会读取直到文件末尾,不确定循环次数时用while循环// read方法返回-1表示到文件末尾,若不是-1则表示指定字符对应的ASCII值// 定义接收读取数据的变量int data=0;while (((data=fr.read())!=-1)){System.out.println((char)data);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}// 例子-读一组
public class Test3 {public static void main(String[] args) {FileReader fr=null;try {fr=new FileReader("play.txt");// public int read()  读取一个字符// public int read(char[] chs)  读取多个字符存放在指定数组中,最后显示数组中的内容// public int read(char[] chs,int start,int len)// 读取多个字符存放在指定数组中,从start位置开始,执行len的长度// 文件字符不确定,故读取时会读取直到文件末尾,不确定循环次数时用while循环// read方法返回-1表示到文件末尾,若不是-1则表示指定字符对应的ASCII值// 定义一个临时存放读取到数据的数组char[] chs=new char[1024*5];int data=0;while (((data=fr.read(chs))!=-1)){// 数组定义过大时,直接打印数组会打印出多余的字符,故需将字符数组转为StringSystem.out.println(new String(chs,0, data));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

① 中文解析是有可能乱码:是因为文件的编码集与系统编码集不一致,需要调整编码集

② 读一个的方法是通过计算机底层的游标指针频繁的在文件和指定显示区域之间移动,对内存资源消耗大

③ 读一组是将所有的数据先读取到临时存储区域,最后将区域中的内容整体显示

④ 读一组降低了内存资源的消耗,但是定义字符数组长度不好确定,过大则浪费内存空间,此时可用BufferedReader解决

3 BufferedReader类设计

// 从字符输入流读取文本,缓冲字符,提供字符,数组和行的高效读取
public class BufferedReader// 创建指定大小的输入缓冲区的缓冲字符输入流,参数为(阅读器,缓冲区大小)
public BufferedReader(Reader in,int sz)// 使用默认大小输入缓冲区的缓冲字符输入流
public BufferedReader(Reader in)// 读一行文字,一行指由换行符\n或回车符\r中的任何一个或随后的换行符终止,至流的末尾则返回null
public String readLine()// 例子
public class Test4 {public static void main(String[] args) {BufferedReader br=null;try {br = new BufferedReader(new FileReader("play.txt"));String data=null;while ((data=br.readLine())!=null){System.out.println(data);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(br!=null){try {br.close();} catch (IOException e) {e.printStackTrace();}}}}
}
readLine方法的实现原理
// 模拟BufferedReader,并为每一行加上行号
public class DIYBufferedReader extends Reader {private  Reader in;private  int line;public DIYBufferedReader(Reader in){this.in=in;}// 实现readLine方法,读一个拼接一个,读到linux \n 或者windows \r\n时结束此行// windows读到\r 表示跳出本次循环,执行下一次// 以StringBuffer/StringBuilder完成String拼接public String DIYReadLine() throws IOException{// 显示数据的行号,自1递增line++;// StringBuffer拼接StringBuffer sb=new StringBuffer();// 定义临时存数据的变量,调用读的方法int data=0;// 循环读取数据while ((data=in.read())!=-1){// 读到\r跳过本次循环if('\r'==data){continue;}else if('\n'==data){return line+""+sb.toString();}else {sb.append((char)data);}}// 当读到最后一行 没有\n结尾 读取sb无法返回时需判断sb长度是否大于0if(sb.length()>0){return line+""+sb.toString();}return null;}@Overridepublic int read(char[] cbuf, int off, int len) throws IOException {return 0;}@Overridepublic void close() throws IOException {}
}// 测试
public class DIYTest {public static void main(String[] args) {DIYBufferedReader dbr=null;try {dbr=new DIYBufferedReader(new FileReader("play.txt"));String data=null;while ((data=dbr.DIYReadLine())!=null){System.out.println(data);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(dbr!=null){try {dbr.close();} catch (IOException e) {e.printStackTrace();}}}}
}

流总结

在流中定义操作数据的多种方法实质上都是调用计算机操作系统的写一个或者读一个的方法:

① Writer系列

写一个的方法(append(char ch)/write(int ch))

写一堆(write(String data)/write(char[] cbuf))

② Reader系列

读一个(read())

读一组/行(read(char[] cbuf)/readLine())

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

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

相关文章

基于单片机的电子密码锁设计

1.设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的电子密码锁,可设置四位密码,输入错误三次,报警灯亮起(红灯亮起),输入正确,绿灯闪烁三次。可通过LCD显示屏查看密码&…

LeetCode200. Number of Islands——DFS

文章目录 一、题目二、题解 一、题目 Given an m x n 2D binary grid grid which represents a map of 1’s (land) and 0’s (water), return the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertic…

智能生活:人工智能如何改变我们的日常

在科技迅猛发展的今天,人工智能(AI)已成为我们生活中的一部分。这项技术不仅仅是冷冰冰的代码和算法,而是一个全新的帮手,为我们的日常生活带来了前所未有的便利和智慧。本文旨在探讨人工智能如何影响我们的生活&#…

堆栈_栈实现队列

//请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): // // 实现 MyQueue 类: // // // void push(int x) 将元素 x 推到队列的末尾 // int pop() 从队列的开头移除并返回元素…

Linux常用命令----history命令

文章目录 在Linux中,history命令是一个极其有用的工具,它可以帮助用户查看和管理之前执行过的命令历史。这个功能对于快速查找和重用之前的命令特别有帮助。下面,我们将通过一些实例,详细介绍history命令的使用方法。 1. 基本使用…

ElasticSearch03

高级客户端 参考:尚硅谷网课以及笔记 Java REST Client 有两种风格: Java Low Level REST Client :用于Elasticsearch的官方低级客户端。它允许通过HTTP与Elasticsearch集群通信。将请求编排和响应反编排留给用户自己处理。它兼容所有的Elas…

高效率:使用DBeaver连接spark-sql

提高运行效率一般采取底层使用spark引擎替换成hive引擎的方式提高效率,但替换引擎配置较为复杂考虑到兼容版本且容易出错,所以本篇将介绍使用DBeaver直接连接spark-sql快速操作hive数据库。 在spark目录下运行以下命令,创建一个SparkThirdSe…

11-28 SpringBoot1

约定大于配置 简化Spring开发, spring boot致力于简洁,让开发者写更少的配置,程序能够更快的运行和启动。它是下一代javaweb框架,并且它是spring cloud(微服务)的基础。dev-ops:开发者,运维者。 springboot特点:优点面试重点 1)为基于Spring…

C++学习专栏【基础知识1】C++程序结构命名空间关键字标识符三字符序列

一、C程序结构 让我们看一个简单的代码&#xff0c;它将打印Hello World一词。 #include <iostream> using namespace std; int main() {cout << "Hello World"; // prints Hello Worldreturn 0; } C语言定义了几个头文件&#xff0c;其中包含对你的程序…

系统部署安装-Centos7-Kafka

文章目录 安装离线安装下载安装 安装 离线安装 下载 可以前往kafka的官网进行下载 https://kafka.apache.org/downloads安装 1.创建安装目录 mdkir /opt/software/kafka mkdir /opt/kafka 2.解压 sudo tar -xzf kafka_2.12-3.6.0.tgz -C /opt/kafka --strip-components…

c语言编程题经典100例——(46~50例)

1、实现字符串转数字。 在C语言中&#xff0c;可以使用库函数atoi()将字符串转换为整数。该函数接受一个字符串作为参数&#xff0c;并返回对应的整数值。以下是一个示例代码&#xff1a; #include <stdio.h> #include <stdlib.h> int main() { char str[] …

操作符keyof的作用是什么?

keyof 是 TypeScript 中的一个操作符&#xff0c;用于获取一个类型&#xff08;通常是一个对象类型或接口&#xff09;的所有公共属性名组成的字符串字面量联合类型。它常常用于类型安全的属性访问和映射类型的定义。 什么时候使用 keyof&#xff1f; 类型安全的属性访问&…

Java | 数据一致性校验遇到的时间序列化格式不一致问题如何解决?

关注&#xff1a;CodingTechWork 需求 设计 在开发过程中&#xff0c;有数据一致性校验需求。如下设计&#xff1a; 对于一些安全数据进行加密处理&#xff0c;并将这个加密值进行存储。当再次查询时&#xff0c;对当前数据进行加密并比对之前的加密值&#xff0c;看是否一…

ardupilot开发 --- 机载计算机 篇

0. 前言 关于机载计算机&#xff1b; 1. APSync 说到机载计算机Companion computer就不得不提另一个关键词APSync&#xff1b;APSync简化了机载计算机的设置&#xff0c;以便它可以为ArduPilot提供额外的功能&#xff0c;并简化与互联网服务的集成&#xff1b;提供日志下载和…

6、单片机与AT24C02的通讯(IIC)实验(STM32F407)

IIC简介 I2C(IIC,Inter&#xff0d;Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线&#xff0c;可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送&#xff0c;高速IIC总线一般可达…

如何使用简单的分支策略来保护您的 Git 项目

良好的分支策略可以使项目源代码获得一致且安全的数据&#xff0c;所有协作者可以在更短的生命周期内共享和访问这些数据。 您必须以灵活的方式设计项目模型&#xff0c;以便对所有成员角色和权限进行良好的管理。 我要谈论的并没有什么令人惊讶的新鲜事。您可能已经知道一些…

在idea中写sql语句,向数据库添加数据时,添加的字符串却显示???,解决方法

这是字符编码的问题 如何解决&#xff1a; 在idea的配置数据库的地方修改下边&#xff1a;mysql8版本和5版本差距不大。 在URL后加?useUnicodetrue&characterEncodingUTF8 例如 原来&#xff1a;String url “jdbc:mysql://localhost:3306/stu”; 改变后&#xff1a;St…

利用ARCGIS做地下水脆弱性评价分析

&#xff08;一&#xff09;行政边界数据、土地利用数据和土壤类型数据 本文所用到的河北唐山行政边界数据、土地利用数据和土壤类型数据均来源于中国科学院资源环境科学与数据中心&#xff08;https://www.resdc.cn/Default.aspx&#xff09;。 &#xff08;二&#xff09;地…

hadoop完全分布式搭建

文章目录 集群部署规划服务器准备Mobaxterm 远程登录实验前准备安装软件工具关闭防火墙 安装 JDK 和 Hadoop创建软件包目录解压软件包配置环境变量 集群搭建先创建 HDFS 工作目录和 LOG 目录配置集群配置环境配置 HDFS 主节点信息、持久化和数据文件的主目录配置 HDFS 默认的数…

技巧-GPU显存和利用率如何提高和batch_size/num_works等参数的实验测试

目录 简介实验测试显存占用问题GPU占用率波动问题num_work不是越大越好 总结 本专栏为深度学习的一些技巧,方法和实验测试,偏向于实际应用,后续不断更新,感兴趣童鞋可关,方便后续推送 简介 在PyTorch中使用多个GPU进行模型训练时&#xff0c;各个参数和指标之间存在一定的关系…