IO流----字节流

字节流

  • 字节流:
    • 操作:
      • 文件字节输入输出流 :
        • 写入数据:
        • 读取数据:
        • 文件拷贝:
      • 带缓冲区的字节输入输出流:
        • 拷贝文件:
        • 写入数据:
        • 读取数据:
    • 深入 带缓冲区的字节输出流 :
      • 底层源码:

字节流:

应用场景:操作二进制数据(音频、视频、图片)

abstract class InputStream – 字节输入流的基类(抽象类)

abstract class OutputStream – 字节输出流的基类(抽象类)

class FileInputStream extends InputStream – 文件字节输入流

class FileOutputStream extends OutputStream – 文件字节输出流

class FilterInputStream extends InputStream – 过滤器字节输入流

class FilterOutputStream extends OutputStream – 过滤器字节输出流

class BufferedInputStream extends FilterInputStream – 带缓冲区的字节输入流

class BufferedOutputStream extends FilterOutputStream – 带缓冲区的字节输出流

默认缓冲区大小:8192字节----> new byte[8192]

在这里插入图片描述

 
 

操作:

文件字节输入输出流 :

写入数据:

利用 文件字节输出流 向文件 写入 数据。
 
​        1. 不处理异常

​        2. 当文件存在时

​        3. 当文件不存在时
 
经验:所有的输出流,当文件不存在时都会创建该文件

