JavaSE20——IO流

news2024/11/17 13:41:50

IO流

1 Java IO流

  • I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
  • Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行

I(Input): 输入流指的是将数据以字符或字节形式从外部媒介比如文件、数据库等读取到内存中。
通过Java程序读取硬盘上的某个文件内容就需要使用输入流。

O(Output):输出流指的是将内存中的数据写入外部媒介。
通过Java程序将内容写入到硬盘上的某个文件就需要使用输出流。

流(Stream)源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的 通信 ,或 读写 外围设备、外部文件等。

2 字节流

字节流和字符流:

字节流包含:InputStream和OutputStream

字符流包含:Reader和Writer

字节流的概念:字节流是由字节组成的,字节流是最基本的,所有的InputStream和OutputStream的子类都是字节流,主要用在处理二进制数据,它是按字节来处理的。

字符流的概念: 字符流是由字符组成的,Java里字符由两个字节组成,所有的Reader和Writer的子类都是字符流,主要用在处理文本内容或特定字符。

字节流和字符流的区别:

在这里插入图片描述

1、 读写的时候一个是按字节读写,一个是按字符。
2、需要对内容按行处理,一般会选择字符流。
3、只是读写文件,和文件内容无关的(下载、复制等),一般选择字节流

2.1 字节流 FileInputStream

FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等

常用方法:

方法名:解释
read()从此输入流中读取下一个数据字节。
close()关闭此输入流并释放与此流关联的所有系统资源。

案例

FileInputStream fi = new FileInputStream( "D:\\Lenovo\\info.txt" );
int i = fi.read();
int allRead = 0;
while (i != -1)// 判断文件读完的条件
{
	System.out.print((char) i); // 注意:这里简单地把读到的字节转为字符输出,不适用于所有情况。
	allRead++;
	i = fi.read();
}

2.2 字节流FileOutputStream

常用方法:

方法名:解释
close()关闭此输出流并释放与此流有关的所有系统资源。
flush()刷新此输出流,并强制将所有已缓冲的输出字节写入该流中。
write(byte[] b)将 b.length 个字节写入此输出流。

案例

使用FileOutputStream将“lenovo”写入到D:/Lenovo/info.txt文件中

byte[] data = "lenovo".getBytes();
FileOutputStream fo = new FileOutputStream("D:\\Lenovo\\info.txt");
fo.write(data);
fo.close();

综合案例:

1 使用FileInputStream/FileOutputStream进行读写文件。

使用字节流的方式D:/Lenovo/info.txt文件复制一份。

FileInputStream fis = new FileInputStream("D:\\Lenovo\\info.txt");
FileOutputStream fos = new FileOutputStream("D:\\Lenovo\\info1.txt");
int read = fis.read();
while (read != -1) {
	fos.write(read);
	read = fis.read();
}
// fos.flush();
fos.close();

2 将D盘中的Lenovo文件夹,复制到C盘

File dirs = new File("D:\\Lenovo"); // 要复制的目标文件夹
if (dirs.exists() && dirs.isDirectory()) { // 判断是否存在和是否是文件夹
	File newDirs = new File(C:\\Lenovo); // 判断C盘有没有Lenovo文件夹
	if (!newDirs.exists()) {
		newDirs.mkdir(); // 如果没有先创建一个,文件夹是不可以复制的,需要创建出来
}
File[] files = dirs.listFiles(); // 取出要复制的文件夹中的子项
for (int i = 0; i < files.length; i++) { // 逐一将文件写入到C盘Lenovo文件夹中
	FileInputStream fis = new FileInputStream(files[i].getAbsolutePath());
	FileOutputStream fos = new FileOutputStream("C:\\Lenovo\\"+ files[i].getName());
	int read = fis.read();
	while (read != -1) {
		fos.write(read);
		read = fis.read();
	}
	fos.flush();
	fos.close();
	}
}

3 字符流

Java中的字符流是用于处理字符数据的输入输出流。字符流和字节流的区别在于字符流是按照字符进行读写,可以直接处理Unicode字符。

3.1 Reader子类:

