深入理解Java IO流:字节流

news2024/9/20 2:51:59

深入理解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:流关闭之后,流对象不能继续使用了
	// 一次读取一个字节
	@Test
    public 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();

    }


    // 循环读取
    @Test
    public void InputStream2() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("testfile.txt");

        // 循环读取
        int i;
        while ((i = fileInputStream.read()) != -1){
            System.out.println(i);
        }
        fileInputStream.close();

    }
    @Test
    public 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、复制文件
 @Test
    public 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.coloradmin.cn/o/1612143.html

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

相关文章

C# 自动填充文字内容到指定图片

目录 需求 开发运行环境 方法设计 实现代码 AddText方法 图片转Base64 调用示例 小结 需求 在我们的一些发布系统项目应用中,会经常发布一些链接图标,该图标基本上以模板背景为主,并填充项目文字内容。解决方式一般会让美工进行制作…

数字化校园在职校教育中的价值和前景

在当今信息化浪潮中,职校教育正以前所未有的速度迈入智慧校园时代。数字化校园以其强大的功能和广泛的适用性,正在深刻地改变职校的教学模式、管理模式以及学生的学习方式,助力职校教育实现高质量、高效率、个性化的转型,如何利用…

微信小程序小游戏开发,微信开发者工具提示该目录下的项目(wxapp2)已在工具中创建,怎么办

微信小程序小游戏开发,微信开发者工具提示该目录下的项目(wxapp2)已在工具中创建,怎么办 情况描述, 导入一个项目的时候,导入成了小游戏项目了 想换成小游戏项目,变不了了,提示 “…

Fanuc机器人 Karel 编程学习(五)---简单的Socket通信

Fanuc Karel编写Socket程序和上位机进行通信。 一:环境配置(ROBOGUIDE) 1.1机器人系统变量设置 MENU-------> SYSTEM------> Variables------->$KERAL_ENB 设置为1 1.2 IP地址设定 MENU---->SETUP---->Host Comm 选择 F3【DETAIL】进入IP设置…

【图论 单源最短路】100276. 最短路径中的边

本文时间知识点 单源最短路 图论知识汇总 LeetCode100276. 最短路径中的边 给你一个 n 个节点的无向带权图,节点编号为 0 到 n - 1 。图中总共有 m 条边,用二维数组 edges 表示,其中 edges[i] [ai, bi, wi] 表示节点 ai 和 bi 之间有一条…

Topaz Photo AI 3.0.0 (macOS Universal) - AI 图片修复工具

Topaz Photo AI 3.0.0 (macOS Universal) - AI 图片修复工具 Maximize Image Quality with AI 请访问原文链接:Topaz Photo AI 3.0.0 (macOS Universal) - AI 图片修复工具,查看最新版。原创作品,转载请保留出处。 作者主页:sy…

FK中的一些方法

1. 隔离法与整体法 目标:对一个拉新邀请任务,识别出其中的作弊用户。 欺诈类的数据,黑样本不足,需要自己去找,可按IP、昵称、手机号相似性等。虽然有 会员等级、注册时长、注册地址、成交订单等特征,但分类…

STM32 HAL库F103系列之ADC实验(一)

ADC工作原理: 1、输入通道: 2、转换序列: A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组) 规则组最多可以有16个转换,注入组最多有4个转换 规则组和注入…

视频素材库哪里最好?8个视频素材免费商用

在视频创作的世界里,寻找那些能够完美匹配你的想法并加以实现的视频素材是一项既令人兴奋又充满挑战的任务。无论你的目标是提升视频质量、增强视觉效果,还是简单地想要让你的作品更加出色,这里有一系列全球精选的视频素材网站,它…

014Node.js时间格式包silly-datetime安装与使用

下载: https://www.npmjs.com/网站上下载silly-datetime 安装 npm i silly-datetime --save var sd require(silly-datetime);console.log(new Date()); //2024-04-18T04:40:38.505Zvar dsd.format(new Date(), YYYY-MM-DD HH:mm);console.log(d); //2024…

【C++类和对象】const成员函数及流插入提取

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

2024第三届中国力触觉技术及应用会议,将于5月24-26日在天津举办,搜维尔科技与您共探触觉传感器与力触觉感知新技术

大会介绍 2024第三届中国力触觉技术及应用会议”将于2024年5月24-26日在中国天津举办。 本届会议以“感知赋能未来,触觉助力世界”为主题,聚焦力触觉传感器与力触觉感知技术,持续关注行业领域热点,探讨技术前沿,融合多…

Jira搭建过程

看到很多小伙伴对jira有兴趣,我们今天就来分享一下jira的搭建吧 首先要明白jira是什么? 看来搭建jira也是我们测试人员需要具备的技能之一了.下面是详细的大家步骤: 1.系统环境准备 Centos 7.5 Mysql 5.6 Java1.8 2.软件安装包 atlassian-jira-software-7.13.0-x64.bin …

数据结构——7.3 树形查找

7.3 树形查找 概念 二叉排序树(BST) 二叉排序树(Binary Sort Tree,BST),又称为二叉查找(搜索)树(Binary Search Tree),是一种特殊的二叉树&am…

OpenHarmony 网络与连接—RPC连接

介绍 本示例使用ohos.rpc 相关接口,实现了一个前台选择商品和数目,后台计算总价的功能,使用rpc进行前台和后台的通信。 效果预览 使用说明: 点击商品种类的空白方框,弹出商品选择列表,选择点击对应的商品…

MATLAB实现遗传算法优化BP神经网络预测数值(GABP)

遗传算法(Genetic Algorithm, GA)和反向传播(Back Propagation, BP)神经网络是两种强大的算法,分别用于优化和机器学习。将遗传算法与BP神经网络结合,可以利用遗传算法的全局搜索能力来优化BP神经网络的初始…

stm32中断发送接收数据

配置hal库 1配置时钟 2配置uart 3打开中断 程序结构 uart中断函数 中断接收和发送函数 HAL_UART_Receive_IT():启动中断驱动的接收过程,当接收到指定数量的字节后会产生中断,并调用HAL_UART_RxCpltCallback()回调函数。 HAL_StatusTypeD…

【MIT6.S081】Lab4: traps(详细解答版)

实验内容网址:https://xv6.dgs.zone/labs/requirements/lab4.html 本实验的代码分支:https://gitee.com/dragonlalala/xv6-labs-2020/tree/traps2/ Backtrace 关键点:trapframe、栈 思路: 这道题的关键是栈结构,先阅读xv6中关于栈…

SpringCloud技术—Docker详解、案例展示

简介:Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。 总体来说,…

代码随想录刷题|一刷总结

文章目录 一刷总结一、 成果汇报1、leetcode提交记录2、博客更新记录 二、 经验总结2.1.刷过的所有题型2.1.1、数组2.1.2、链表2.1.3、哈希表2.1.4、字符串2.1.5、栈与队列2.1.6、二叉树2.1.7、回溯2.1.8、贪心2.1.9、动态规划2.1.10、单调栈 2.2、做得好的2.3、做得不好的2.4、…