Java初学者笔记-08、IO流

I:负责把磁盘和网络中的数据读到程序内存中去。
O:负责把程序内存中的数据写到网络或者磁盘中。
按照流的内容,IO流分为字节流字符流
字节流:最小单位是字节。适合操作所有类型的文件。比如音频、视频、图片文本等的复制,转移。
字符流:只适合操作纯文本文件。比如读写txt,java文件等。
结合IO和字节流字符流,可分为下面4种。

  1. 字节输入流 InputStream
  2. 字节输出流 OutputStream
  3. 字符输入流 Reader
  4. 字符输出流 Writer

字节流

抽象类 对应的实现类
字节输入流 InputStream 文件字节输入流 FileInputStream
字节输出流 OutputStream 文件字节输出流 FileOutputStream

文件字节输入流 FileInputStream

作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。

使用构造器创建文件字节输入流

创建字节输入流管道与源文件接通。

public FileInputStream(File file)
public FileInputStream(String pathName) //一般用这个
InputStream is = new FileInputStream("good.txt");

字节输入流管道对象的read()方法

方法 说明
public int read() 每次读取一个字节返回,如果发现没有数据可读会返回-1
public int read(byte[] buffer) 每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1
// 1.创建管道与文件连接
InputStream is = new FileInputStream("111.txt");
// 2.定义一个字节数组用于每次读取字节
byte[] buffer = new byte[1024];
// 3.定义一个变量记住每次读多少字节
int len;
// 4.循环读取并转成字符
while( (len = is.read(buffer)) != -1) {String str = new String(buffer, 0 ,len);System.out.print(str);
}is.close();

文件字节输出流 FileOutputStream

作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。

使用构造器创建文件字节输出流

构造器 说明
public FileOutputStream(File file) 创建字节输出流管道与源文件对象接通
public FileOutputStream(String filepath) 创建字节输出流管道与源文件路径接通
public FileOutputStream (File *file, boolean append) 创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream(String filepath, boolean append) 创建字节输出流管道与源文件路径接通,可追加数据

字节输出流管道对象的write()方法

方法名称 说明
public void write(int a) 写一个字节出去
public void write(byte[] buffer) 写一个字节数组出去
public void write(byte[] buffer, int pos , int len) 写一个字节数组的一部分出去
public void close() throws IOExcention 关闭流
byte[] bytes = "我爱你中国666".getBytes();
os.write(bytes); //我爱你中国666
os.write(bytes,0,3); //我
os.close();

换行符一般使用 "\r\n"
使用完流之后,需要马上关闭,因为这个管道占用的是硬件总线资源。

字节流的应用——文件复制

任何文件的底层都是字节,字节流做复制,是一字不漏的转移完全部字节,复制前后的文件格式一致就没问题!
复制过去必须要带文件名!

InputStream fis = new FileInputStream(srcPath);
OutputStream fos = new FileOutputStream(destPath);byte[] buffer = new byte[1024];
int len;
while((len = fis.read(buffer)) != -1){fos.write(buffer,0,len);
}fis.close();
fos.close();

管道资源的释放方案

如何确保流一定能够被释放?如果发生意外,导致代码没有执行close()方法,怎么办?

方案一:使用finally代码区(不推荐)

finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。

//1.创建一个文件字节输入流管道与源文件连通
InputStream fis = null;
Outputstream fos = null;
try {fis = new FileInputStream(srcPath);fos = new FileOutputStream(destPath);//2.读取一个字节数组,写入一个字节数组byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer))!= -1) {fos.write(buffer, 0, len);}System.out.println("复制成功!");
} catch (Exception e) {e.printStackTrace();
} finally {//3.释放资源try {if(fos != null) fos.close():} catch (Exception e) {e.printStackTrace;}try {if(fis != null) fis.close;} catch (Exception e) {e.printStackTrace;}
}

方案二:使用try-with-resource(推荐)

JDK7开始提供的更简单的资源释放方案。

try (// 1.在这里定义资源,用完后会自动调用其close方法关闭!InputStream fis = new FileInputStream(scPath);OutputStream fos = new FileOutputStream(destPath);){// 2.读取一个字节数组,写入一个字节数组byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer))!= -1) {fos.write(buffer, 0, len);}      system.out.println("复制成功!");
} catch (Exception e) {e.printStackTrace);
}
  1. 资源不一定是管道资源,资源一般指的是最终实现了AutoCloseable接口的资源。
  2. 资源使用完毕后,会自动调用其close()方法,完成对资源的释放。

字符流

抽象类 对应的实现类
字符输入流 Reader 文件字符输入流 FileReader
字符输出流 Writer 文件字符输出流 FileWriter

文件字符输入流 FileReader

作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。

使用构造器创建文件字符输入流

创建字符输入流管道与源文件接通。

public FileReader(File file)
public FileReader(String pathName) //一般用这个

字符输入流管道对象的read()方法

方法 说明
public int read() 每次读取一个字符返回,如果发现没有数据可读会返回-1
public int read(byte[] buffer) 每次用一个字符数组去读取数据,返回字符数组读取了多少个字节,如果发现没有数据可读会返回-1

文件字符输入流每次读取多个字符,性能较好,而且读取中文是按照字符读取,不会出现乱码!这是一种读取中文很好的方案。

  1. 创建文件字符输入流管道。
  2. 定义一个字符数组,每次读多个字符。
  3. 定义一个变量记录读取长度。
  4. 循环读取。

文件字符输出流 FileWriter

使用构造器创建文件字符输出流