1、BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
2、FileReader 从InputStreamReader类继承而来,该类按字符读取流中数据。

BufferedReader和FileReader的常用方法

BufferReader

方法名:解释
readLine()读取一个文本行。
close()关闭该流并释放与之关联的所有资源。

FileReader:

方法名:解释
read()读取单个字符。
close()关闭该流并释放与之关联的所有资源。

案例1

使用BufferedReader和FileReader将D:/Lenovo/info.txt文件内容输出到控制台上

BufferedReader br = null;
// 构造BufferedReader对象
br = new BufferedReader(new
FileReader("D:\\Lenovo\\info.txt"));
String line = null;
while ((line = br.readLine()) != null) {
	// 将文本打印到控制台
	System.out.println(line);
}

案例2 读取一个文件中的数据

public class ReadTxt {
    public static void main(String[] args) {

        try {
            FileReader fr = new FileReader("D://lenovo/c.txt");
            // 读取  字符流
            BufferedReader br = new BufferedReader(fr);
            // 使用循环读取数据
            String str = null;
            while (   (str = br.readLine()) != null     ){
                System.out.println(str);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.2 Writer子类:

1.BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
2.FileWriter 从OutputStreamWriter类继承而来,该类按字符向流中写入数据。

BufferWriter常用api

方法解释
write(String s, int off, int len)写入字符串的某一部分。
close()关闭此流,但要先刷新它。

FileWriter常用api

方法解释
write(String str, int off, int len)写入一部分字符串。
close()关闭此流,但要先刷新它。

案例1:

public class WriteTest {
    public static void main(String[] args) {
        try {
            FileWriter fw = new FileWriter("D://lenovo/hello.txt",true);//true:向后追加数据
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write("hello lenovo !@!!!\n");//把数据写入到缓冲区  \n:转义字符,表示换行符
            bw.write("hello world\t~~~~~!!!!!!!!!!");//   \t  tab
            bw.newLine();//换行
            bw.write("jinanInfo");
            bw.flush();//强制输出缓冲区的数据
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

案例2

使用BufferedWriter和FileWriter将“lenovo"写入到D:/Lenovo/info.txt文件中。

BufferedWriter bufferedWriter = null;
bufferedWriter = new BufferedWriter(new FileWriter("D:\\Lenovo\\info.txt"));
bufferedWriter.write("Lenovo");
bufferedWriter.newLine();
bufferedWriter.write("!");
bufferedWriter.flush(); // flush非常重要
bufferedWriter.close(); // 文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担

案例3

使用字符流的方式将D:/Lenovo/info.txt文件复制一份

BufferedReader bre = null;
BufferedWriter bw = null;// 定义一个流
String file = "D:\\Lenovo\\info.txt";
bre = new BufferedReader(new FileReader(file));// 此时获取到的bre就是整个文件的缓存流
bw = new BufferedWriter(new FileWriter(new File("D:\\Lenovo\\info1.txt”);// 确认流的输出文件和编码格式,此过程创建了“test.txt”实例
String str = "";
while ((str = bre.readLine()) != null) // 判断最后一行不存在,为空结束循环
{
	bw.write(str);// 将要写入文件的内容,写入到新文件
	bw.newLine();
}
bw.close();// 关闭流
bre.close();// 关闭流

案例4

将D盘中的Lenovo文件夹,复制到C盘

for (int i = 0; i < files.length; i++) { // 逐一将文件写入到C盘Lenovo文件夹中
bre = new BufferedReader(new FileReader(files[i].getAbsolutePath()));// 此时获取到的bre就是整个文件的缓存流
bw = new BufferedWriter(new FileWriter(new File("C:\\Lenovo\\" + files[i].getName())));// 确认流的输出文件和编码格式,此过程创建了“test.txt”实例
String str = "";
while ((str = bre.readLine()) != null)
	// 判断最后一行不存在,为空结束循环{
	bw.write(str);// 将要写入文件的内容,写入到新文件
	bw.newLine();
}
bw.close();// 关闭流
bre.close();// 关闭流

案例5

将字符串“Hello Lenovo”追加到D:/Lenovo/info.txt文件内容的尾部

// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
FileWriter writer = new FileWriter("D:\\Lenovo\\info.txt", true);
writer.write("Lenovo");
writer.close(); // 文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。

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

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

相关文章

世界前沿技术发展报告2023《世界航空技术发展报告》(七)机载系统与武器技术

&#xff08;七&#xff09;机载系统与武器技术 1.机载系统技术1.1 美国推进商用5G技术在航空装备中的应用1.2 人工智能技术在航空中的应用日益增多1.3 美国空军研究实验室推出综合座舱感知技术1.4 美国空军为固定翼飞机驾驶员选定新一代头盔1.5 美国DARPA探索通过机载光能量中…

用LibreOffice在excel中画折线图

数据表格如下。假设想以x列为横坐标&#xff0c;y1和y2列分别为纵坐标画折线图。 选择插入-》图表&#xff1a; 选择折线图-》点和线&#xff0c;然后点击“下一步”&#xff1a; 选择&#xff1a;列中包含数据序列&#xff0c;然后点击完成&#xff08;因为图挡住了数据…

【多线程面试题十五】、synchronized可以修饰静态方法和静态代码块吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;synchronized可以修饰静…

生物信息学分析-blast序列比对及结果详细说明

1. 软件说明 Blast是一种基于序列比对的分析工具&#xff0c;可以用于寻找生物序列之间的同源性&#xff0c;它的全称是Basic Local Alignment Search Tool。 Blast有多种版本和用途&#xff0c;最常见的是基于Web的Blast和本地安装的Blast程序。Web版Blast可以直接在NCBI网站…

小白如何在一个月写一篇论文(中文核心,SCI)

小白如何半年发3篇sci的我教你如何快速“水”一篇sci论文_哔哩哔哩_bilibili 计算机视觉&#xff0c;cv领域 半年发3篇sci的我教你如何快速“水”一篇sci论文 计算机视觉(辅导 SCI EI 核心) 微信&#xff1a;whbwqq123或主页加up 小白如何快速写出一篇论文并成功发表&…

图像处理与计算机视觉--神经网络--手动计算

文章目录 1.简单感知器分类模型1.1.简单感知器分类模型介绍1.2.简单感知器分类模型实现 2线性神经元分类模型2.1.线性神经元分类模型介绍2.2.线性神经元分类模型实现 3.基于遍历学习的神经网络计算模型3.1.基于遍历学习的神经网络计算模型介绍3.2.基于遍历学习的神经网络计算模…

Windows原生蓝牙编程 第二章 选取设备输入配对码并配对【C++】

蓝牙系列文章目录 第一章 获取本地蓝牙并扫描周围蓝牙信息并输出 第二章 选取设备输入配对码并配对 文章目录 前言头文件一、选择想要配对的设备并设置配对码1.1 设置配对码1.2 选择设备并配对 二、全部代码三、测试结果总结 前言 接着第一章&#xff0c;我们已经把扫描到的蓝…

Composition API的引入

目录 全局API的移除和替代 插件的改进 TypeScript支持的增强 优势 劣势 总结 Vue.js 3.x版本引入了Composition API&#xff0c;这是一个全新的API风格&#xff0c;旨在提高代码的可读性和重用性。Composition API使我们可以根据逻辑相关性组织代码&#xff0c;而不是按照…

3.3每日一题(变量可分离方程)

1、判断类型选方法&#xff1a;等式中分别提一个x、y出来&#xff0c;形成了x与y相乘的等式&#xff1b;为变量可分离类型 2、不一定非得把y解出来&#xff0c;化成上述的等式即可&#xff08;为隐函数的方程解&#xff09; 注&#xff1a;等式不定积分后记得&#xff0b;一个…

Oracle Exadata X7-2掉电宕机导致集群无法启动处理过程

文章目录 前言一、当前的状态是什么&#xff1f;二、集群启动异常怀疑对象1.排查心跳网络异常ping自己私有IP延迟高ping其它主机私有IP不通 2.是否发生过重启 三、日志信息收集ocssd.trc集群crs日志cell的griddisk状态及报错 四、IB交换机的问题排查处理五、紧急恢复业务在IB完…

订水商城H5实战教程-05权限控制

目录 1 判断用户是否登录2 创建事件流3 获取不到Userid的问题4 权限控制整体效果 我们上一篇讲解了用户注册的功能&#xff0c;当用户注册完毕的时候再次打开小程序的时候就需要验证权限。权限分为两类&#xff0c;第一类是判断用户是否注册&#xff0c;第二类是当前用户具备什…

什么是鉴权?一篇文章带你了解postman的多种方式

一、什么是鉴权&#xff1f; 鉴权也就是身份认证&#xff0c;就是验证您是否有权限从服务器访问或操作相关数据。发送请求时&#xff0c;通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就是一个门禁&#xff0c;您想要进入室内&#xff0c;必须通…

windows应用软件扫描报告 不告谱 要钱

chatGPT开路&#xff0c;帮找。 当你想要查找Windows软件的漏洞而不涉及查看源代码时&#xff0c;你可以使用一些专门设计用于扫描漏洞的工具。这些工具通常会检查已安装的软件和操作系统的漏洞&#xff0c;并提供建议或修补程序。以下是一些可以用于查找Windows软件漏洞的工具…

数据结构之顺序表详解

hello&#xff0c;大家好&#xff0c;今天的内容是关于顺序表的&#xff0c;其实之前也发过文章&#xff0c;但是那个时候水平还是差了一点&#xff0c;有些地方不是很详细&#xff0c;这次会把每个点都讲清楚&#xff0c;也当给自己在复习一遍。 顺序表在本质上就是数组&#…

【智能座舱系列】- 深度解密小米Hyper OS,华为HarmonyOS区别

上一篇文章《小米的澎湃OS到底牛不牛?与鸿蒙系统之间差距有多大》,从多个方面比较了小米Hyper OS 与 华为HarmonyOS的区别,本篇文章继续从架构层面深度解读两者本质的区别。 小米澎湃OS是“以人为中心,打造人车家全生态操作系统”,该系统基于深度进化的Android以及自研的V…

SpringMVC Day 07 : 表单验证

前言 表单验证在Web开发中是非常常见和重要的一部分&#xff0c;它用于确保用户提交的数据符合预期的规则和限制。 通过表单验证&#xff0c;我们可以有效地捕获并处理用户输入中的错误或不正确的数据&#xff0c;从而提高应用程序的数据质量和用户体验。在本教程中&#xff…

Gerrit 事件监听实现

环境 Centos 7.9 Gerrit 2.15 Gerrit 2.15容器搭建 docker-compose.yml version: 3 services:gerrit:image: gerritcodereview/gerrit:2.15ports:- 8080:8080- 29418:29418volumes:- ./review_site:/var/gerrit/review_siteenvironment:- CANONICAL_WEB_URLhttp://localhos…

.jnlp

首先配置电脑的java环境。 百度搜索jre下载&#xff0c;会有很多结果&#xff0c;一般选择官网进行下载。 下载正确的jre版本。 我的电脑是windows 64位&#xff0c;根据你自己电脑的情况选择版本进行下载。不懂自己电脑是多少位的可以看下一步。 查看电脑是64位还是32…

并行和并发有什么区别?

并行和并发 并行和并发最早其实描述的是 Java 并发编程里面的概念。他们强调的是 CPU 处理任务的能力。简单来说&#xff1a; 并发&#xff0c;就是同一个时刻&#xff0c;CPU 能够处理的任务数量&#xff0c;并且对于应用程序来说&#xff0c;不会出现卡顿现象。并行&#x…

如何改善设备综合效率(OEE)并提高工厂的生产力

在现代制造业中&#xff0c;提高设备综合效率&#xff08;Overall Equipment Efficiency&#xff0c;OEE&#xff09;是企业追求高效生产和优化生产能力的重要目标之一。OEE是一个关键的绩效指标&#xff0c;可以帮助企业评估设备的利用效率、生产效率和质量水平。本文将从三个…