public static void main(String[] args) throws IOException {//1.创建流对象FileOutputStream fos = new FileOutputStream("io.txt");//2.写入数据//fos.write(97);//写入UniCode码//fos.write("123abc".getBytes());//字符串转为byte数组,并写入文件中fos.write("123abc".getBytes(), 2, 3);//写入byte数组、偏移量、写入长度//3.关闭资源fos.close();}

 
 

利用 文件字节输出流 向文件 写入 数据。
 
​        1. 不处理异常

​        2. 当文件存在时

​        3. 当文件不存在时

​        4. 在文件末尾追加内容
 
经验:在文件末尾追加考虑基础流的构造方法。

public static void main(String[] args) throws IOException {//1.创建流对象 + 设置在文件末尾追加FileOutputStream fos = new FileOutputStream("io.txt",true);//2.写入数据fos.write("123abc".getBytes());//写入byte数组//3.关闭资源fos.close();}

 
 

利用 文件字节输出流 向文件 写入 数据。
 
​        1. 不处理异常

​        2. 当文件存在时

​        3. 当文件不存在时

​        4. 在文件末尾追加内容

​        5. 处理异常

public static void main(String[] args) {FileOutputStream fos = null;try {//1.创建流对象 + 设置在文件末尾追加fos = new FileOutputStream("io.txt",true);//2.写入数据fos.write("123abc".getBytes());//写入byte数组} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//3.关闭资源if(fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}

 
 

读取数据:

利用 文件字节输入流 读取文件里的数据。
 
​        1. 不处理异常

​        2. 文件存在

public static void main(String[] args) throws IOException {//1.创建流对象FileInputStream fis = new FileInputStream("io.txt");//2.读取数据//read():一个字节一个字节的读取数据,读取到文件末尾返回-1int read = fis.read();System.out.println(read);read = fis.read();System.out.println(read);read = fis.read();System.out.println(read);read = fis.read();System.out.println(read);read = fis.read();System.out.println(read);read = fis.read();System.out.println(read);read = fis.read();System.out.println(read);//3.关闭资源fis.close();}

 
 

改进:

public static void main(String[] args) throws IOException {//1.创建流对象FileInputStream fis = new FileInputStream("io.txt");//2.读取数据//read():一个字节一个字节的读取数据,读取到文件末尾返回-1int read;while((read = fis.read()) != -1){System.out.println((char)read);}//3.关闭资源fis.close();}

 
 

再改进:

public static void main(String[] args) throws IOException{//1.创建流对象FileInputStream fis = new FileInputStream("io.txt");//2.读取数据//read(bs):读取bs长度的数据,并把数据放入数组,返回读取到的有效字节数,如果读取到文件末尾则返回-1byte[] bs = new byte[1024];int len;while((len = fis.read(bs)) != -1){System.out.println(new String(bs, 0, len));}//3.关闭资源fis.close();}

 
 

利用 文件字节输入流 读取文件里的数据。

​        1. 不处理异常

​        2. 文件存在

​        3. 文件不存在

​        4. 处理异常

public static void main(String[] args){FileInputStream fis = null;try {//1.创建流对象fis = new FileInputStream("io.txt");//2.读取数据//read(bs):读取bs长度的数据,并把数据放入数组,返回读取到的有效字节数,如果读取到文件末尾则返回-1byte[] bs = new byte[1024];int len;while((len = fis.read(bs)) != -1){System.out.println(new String(bs, 0, len));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//3.关闭资源if(fis != null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}

 
 

文件拷贝:

读取源文件,写入目标文件。

public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("Original.mp4");FileOutputStream fos = new FileOutputStream("copy.mp4");//一个一个字节的拷贝,速度太慢int read;while((read = fis.read()) != -1){fos.write(read);}fis.close();fos.close();}

 
 

改进:

public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("Original.mp4");FileOutputStream fos = new FileOutputStream("copy.mp4");//read(bs):读取bs长度的数据,并把数据放入数组,//返回读取到的有效字节数,如果读取到文件末尾则返回-1byte[] bs = new byte[1024];int len;while((len = fis.read(bs)) != -1){fos.write(bs, 0, len);}fis.close();fos.close();}

 
 

异常处理:

public static void main(String[] args){FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream("Original.mp4");fos = new FileOutputStream("copy.mp4");byte[] bs = new byte[1024];int len;while((len = fis.read(bs)) != -1){fos.write(bs, 0, len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(fis != null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}if(fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}

 
 

改进:

public static void main(String[] args){//注意:小括号里创建的流会在try...catch后自动关闭try(FileInputStream fis = new FileInputStream("Original.mp4");FileOutputStream fos = new FileOutputStream("copy.mp4");) {byte[] bs = new byte[1024];int len;while((len = fis.read(bs)) != -1){fos.write(bs, 0, len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

 
 

带缓冲区的字节输入输出流:

拷贝文件:
public static void main(String[] args) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("Original.mp4"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.mp4"));byte[] bs = new byte[1024];int len;while((len = bis.read(bs)) != -1){bos.write(bs, 0, len);}bis.close();bos.close();}

 
 

写入数据:

利用 带缓冲区的字节输出流 向文件写入数据
 
​ 1. 不处理异常的方式

​ 2. 文件存在的情况
3. 文件不存在的情况
 
经验:所有的输出流,文件不存在的情况都会创建文件。

public static void main(String[] args) throws IOException {//1.创建流对象BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("io.txt"));//2.写入数据bos.write("123abc".getBytes());//3.关闭资源bos.close();}

 
 

利用 带缓冲区的字节输出流 向文件写入数据
 

  1. 不处理异常的方式

  2. 文件存在的情况

  3. 文件不存在的情况

  4. 在文件末尾追加内容
     
    经验:在文件末尾追加考虑基础流的构造方法。

public static void main(String[] args) throws IOException {//1.创建流对象BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("io.txt",true));//2.写入数据bos.write("123abc".getBytes());//3.关闭资源bos.close();}

 
 

利用 带缓冲区的字节输出流 向文件写入数据
 

  1. 不处理异常的方式

  2. 文件存在的情况

  3. 文件不存在的情况

  4. 在文件末尾追加内容

  5. 处理异常

public static void main(String[] args){BufferedOutputStream bos = null;try {//1.创建流对象bos = new BufferedOutputStream(new FileOutputStream("io.txt",true));//2.写入数据bos.write("123abc".getBytes());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//3.关闭资源if(bos != null){try {bos.close();} catch (IOException e) {e.printStackTrace();}}}}

 
 

读取数据:

利用 带有缓冲区的字节输入流 读取文件里的数据。
 

  1. 不处理异常

  2. 文件存在

  3. 文件不存在
     
    经验:所有输入流,当文件不存在都会报错

public static void main(String[] args) throws IOException {//1.创建流对象 (默认缓冲区大小:8192字节)//BufferedInputStream bis = new BufferedInputStream(new FileInputStream("io.txt"));//1.创建流对象 (自定义缓冲区大小:2048字节)BufferedInputStream bis = new BufferedInputStream(new FileInputStream("io.txt"),2048);//2.读取数据 byte[] bs = new byte[1024];int len;while((len = bis.read(bs)) != -1){System.out.println(new String(bs, 0, len));}//3.关闭资源bis.close();}

 
 

利用 带有缓冲区的字节输入流 读取文件里的数据。
 

  1. 不处理异常
  2. 文件存在
  3. 文件不存在
  4. 异常处理
public static void main(String[] args) {BufferedInputStream bis = null;try {//1.创建流对象 (默认缓冲区大小:8192字节)bis = new BufferedInputStream(new FileInputStream("io.txt"));//2.读取数据 byte[] bs = new byte[1024];int len;while((len = bis.read(bs)) != -1){System.out.println(new String(bs, 0, len));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//3.关闭资源if(bis != null){try {bis.close();} catch (IOException e) {e.printStackTrace();}}}}

 
 

深入 带缓冲区的字节输出流 :

public static void main(String[] args) throws IOException{//		FileOutputStream fos = new FileOutputStream("io.txt");
//		//写几次,就和硬盘交互几次  -- 6次(内存与硬盘交互的次数)
//		fos.write("1".getBytes());
//		fos.write("2".getBytes());
//		fos.write("3".getBytes());
//		fos.write("a".getBytes());
//		fos.write("b".getBytes());
//		fos.write("c".getBytes());
//		fos.close();//		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("io.txt"));
//		//将数据写入到字节缓冲数组中 -- 1次(内存与硬盘交互的次数)
//		bos.write("1".getBytes());
//		bos.write("2".getBytes());
//		bos.write("3".getBytes());
//		bos.write("a".getBytes());
//		bos.write("b".getBytes());
//		bos.write("c".getBytes());
//		//关闭时才将数据写入到文件中
//		bos.close();//默认缓冲区 -- 8192个字节(8*1024)//BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("io.txt"));//自定义缓冲区大小 -- 2048个字节
//		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("io.txt"), 2048);}

 
 

底层源码:

//继承关系
public class FilterOutputStream extends OutputStream {protected OutputStream out;//0x001//out - 0x001public FilterOutputStream(OutputStream out) {this.out = out;}//b - [65]public void write(byte[] b) throws IOException {this.write(b, 0, b.length);}@SuppressWarnings("try")public void close() throws IOException {try (OutputStream ostream = out) {flush();}}
}
//源码
public class BufferedOutputStream extends FilterOutputStream {//缓冲区数组protected byte[] buf;//new byte[8192]//缓冲区存放数据的个数protected int count;//1//out - 0x001public BufferedOutputStream(OutputStream out) {this(out, 8192);}//out - 0x001//size - 8192public BufferedOutputStream(OutputStream out, int size) {super(out);if (size <= 0) {throw new IllegalArgumentException("Buffer size <= 0");}buf = new byte[size];}//b - [65]//off - 0//len - 1public synchronized void write(byte b[], int off, int len) throws IOException {//判断现在需要写出的数据长度是否大于缓冲区数组if (len >= buf.length) {//1 >= 8192//将缓冲区数组里的数据写入到文件,将缓冲区清空flushBuffer();//将线程需要写出的数据写入到文件out.write(b, off, len);return;}//判断现在需要写出的数据长度 超过了缓冲区剩余的存储长度if (len > buf.length - count) {//1 > 8192-0//将缓冲区数组里的数据写入到文件,将缓冲区清空flushBuffer();}//将数据写入到缓冲区数组里System.arraycopy(b, off, buf, count, len);//更新缓冲区数组数据个数count += len;}private void flushBuffer() throws IOException {//count > 0说明缓冲区数组里有数据if (count > 0) {super.out.write(buf, 0, count);//调用的是FileOutputSteam的write()count = 0;//缓冲区清空}}public synchronized void flush() throws IOException {//将缓冲区数组里的数据写入到文件,将缓冲区清空flushBuffer();super.out.flush();//调用的是FileOutputSteam的close() -- 关流}
}
//应用场景
FileOutputStream fos = new FileOutputStream("io.txt");//0x001
BufferedOutputStream bos = new BufferedOutputStream(fos);bos.write("1".getBytes());
bos.write("2".getBytes());
bos.write("3".getBytes());
bos.write("a".getBytes());
bos.write("b".getBytes());
bos.write("c".getBytes());bos.close();

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

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

相关文章

【论文阅读】Point2RBox (CVPR’2024)

paper:https://arxiv.org/abs/2311.14758 code:https://github.com/yuyi1005/point2rbox-mmrotate

阿里云sls 采集日志安装记录

参考阿里云给的安装文档 阿里云安装Logtail组件 注意这里&#xff0c;选择地域&#xff0c;是中国地域选中国&#xff0c;海外选海外即可 按照文档继续下去 修改配置文件./alibaba-cloud-log-all/values.yaml 所有的操作完成后&#xff0c;去控制台配置 以上操作的前提是…

[WWW2024]轻量数据依赖的异常检测重训练方法LARA

开篇 近日&#xff0c;由阿里云计算平台大数据基础工程技术团队主导&#xff0c;与浙江大学合作的论文《LARA: ALight and Anti-overfitting Retraining Approach for Unsupervised Time Series Anomaly Detection 》被WWW2024收录&#xff0c;该方法解决了云服务正常模式随时…

探索AIGC降重工具:确保论文原创性的新策略

如何有效降低AIGC论文的重复率&#xff0c;也就是我们说的aigc如何降重&#xff1f;AIGC疑似度过高确实是个比较愁人的问题。如果你用AI帮忙写了论文&#xff0c;就一定要在交稿之前做一下AIGC降重的检查。一般来说&#xff0c;如果论文的AIGC超过30%&#xff0c;很可能会被判定…

申请医疗设备注册变更时,需要补充考虑网络安全的情况有哪些?

在申请医疗器械设备注册变更时&#xff0c;需要补充网络安全的情况主要包括以下几点&#xff1a; 网络安全功能更新&#xff1a;如果医疗器械的自研软件发生网络安全功能更新&#xff0c;或者合并网络安全补丁更新的情形&#xff0c;需要单独提交一份自研软件网络安全功能更新…

#02 安装指南:如何配置Stable Diffusion环境

文章目录 前言前置条件第1步&#xff1a;安装Python和PIP第2步&#xff1a;创建虚拟环境第3步&#xff1a;安装PyTorch和CUDA第4步&#xff1a;安装Stable Diffusion相关库第5步&#xff1a;测试环境结论 前言 在之前的文章中&#xff0c;我们介绍了Stable Diffusion基础入门和…

【ARFoundation自学04】AR Tracked Image 图像追踪识别

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体&#xff08;UI、模型等&#xff09;

Java驱动的工程项目管理系统:实现高效协作与精准管理

在工程行业的现代管理实践中&#xff0c;有效地协同工作和信息共享对于提高工作效率和降低成本至关重要。本文将深入探讨一款基于Java技术的工程项目管理系统&#xff0c;该系统采用前后端分离的架构&#xff0c;功能全面&#xff0c;旨在满足不同角色的需求&#xff0c;从项目…

PlugLink与RPA的完美结合:打造智能自动化工作流(附源码)

PlugLink与RPA的完美结合&#xff1a;打造智能自动化工作流 自动化技术已经成为提高效率和减少错误的关键手段。两种主要的自动化技术——PlugLink和RPA&#xff08;机器人流程自动化&#xff09;——各有特色。本文将详细探讨PlugLink与RPA的不同之处&#xff0c;并介绍它们如…

软件测试需求管理指南规范(Word原件,项目管理全资料)

3 测试需求 3.1 测试范围 3.2 测试目标 4 测试需求的现状 5 测试需求的内容 5.1 主体内容 5.2 管理内容 6 测试需求的制定 6.1 需求信息来源 6.2 需求分析 6.2.1 功能性需求 6.2.2 系统功能需求 6.2.3 界面需求 6.2.4 安装需求 6.2.5 业务需求 6.2.6 非功能性需求 6.2.7 性能需…

ai怎么导出jpg?让我告诉你答案【详】

在设计和创意工作中&#xff0c;Adobe Illustrator&#xff08;AI&#xff09;是一款不可或缺的工具。然而&#xff0c;当我们将设计作品导出为JPG格式时&#xff0c;可能会遇到一些问题。ai怎么导出jpg&#xff1f;如何确保导出的JPG图片保持高质量&#xff1f;接下来&#xf…

【Js】深入浅出的js for循环 for loop以及闭坑指南

在JavaScript中使用forEach循环来删除数组中的特定元素可能会导致一些问题&#xff0c;因为forEach不允许你在迭代过程中修改数组的长度。 这会导致意外的行为&#xff0c;例如跳过元素或错误地索引。因此&#xff0c;建议使用其他方法来安全地删除数组中的元素。 存在的问题 1…

php质量工具系列之phpmd

PHPMD PHP Mess Detector 它是PHP Depend的一个衍生项目&#xff0c;用于测量的原始指标。 PHPMD所做的是&#xff0c;扫描项目中可能出现的问题如&#xff1a; 可能的bug次优码过于复杂的表达式未使用的参数、方法、属性 PHPMD是一个成熟的项目&#xff0c;它提供了一组不同的…

常用的接口测试工具

大家好&#xff0c;当谈到软件开发中的质量保证时&#xff0c;接口测试无疑是至关重要的一环。在当今快节奏的开发环境中&#xff0c;确保应用程序的各个组件之间的交互正常运作是至关重要的。而接口测试工具则成为了开发人员和测试人员的得力助手&#xff0c;帮助他们有效地测…

LLM推理加速原理(一)

1.大语言模型的基本结构 transfomer block: 输入--->正则化-->qkv三个矩阵层(映射到三个不同空间中)---->q,k,v之后self attention进行三0合一---->线性映射,正则化。 2.大语言模型的推理 目前主流的语言大模型都采用decoder-only的结构,其推理过程由两部分…

辞职后,如何理性面对公司的挽留?我的职场选择之路

辞职后&#xff0c;面对公司的挽留&#xff0c;你会决定留下还是离开呢&#xff1f;这是一个让人犹豫不决的问题。 让我们来分析一下个人在职场中的价值和期望。每个人都有自己的职业规划和发展目标&#xff0c;这是非常正常的。在工作中&#xff0c;我们希望自己能够得到充分的…

常规操作-ArcGIS常用标注技巧

常规操作-ArcGIS常用标注技巧 1、简单的"&“符号&#xff1a;多字段表达只需要用”&"符号&#xff0c;多个字段之间需要空格&#xff0c;空格符号需要加双引号。 表达式为&#xff1a; [字段] & " " & [字段] 2、“VBnewline"应用…

vue 将echart 下载为base64图片

1 echart是页面的子组件&#xff0c; 2 页面有多个echart 3 将多个echart下载为base64图片 // 子组件 echart&#xff0c;要保存echartconst chart this.$echarts.init(this.$refs.chart, light) this.chartData chart; //保存数据&#xff0c;供父组件alarmReport调用(th…

【CTF MISC】XCTF GFSJ0155 simple_transfer Writeup(流量分析+文件提取)

simple_transfer 文件里有flag&#xff0c;找到它。 解法 用 wireshark 分析&#xff0c;大部分都是 TCP 协议。 打开协议分级统计&#xff0c;有个 DLEP 占了 94.2% 的数据。 作为过滤器使用。全都是 Unknown。 用 binwalk 扫描。 binwalk f9809647382a42e5bfb64d7d447b409…

集合的介绍

集合指的是数据集中在一块。集合的好处体现在以下几点 1.可以动态保存任意多个对象&#xff0c;使用比较方便。 2.提供了一系列方便的操作对象的方法&#xff1a;add,remove,set,get等&#xff0c;方便增加&#xff0c;删除内容。 集合Collection单列集合一览图 集合Map双列集…