深入理解Java IO流:字节流

深入理解Java IO流:字节流

引言
在Java中,IO(输入/输出)操作是程序与外部世界交互的重要方式。
其中,File类是进行文件操作的基础,而字节流和字符流则是数据传输的两种主要方式。
本文将深入探讨这些概念及其应用。

一、 字节流类详解:

  1. I0流介绍以及输入输出以及流向的介绍:
    • Output :输出
    • Input: 输入
    • write:写数据
    • read:读数据

插曲:取 Output 和 Input 单词首字母不就是 IO 吗?

  1. IO流 :
    • 将一个设备上的数据传输到另外一个设备上,称之为 IO 流技术

二、 IO流向(Java基础阶段IO):

输入:内存 —— Output(将内存中的数据写到硬盘中)> 硬盘
输出:硬盘——Input(将硬盘中的数据读取到内存中)> 内存

如不理解,可以把自己比做内存,当我们吃饭喝水时是输入Input 输入 ,上厕所时是 Output 输出
输出输入演示图

  • 网络层面来说输出输入(简单理解):
    • 发数据–> 方:输出
    • 接数据–> 方:输入

三、 IO流向分类:

  1. 字节流:万能流,一切皆字节(数据在存储的最小单元是字节)
    • 字节输出流:0utputstream 抽象类
    • 字节输入流:Inputstream 抽象类
  2. 字符流:专门操作文本文档
    • 字符输出流:Write 抽象类
    • 字符输入流:Read 抽象类

四、字节输出流:

1、OutputStream中子类FileOutputStream使用:
  • 概述:字节输出流,OutputStream是一个抽象类
    • 子类:FileOutputStream
  • 作用:往硬盘上写数据
  • 构造:
    • Fileoutputstream(File file)
    • Fileoutputstream(String name)
  • 特点:
    • 指定的文件如果没存在,输出流会自动创建
    • 每次执行,默认都会创建一个新的文件,覆盖老文件
  • 方法:
    • void write(int b) 一次写一个字节
    • void write(byte[] b) 一次写一组字节
    • void write(byte[] b,int off ,int len) 一次写部分字节
      • b:写的数组
      • off:从数组那个位置开始写
      • len:一次写多少
    • void close() 关闭资源
  • 测试测试
	public static void main(String[] args) throws FileNotFoundException {FileOutputStream fos = new FileOutputStream("testfile.txt");}

在这里插入图片描述

  • 使用方法 wrtie
    • 在下述案例中我们使用 wrtie 方法写入一个 98 ,这个 98 是字节
    • 当我们打开 testfile 文件时会自动对 98这个字节进行翻译成我们人能看得懂的内容,就是 b
    • 而这个翻译是按照 ASCll 表进行翻译的
 public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("testfile.txt");//fos.write(98);String data = "sha bi go pe";byte[] bytes = data.getBytes();//fos.write(bytes);       // 一次写一个数字fos.write(bytes,0,3);    // 一次写一个数组一部分}

在这里插入图片描述

  • 一次写一个数组
    在这里插入图片描述
    在这里插入图片描述
  • 一次写一部分
    在这里插入图片描述

