I O 流

IO流

啥是流
1IO:输入 \ 输出流:一种抽象概念,是对数据传输的总称,也就是说,数据在设备间的传输称为流,流的本质,是数据传输IO流,就是用来,处理设备间的数据传输问题的。如:文件复制、文件上传、文件下载2、按照,数据类型,分类1、字节流:字节输入流:InputStream作为基类字节输出流:OutputStream作为基类2、字符流:字符输入流:字符输入流 Reader作为基类字符输出流:字符输出流 Writer作为基类按照,流向,分类1、输出流:OutputStreamWriter作为基类2、输入流:InputStreamReader作为基类一般来说,所说的"IO流的分类"是按照"数据类型"来分的。 
字节流读数据
1"字节流"抽象基类InputStream:这个抽象类,是,字节输入流的所有类的超类OutputStream:这个抽象类,是,字节输出流的所有类的超类子类名特点:子类名称,都是以其父类名作为子类名的后缀
常用方法
1InputStream类的常用方法int read(int b)用于从输入流中读取下一个字节的数据,并返回这个字节的整数值(0-255),当调用 read(int b) 方法时,它会从输入流中读取下一个字节的数据,并将这个字节的整数值返回,如果成功读取到数据,返回值是表示该字节的整数值(0-255),如果已经到达流的末尾,即没有更多可用的数据可读取,此时返回值是 -1,这个方法的返回值是一个整数,范围在 0255 之间,表示读取到的字节的值。如果返回 -1,表示已经读取到流的末尾,没有更多数据可供读取。总之,int read(int b) 方法用于逐个读取字节数据,并以整数形式返回每个字节的值,直到到达流的末尾为止。int read(byte[] b)从输入流中读取数据,并将数据存储在"缓冲区数组b"中,它返回实际读取的字节数,如果,因为已经到达流的末尾,而没有更多的数据可读,则可能返回小于数组长度的值,如果,发生I/O错误,将抛出IOException。说白了就是:fis.read(buffer)方法,返回的是实际从输入流中读取的字节数,具体来说,这个方法的作用是,从"FileInputStream对象fis"中读取数据,并将读取到的字节内容,存储到指定的"字节数组buffer"中。当 fis.read(buffer)方法被调用时,它会尽可能地读取数据填充到"buffer数组"中,返回实际读取的字节数,如果,成功读取了数据,则返回的是实际读取的字节数,如果,已经到达文件末尾,返回值将是"-1"。再解释:fis.read(buffer) 是一次性读取数据到指定的"字节数组buffer"中,返回值bytesRead是"实际读取的字节数,而不是总的字节数"。如果bytesRead的值,等于 buffer的长度,表示,整个 buffer 数组已经被填满,里面包含了读取的数据。如果bytesRead的值,小于 buffer的长度,表示,只有部分数据被读取到 buffer 中。int read(byte[] b, int off, int len)从输入流中读取最多len个字节的数据,并将这些数据存储到字节数组b中,从数组索引off开始的位置,它返回实际读取的字节数,如果,因为已经到达流的末尾,而没有更多的数据可读,则返回的字节数可能小于lenvoid close()关闭输入流,关闭一个已经关闭的流是合法的,调用多次close()方法不会有任何效果,一旦流被关闭,任何后续尝试从流中读取数据或写入数据都将抛出IOException2InputStream类,常用的子类有FileInputStream,用于从文件中读取数据FileInputStream:是Java的一个类,它用于,从文件中读取原始的字节流,当你需要读取文件内容,并将其作为字节序列处理时,可以使用FileInputStream类。这个类的构造函数:FileInputStream(String name)接受一个String类型的参数,这个参数是文件在文件系统中的路径名,当调用这个构造函数时,Java会在指定的路径下打开这个文件,并创建一个与这个文件相连接的FileInputStream对象,一旦对象被创建,你就可以使用它的方法来读取文件内容了。
例子