构造器 说明
public FileWriter(File file) 创建字符输出流管道与源文件对象接通
public Filewriter(String filepath) 创建字符输出流管道与源文件路径接通
public FileWriter (File file, boolean append) 创建字符输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath, boolean append) 创建字符输出流管道与源文件路径接通,可追加数据

字符输出流管道对象的write()方法

方法名称 说明
void write(int c) 写一个字符
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部分

字符输出流管道对象的刷新与关闭

方法名称 说明
public void flush() throws IOException 刷新流,就是将内存中缓存的数据立即写到文件中去生效!
public void close() throws IOException 关闭流的操作,包含了刷新

为什么要刷新?
在管道里有内存缓冲区,不是每个字符都要和磁盘进行耦合,而是在内存缓冲区先集中一波,只做一次IO统一刷新到磁盘中。
刷新就是通知内存赶紧将缓冲区的数据全部写出去。
关闭包含了刷新!

缓冲流-提高性能

待更新

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

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

相关文章

Keepalived ip漂移

当 Nginx 部署在多个服务器节点上,且希望在一个节点故障时,客户端流量自动切换到另一个节点时,需要使用 IP 漂移。 这里使用使用 Keepalived 实现 IP 漂移 一.安装配置 Keepalived安装 Keepalived 在所有运行 Nginx 的节点上安装 Keepalived:# 在 CentOS 上 sudo yum insta…

怎么添加财务部打印机

添加打印机输入以下地址输入用户名和密码验证 # administrator # 123456自动安装驱动,安装驱动完成即可

https证书管理系统-自动化部署

免费HTTPS证书(SSL证书)- 自动化部署 步骤1:复制生成的linux脚本命令步骤2:拷贝到部署站点的linux服务器上运行步骤三:刷新页面,即可看到此时的节点记录步骤四:点击“配置证书”,选择证书后自动部署步骤五:节点部署已完成,后续自动调度部署,无需干预

vmware vCenter证书故障处理

故障现象:重启vCenter后出现503错误:解决方法: 一、登陆ssh到vcenter,重新生成证书 先关掉HA,不然证书管理会报错。 做好vCenter快照 执行证书管理命令: /usr/lib/vmware-vmca/bin/certificate-manager按照提示输入:其中IP地址和域名必须输入自己集群的,域名…

从情感分析到热点事件排名:思通数科舆情监测系统的全面分析功能

思通数科的舆情监测分析系统通过多维度数据采集与分析,为用户提供全面、准确的舆情信息。本文将根据思通数科舆情监测分析系统的主要功能模块,详细介绍系统的各项监测与分析内容,以及其在实际应用中的价值。一、最新资讯 思通数科舆情监测系统首先为用户提供了最新的资讯动态…

2025/1/20

今天继续学习Android Studio,学习了布局,有LinearLayout、相对布局、FrameLayout的布局方式,学习了各个组件内部的小组件,以及TextView 和View的基础控件,用手机usb进行调试,突发奇想,想整一个简单的app,调试成功后,关闭电脑程序,手机端app会卡退,了解到需要apk的知…

manim边做边学--交替变换

今天,我们将介绍 Manim 中两个用于交替变换的动画类:CyclicReplace 和 Swap。 无论是在展示数学概念的动态变化,还是在图形设计中呈现元素的巧妙交互,这两个动画类都扮演着重要角色。 它们以各自独特的方式,为我们提供了丰富的创意表达空间。CyclicReplace:循环替换一组对…

认识西门子ET 200SP分布式I/O系统的接口模块

文章来源:认识西门子ET 200SP分布式I/O系统的接口模块西门子ET 200SP分布式I/O系统由接口模块和信号模块组成,信号模块插接在底板上,通过底板与接口模块相连接。一个接口模块可以连接多个信号模块,具体的数量与接口模块的类型有关。今天这篇文章,我们来介绍下接口模块。 接…

【DingTalk】JsApi 地理位置相关

最近接手同事新开的半成品项目,钉钉嵌入的地图API测试中出现了BUG 钉钉API文档见此: https://open.dingtalk.com/document/orgapp/obtain-current-geographic-location-information-single-positioning一、IOS位置获取组件无法打开 安卓手机是可以不需要JSAPI授权配置的,这点…

“国产双系统”出炉!复旦微FMQL20SM非对称AMP:Linux + 裸机

“非对称AMP”双系统是什么 AMP(Asymmetric Multi-Processing),即非对称多处理架构。“非对称AMP”双系统是指多个核心相对独立运行不同的操作系统或裸机应用程序,如Linux + RTOS/裸机,但需一个主核心来控制整个系统以及其它从核心。每个处理器核心相互隔离,拥有属于自己的…

CudaSPONGE与PySAGES初步性能测试

接前一篇关于PySAGES结合CudaSPONGE使用方法的文章,本文主要还是使用了一样的测试案例。仅通过不同的测试步长,来定性的分析PySAGES的MetaDynamics实现方案结合MD软件之后的性能数据。技术背景 在前面的一篇博客中,我们介绍过CudaSPONGE的基础使用方法、CudaSPONGE调用Pytho…

记一次移动光猫(GM219-S)安全测试

前言 过个年,WiFi密码忘记了…光猫管理密码也忘记了(这个光猫也不支持物理按钮重置设置),但是手机还连着WiFi,正规操作找回不了密码,那就用咱们测试的思维来试试PWN掉这个路由器。 过程 未授权获取WiFi连接密码 还好之前没闲着,发现管理的几个未授权访问的接口如下: 获取…