2、OutputStream中子类FileOutputStream的续写(最加):
  • 构造:
    • Fileoutputstream(String name,boolean append)
      • append:true 最加内容
  • 换行:
    • windows : \r\n 或者 \n
    • Linxu:\n
    • mac os :\r
    public static void main(String[] args) throws IOException {// FileOutputStream fos = new FileOutputStream("testfile.txt");// fos.write(98);// String data = "sha bi go pe";// byte[] bytes = data.getBytes();//fos.write(bytes);       // 一次写一个数字// fos.write(bytes,0,3);    // 一次写一个数组一部分FileOutputStream fos = new FileOutputStream("testfile.txt",true);fos.write("干就完了,打工人".getBytes());fos.close();}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


五、字节输入流:

  1. 概述:字节输入流:inputStream ,抽象类
    • 子类:FileInputStream
  2. 作用:读数据,将数据从硬盘上读取到内存中
  3. 构造:
    • FileInputstream(File file)
    • FileInputstream(String name)
    • 注意:FileInputstream 没有自动创建功能,以为它是读取已经存在的文件
  4. 方法:
    • void read(int b) 一次读一个字节,返回数据为字节
    • void read(byte[] b) 一次读一组字节,返回字节个数
    • void read(byte[] b,int off ,int len) 一次读部分字节
    • void close() 关闭资源
  5. 测试测试
  6. 小细节
    • 问题0:读到 -1 ,表示文件有效的内容,已经全部读取完毕
      • 每一个文件末尾都有一个结束标记,这个结束标记我们看不见
      • read()方法规定了,如读取到了文件的结束标记,方法返回 -1
    • 问题1:一个流对象,读完之后,就不要再读了;除非重新new一个新的对象
    • 问题2:流关闭之后,流对象不能继续使用了
	// 一次读取一个字节@Testpublic void InputStream() throws IOException {FileInputStream fileInputStream = new FileInputStream("testfile.txt");int read = fileInputStream.read(); // 一次读一个字节System.out.println(read);System.out.println(fileInputStream.read());// 读到 -1 ,表示文件有效的内容,已经全部读取完毕System.out.println(fileInputStream.read());System.out.println(fileInputStream.read());fileInputStream.close();}// 循环读取@Testpublic void InputStream2() throws IOException {FileInputStream fileInputStream = new FileInputStream("testfile.txt");// 循环读取int i;while ((i = fileInputStream.read()) != -1){System.out.println(i);}fileInputStream.close();}@Testpublic void InputStream3() throws IOException {FileInputStream fileInputStream = new FileInputStream("testfile.txt");/**** 创建一个数组,用于临时存储区域,我们要读取的内容会临时存储到数组中** 数组的长度对少,每次就读取多少,一般情况是 1024 或者 1024 的倍数* 如果剩下的字节不够数组长度,那么有多少读取多少* */byte[] bytes = new byte[2];int i;while ((i = fileInputStream.read(bytes)) != -1){String s = new String(bytes, 0, i);System.out.println(s);}fileInputStream.close();}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


六、练习:

1、复制文件
 @Testpublic void InputStream4() throws IOException {// 要被复制的文件夹String file = "D:\\a";// 复制玩后,粘贴的位置String deposit = "D:\\b";method(file, deposit);}public static void method(String file, String deposit) throws IOException {File sourceFile = new File(file);File[] files = sourceFile.listFiles();if (files == null) throw new IOException("目录不可访问: " + sourceFile);for (File sourceFileItem : files) {File destinationFileItem = new File(deposit, sourceFileItem.getName());if (sourceFileItem.isFile()) {try (// 读(输入)FileInputStream fileInputStream = new FileInputStream(sourceFileItem);// 写(输出)FileOutputStream fileOutputStream = new FileOutputStream(destinationFileItem)){int len;byte[] bytes = new byte[1024];while ((len = fileInputStream.read(bytes)) != -1) {fileOutputStream.write(bytes, 0, len);}}} else if (sourceFileItem.isDirectory()) {// 确保目标目录存在destinationFileItem.mkdirs();// 子目录的递归调用method(sourceFileItem.getAbsolutePath(), destinationFileItem.getAbsolutePath());}}}

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

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

相关文章

综合案例(前端代码练习):猜数字和表白墙

目录 一、猜数字 html代码: 点击 猜 按钮的js代码: 点击 重开游戏 按钮的js代码: 整体代码: 页面效果: 二、留言板 css代码: html代码: js代码(主逻辑在这)&am…

vision颜色工具_CogColorExtractorTool

颜色提取工具 CogColorExtractorTool 从彩色图像中抽取像素来创建灰度图像 添加图片和工具 复位 需求:提取中间的红色的玫瑰 参数介绍: 膨胀 形态操作:匹配到的到都是像素点,数值越大,匹配到的结果越完整 柔和度: 如果要生成灰度输出图像,该图像的…

第07-4章 网络层详解

7.1 网络层协议 IP协议ARP(地址解析协议)RARP(反向地址解析协议)ICMP(互联网控制消息协议) 7.2 IP协议详解 7.2.1 IP协议功能 寻址和路由传递服务(不可靠,尽最大努力&#xff0c…

Unity面向切面编程

一直说面向AOP(切面)编程,好久直接专门扒出理论、代码学习过。最近因为某些原因😭还得再学学造火箭的技术。 废话不多说,啥是AOP呢?这里我就不班门弄斧了,网上资料一大堆,解释的肯定…

python怎么连接oracle

一:弄清版本,最重要!!! 首先安装配置时,必须把握一个点,就是版本一致!包括:系统版本,python版本,oracle客户端的版本,cx_Oracle的版本…

每日一题:地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

Pytorch实现线性回归模型

在机器学习和深度学习的世界中,线性回归模型是一种基础且广泛使用的算法,简单易于理解,但功能强大,可以作为更复杂模型的基础。使用PyTorch实现线性回归模型不仅可以帮助初学者理解模型的基本概念,还可以为进一步探索更…

【归并】Leetcode 排序数组

题目讲解 912. 排序数组 算法讲解 使用归并算法排序数组,我们先在数组中寻找一个mid点,然后把数组分成了两部分,我们先排左部分,排左边部分的时候有需要将当前的子数组分成两部分,继续循环,直到当前子数组…

嵌入式物联网开发基石

前言 嵌入式物联网开发工程师,是一个蓝海新风口,高薪不内卷的行业。需要掌握熟悉c/c、单片机、数据结构,linux系统,ARM单片机,嵌入式。可以从事工作项目loT、视频监控领域的产品,跨平台系统,智能…

linux内核初始化成功后是如何过渡到android初始化的

Android用的linux内核,以完成OS该有的功能,例如,文件系统,网络,内存管理,进程调度,驱动等 ,向下管理硬件资源向上提供系统调用。另一些Android特有驱动也放在内核之中。 当linux内核…

时序分析基础(6)——input delay时序分析

1 简介 FPGA对于外部的时钟以及数据的延时信息是不知道的,在低速时钟且时钟发射沿在数据正中心的时候,一般可以不做约束来直接使用。但是到了高速时钟或者双沿采样或者发射沿和数据对齐的情况下,这时候就需要告诉VIVADO外部的时钟与数据情况来…

前端css中border-radius的简单使用

前端css中border-radius的使用 一、前言二、border-radius语法三、border-radius的模型例子1.源码12.源码1效果截图 四、border-radius的动画效果(动态交互)1.源码22.源码2显示效果 五、结语六、定位日期 一、前言 在CSS中,我们常用border-r…