需求:"读取文件中的内容,然后输出"import java.io.FileInputStream;
import java.io.IOException;
public class StudyIO {public static void main(String[] args) {String filePath = "D:/io/hello.txt";FileInputStream fis = null;try {// 创建一个FileInputStream对象,打开指定路径的文件fis = new FileInputStream(filePath);// 创建一个字节数组作为缓冲区byte[] buffer = new byte[1024];int bytesRead;// 读取文件内容到缓冲区,直到文件末尾while ((bytesRead = fis.read(buffer)) != -1) {// 处理读取到的字节,这里只是简单地将它们转换为字符串并打印String data = new String(buffer, 0, bytesRead);System.out.print(data); // ------ 打印的是 D:/io/hello.txt 这个hello.txt的内容}} catch (IOException e) {// 处理可能发生的异常,如文件未找到或读取错误e.printStackTrace();} finally {// 关闭FileInputStream,释放系统资源try {if (fis != null) {fis.close();}} catch (IOException e) {e.printStackTrace();}}}
}
字节流写数据
  "字节流"抽象基类InputStream:这个抽象类,是,字节输入流的所有类的超类OutputStream:这个抽象类,是,字节输出流的所有类的超类子类名特点:子类名称,都是以其父类名作为子类名的后缀
常用方法
1OutputStream类的常用方法void write(int c)将指定的字节(通过其整数表示形式)写入文件输出流,实际上,它会取int参数的低8(即一个字节)并将其写入文件。FileOutputStream fos = new FileOutputStream("example.txt");fos.write(65); // 写入ASCII码为65的字符,即'A'fos.close();void write(byte[] buf)将整个字节数组写入文件输出流。它会写入数组中的每个字节,直到数组结束。byte[] data = {'H', 'e', 'l', 'l', 'o'};FileOutputStream fos = new FileOutputStream("example.txt");fos.write(data); // 写入字符串"Hello"的字节表示fos.close()void write(byte[] b, int off, int len)从字节数组的指定偏移量开始,写入指定长度的字节到文件输出流,off:开始写入的数组中的偏移量,len:要写入的字节数,byte[] data = {'a', 'b', 'c', 'd', 'e', 'f'};FileOutputStream fos = new FileOutputStream("example.txt");fos.write(data, 2, 3); // 从偏移量2开始,写入3个字节,即写入"cde"fos.close();void close()此方法关闭文件输出流,一旦流被关闭,任何进一步的写操作都会抛出IOException2"OutputStream类"常用的子类有"FileOutputStream",用于向文件中写入数据,a. FileOutputStream(String name)创建一个文件输出流以指定的名称写入文件,如果文件不存在,则尝试创建它;如果文件已经存在,则其内容将被覆盖。b. FileOutputStream(File file)使用"File对象"创建一个文件输出流以写入文件。c. FileOutputStream(FileDescriptor fdObj)使用"文件描述符"创建一个文件输出流,文件描述符,通常与已经打开的文件相关联。使用"FileOutputStream"时,通常会使用"try-with-resources"语句,来确保流在不再需要时自动关闭,这样可以避免资源泄漏。
例子
import java.io.FileOutputStream;
import java.io.IOException;public class StudyIO_2 {public static void main(String[] args) {// String testWriteName = "test.txt"; // 在项目的目录下创建test.txtString testWriteName = "D:/io/test.txt"; // 在指定路径下创建test.txtbyte[] data = "Hello-World!".getBytes();try(FileOutputStream fos = new FileOutputStream(testWriteName)){fos.write(data);System.out.println("Data written to " + testWriteName);} catch (IOException e){e.printStackTrace();System.out.println("Data written to " + testWriteName);}}
}
文件复制功能
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {public static void main(String[] args) {/*应该在循环外部,创建FileOutputStream,因为,在循环内部创建的话,每次读取到数据块时都会创建一个新的 FileOutputStream 对象,这会导致每次迭代时都覆盖 dnf-2.txt 文件的内容。*/FileOutputStream fos = null;FileInputStream fis = null;try {fis = new FileInputStream("D:/io/test.txt");fos = new FileOutputStream("D:/io/dnf-2.txt");byte[] buffer = new byte[1024];int bytesRead;// 读取文件并写入另一个文件while ((bytesRead = fis.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead); // 写入读取到的数据块}} catch (IOException e) {e.printStackTrace();} finally {try {if (fis != null) fis.close();if (fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}}}
}
字节缓冲流

1"BufferedOutputStream":该类实现缓冲输出流,通过设置这样的输出流,应用程序,可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。构造方法:字节缓冲输出流 BufferedOutputStream(OutputStream out)2"BufferedInputStream":创建BufferedInputStream,将创建一个内部的缓冲数组,当从流中读取,或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节构造方法:字节缓冲输入流 BufferedInputStream(InputStream in)"综合1、2":为什么,构造方法需要的是字节流,而不是具体的文件或者路径呢?因为,字节缓冲流,仅仅提供缓冲区,而真正的读写数据,还得依靠"基本的字节流对象"进行操作。"chatGPT的解释":在JavaI/O流框架中,"BufferedOutputStream""BufferedInputStream",都是用于提高I/O操作效率的缓冲流。a. 它们的工作原理是:在内存中创建一个缓冲区,这个缓冲区用于临时存储要写入或读取的数据。当向输出流写入数据时,数据首先被写入缓冲区,直到缓冲区满或者显式地调用flush()方法,才会将数据从缓冲区写入到底层的输出流。当从输入流读取数据时,会首先尝试从缓冲区中读取,如果缓冲区为空,则再从底层输入流中读取数据填充缓冲区。b.构造方法,需要字节流(OutputStreamInputStream)作为参数,而不是具体的文件或路径,是因为,"BufferedOutputStream""BufferedInputStream" 被设计为通用的缓冲流,它们可以与任何实现了"OutputStream""InputStream" 接口的流对象一起使用,这意味着,它们不仅可以用于文件I/O,还可以用于网络通信、内存流(ByteArrayOutputStreamByteArrayInputStream)等任何需要进行字节读写的地方。"总之"BufferedOutputStream(OutputStream out)这里的"out参数",是一个基本的"字节输出流对象",它可以是任何类型的输出流,比如:FileOutputStream用于写入文件,SocketOutputStream用于网络通信等,BufferedOutputStream会将这个输出流包装起来,提供缓冲功能。BufferedInputStream(InputStream in)这里的"in参数"是一个基本的"字节输入流对象",它也可以是任何类型的输入流,比如:FileInputStream用于读取文件,SocketInputStream用于从网络读取数据等,BufferedInputStream会将这个输入流包装起来,提供缓冲功能。
例子

"需求":有一个"source.txt"的文件,我们想要将其内容复制到一个新的文件"target.txt"中。"代码"import java.io.*;
public class BufferedStreamsExample {public static void main(String[] args) {File sourceFile = new File("D:/io/source.txt");File targetFile = new File("D:/io/target.txt");try (// 创建BufferedInputStream对象,读取源文件BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));// 创建BufferedOutputStream对象,写入目标文件BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile));) {// 创建一个字节数组作为缓冲区byte[] buffer = new byte[1024];int bytesRead;// 读取源文件的内容到缓冲区,直到没有更多的数据可读while ((bytesRead = bis.read(buffer)) != -1){bos.write(buffer, 0, bytesRead);}// 刷新输出流以确保所有数据都被写出bos.flush();System.out.println("文件复制完成");} catch (IOException e){e.printStackTrace();System.out.println("文件复制过程中发生错误");}}
}"代码讲解":
首先,创建一个BufferedInputStream来读取source.txt文件的内容,创建一个BufferedOutputStream来写入target.txt文件,其次,使用一个字节数组buffer作为中间缓冲区,在循环中不断地从源文件读取数据到缓冲区,然后,将缓冲区的数据写入目标文件,直到源文件的末尾,最后,调用bos.flush(),是为了确保所有缓冲的数据,都被写出到底层输出流中。

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

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

相关文章

Android 使用adb操作WiFi相关指令

没有系统原生设置应用又需要调试WiFi功能时,可以使用如下指令来验证WiFi相关功能 最常用的就是 svc wifi enable/disable,再使用wpa_supplicant/wpa_cli来验证,但对于AP功能就没办法验证了,其实Android有组很强大的shell指令集&a…

明明jar包存在却报错找不到包名?两招教你解决java: 程序包org.springframework.context.annotation不存在问题!

一、问题提出 IDEA项目有时因为依赖库的问题出现出错: java: 程序包org.springframework.context.annotation不存在,如下图。 二、解决办法 方案1: 重新导入项目 ① 将项目中 .idea .iml 全部删除,项目重新导入 ② 用idea重新…

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

阅读须知: 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,如有侵权烦请告知,我们会立即删除…

2024计算机二级Python

1. 栈是先进先出,队是后进后出 2. 代码输出长度为5并不是\不占用位置,而是\与其后边的数字共同占用一个字符 3. 首先要弄清range函数此时表示的范围是前闭后开,不包含后面的数字,%函数表示的是余数,只有4是被整除的…

各种实用设置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、命令行设置代理二、python包下载三、git设置代理 前言 一、命令行设置代理 export http_proxy"http://addr:port"二、python包下载 设置代理 …

sprintf函数和printf函数

在C语言中,sprintf函数和printf函数是两个非常常用的函数,它们都用于格式化输出字符串。尽管它们的名称很相似,但它们的功能却有所不同。 首先让我们来看一下printf函数。printf函数是C语言中最常用的输出函数之一,它用于将格式化…

批量处理数据:Java中的高效策略和实践

在处理大量数据时,尤其是在需要对数据库中的大批量记录进行更新时,有效的批处理策略是必不可少的。今天,我们将探讨一种在Java中批量更新数据的方法,并了解其在现实场景中的应用。 使用场景:重置视频标题 假设我们有…

案例分析篇15:软件开发方法考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

什么是Java中的线程?

Java中的线程 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程是独立的&#…

ios xcode 15 PrivacyInfo.xcprivacy 隐私清单 查询应用使用的隐私api

1.需要升级mac os系统到13 兼容 xcode 15.1 2.升级mac os系统到14 兼容 xcode 15.3 3.选择 New File 4.直接搜索 privacy 能看到有个App Privacy 5.右击Add Row 7.直接选 Label Types 8.选中继续添加就能添加你的隐私清单了 苹果官网文档

【Java】关于equals 和 ==

一、 和 equals 区别 是运算符; 判读左右两端的数据是否一致, 比较基本数据类型比较的是值,比较引用数据类型比较的是地址值 ; 默认判断的是两个对象的内存地址是否一致,一般用在基本数据类型上 equals equals 是ob…

每日一题——LeetCode1678.设计Goal解析器

方法一 splice 将字符串转为数组,对数组进行遍历,碰到G保持不变,继续循环,碰到 ( 看他后一位,是 ) 则删除两个元素,添加一个 o ,不是则删除四个元素,添加元素 al ,最后将…

打工人狂喜,微信管理既如此简单

微信作为一款全民的社交软件,已经成为人们日常生活中必不可少的通讯工具。不仅个人使用广泛,很多企业也依赖微信进行业务沟通和客户服务。然而,对于企业用户来说,管理多个微信号确实带来了许多繁琐和不便之处。 但是!…

Python代码执行慢的原因是什么?如何优化Python代码的性能?

1.Python代码执行慢的原因是什么? Python代码执行慢的原因有很多,以下是其中的一些主要原因: 动态类型:Python 是一种动态类型的语言,这意味着 Python 需要在运行时检查每个变量的类型。这种动态类型检查相对于静态类…

arm-linux WiFi测试指令脚本

11B通道测试脚本如下 手动测试功率 11B rtwpriv wlan0 mp_pwrctldm stop rtwpriv wlan0 mp_ctx stop rtwpriv wlan0 mp_start rtwpriv wlan0 mp_channel 1 rtwpriv wlan0 mp_bandwidth 40M0,shortGI0 rtwpriv wlan0 mp_ant_tx a #mp_ant_tx a …

【经验分享】创建团队编程训练区,发布编程打卡题及考核

总结: 1、在vijos平台上创建团队编程训练区,管理加入的成员,训练区内的资源仅对成员公开; 2、发布编程题让团队成员进行训练,能够实时查询成员通关情况; 3、能够想发布限时考试,对成员进行考核。…

Java毕业设计-基于spring boot开发的实习管理系统-毕业论文+答辩ppt(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、前台功能模块2、后台功能模块2.1 管理员功能2.2 教师功能2.3 学生功能2.4 实习单位功能 四、毕设内容和源代码获取总结 Java毕业设…

全面解析unityplayer.dll丢失的5种解决方法,轻松搞定dll丢失

在使用Unity开发的游戏或应用过程中,如果发现系统提示“找不到unityplayer.dll”文件,可能会引发一系列的问题与不便。这将直接导致游戏或应用程序无法正常启动运行,因为unityplayer.dll是Unity引擎的核心组件之一,负责处理关键的…

【C语言】三种方式实现字符串(char*)/字符数组(char[ ])输入输出

前言 做题时经常需要用到字符串,写篇笔记加强记忆,本文用 4个例子实现字符串的输入输出操作。 scanf(); 从键盘输入数据时,遇到 “空格”、“回车” 都会终止。若要接受空格,使用 gets(); 代替 scanf(); 多个 scanf(); 同时出现…

重建大师出现图中密集匹配失败的情况,是什么原因导致的?

可以检查瓦块是否位于测区边缘,边缘瓦块可以忽略;如果是中间区域的话,可能中间文件有异常,可以新建个reconstruction,然后单独提交失败的瓦块。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&…