IO流【详解】

news2024/11/28 22:43:17

一、IO流

1.1 IO说明

Input 输入

Output 输出

流: 例如水流,流量,即流是指数据流动传输

IO流就是指数据的输入输出

  • 例如: 将磁盘中的小说.txt,读取到java代码中 ---> 输入

  • 例如: 从java代码中,写到磁盘中创建出文件,并向文件中写入内容 --> 输出

image-20240607102626689

1.2 IO体系

IO

字节流

字符流

InputStream-输入流的抽象父类

FileInputStream

OutputStream-输出流的抽象父类

FileOutputStream

Reader-字符输入流抽象父类

FileReader

Writer-字符输出流抽象父类

FileWriter

字节流: 专用于传输字节文件,例如图片,音视频等

字符流:专用于传输纯字符文件,txt


关于IO操作,不管什么流,只要是

  • 读取数据(输入),方法都是read()

  • 写出数据(输出).方法都是write()

  • 无论什么流,最后一定记得close()

二、字节流

字节流,主要用于对字节文件(二进制文件,诸如图像音频类)输入输出

InputStream是输入流抽象父类

  • 一般使用子类FileInputStream

OutputStream是输出流抽象父类

  • 一般使用子类FileOutputStream

2.1 FileInputStream

FileInputStream(字节输入流)主要是对二进制文件读取

演示代码,使用字节输入流读取字符文件了,目的是为了演示读取效果

public static void main(String[] args) throws IOException {
    // 创建字节输入流
    FileInputStream fis = new FileInputStream("a.txt");
​
    // 读取一个字节
    // int a = fis.read();
    // System.out.println(a );
    //
    // int b = fis.read();
    // System.out.println(b );
    //
    // int c = fis.read();
    // System.out.println(c );
    //
    // int d = fis.read();
    // System.out.println(d );
​
    // 改造成循环,简化读取步骤
    int i = -1;
    while((i = fis.read()) != -1) {
        System.out.println(i );
    }
​
    // 最后一定要关流
    fis.close();
}
// 改造成try-catch-finally

public static void main(String[] args)  {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream("a.txt");
        int i;
        while ((i = fis.read(  )) != -1) {
            System.out.println(i );
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            fis.close( );
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.2 FileOutputStream

字节输出流,主要用于写出数据

public static void main(String[] args) {
    FileOutputStream fos = null;
    try{
        // 创建字节输出流
        // 1)目的地文件不存在,会自动创建
        // 2)运行一次写出数据,默认是将之前文件的内容覆盖
        // 3)想要每次写出数据时追加在文件后面,构造方法中设置true
       fos = new FileOutputStream("b.txt",true);
        // 写出数据
        fos.write(103);
    }catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
}

2.3 拷贝文件

拷贝一个图片到另外一个位置

边读边写

public static void main(String[] args) throws Exception {
​
    long begin = System.currentTimeMillis( );
​
    // 创建字节输入流
    FileInputStream fis = new FileInputStream("E:\\justdoit.jpg");
    // 创建字节输出流
    FileOutputStream fos = new FileOutputStream("E:\\就是干.jpg");
​
    int i;
    while((i = fis.read(  )) != -1) {
        fos.write(i);
    }
​
    fis.close();
    fos.close();
​
    long end = System.currentTimeMillis( );
    System.out.println("拷贝完成,耗时"+(end - begin) + "毫秒" );
}
// 使用try-catch-finally

问题: 将图片换成大一点的文件,例如10M左右的文件,再拷贝一遍,看时间....

很慢......

2.4 缓冲字节流(高效)

拷贝太慢,啥原因? 输入流的read和输出流的write都是一次读/写一个字节

10M文件,有1000万字节.....

解决方案就是,可以利用数组来完成一次读/写多个字节,利用这个思路,JDK中提供了高速读写数据的流,即缓冲字节流

  • BufferedInputStream

  • BufferedOutputStream

三、字符流

字符流专用于操作字符文件,例如txt文件

Reader是字符输入流抽象父类

  • FileReader

Writer是字符输出流的抽象父类

  • FileWriter

3.1 FilerReader

public static void main(String[] args) throws Exception {
    // 创建字符输入流
    FileReader fr = new FileReader("a.txt");
​
    int i;
    while ((i = fr.read()) != -1) {
        System.out.println((char)i);
    }
​
    fr.close();
}

3.2 FileWriter

public static void main(String[] args) throws Exception {
​
    // 创建字符输出流
    // FileWriter fw = new FileWriter("c.txt");
    FileWriter fw = new FileWriter("c.txt",true);
​
    fw.write('9');
    fw.write("9999");
​
    fw.close( );
​
}

3.3 拷贝小说

边读边写

public static void main(String[] args)  {
       long begin = System.currentTimeMillis( ); 
       FileWriter fw = null;
       FileReader fr= null;
       try {
           fr = new FileReader("三体.txt");
           fw = new FileWriter("三体2.txt");
           int i;
           while ((i = fr.read()) != -1) {
               fw.write(i);
           }
       }catch (Exception e){
           e.printStackTrace();
       } finally {
           try {
               fr.close();
               fw.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       long end = System.currentTimeMillis( );
       System.out.println("拷贝完成,耗时"+(end - begin) + "毫秒" );
    }

3.4 缓冲字符流

BufferedReader

BufferedWriter

内部数组8192

public class Demo7 {
    public static void main(String[] args) {
​
        long begin = System.currentTimeMillis( );
        FileWriter fw = null;
        FileReader fr = null;
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            fr = new FileReader("E:\\三体.txt");
            br = new BufferedReader(fr);
​
            fw = new FileWriter("E:\\三体2.txt");
            bw = new BufferedWriter(fw);
​
            // int i;
            // while ((i = br.read( )) != -1) {
            //     bw.write(i);
            // }
​
            /**
             * 缓冲字符流,可以读一行,写一行
             * 但是记得写出换行符号
             */
           String line;
           while ((line = br.readLine()) != null) {
               bw.write(line);
               bw.newLine();
           }
​
        } catch (Exception e) {
            e.printStackTrace( );
        } finally {
            try {
                br.close( );
                bw.close( );
            } catch (IOException e) {
                e.printStackTrace( );
            }
        }
        long end = System.currentTimeMillis( );
        System.out.println("拷贝完成,耗时" + (end - begin) + "毫秒");
​
    }
}

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

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

相关文章

新手也能快速上手!免费的四款视频剪辑神器大揭秘

现在好用的剪辑工具好的的呀,只要有玩抖音、快手和一些视频为主的社交平台,大家都会尝试用一些剪辑工具自己动手剪辑,在近几年视频的热度之下这类工具做得也越来越专业了,当然其中也还是会有既专业又免费实用的产品,今…

教程:一步步教你构建基于Python Flask和Vue的智慧书析K-means分析系统

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并挂载1TB的exFAT格式的TF卡

fdisk -l df -h df -t df -T mount 20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并挂载1TB的exFAT格式的TF卡 2024/8/21 18:06 【切记,对于Rockchip原厂的Buildroot,如果你没有针对性的适配DTS:修改其中的GPIO口供电&#xff0c…

分析AAC raw data

分析AAC raw data 本文的主要目标是分析说明AAC解码器如何处理RAW AAC数据。通过拆解理解AAC解码器处理raw aac的关键点,通过数据分析和代码阅读,来说明这个细节,某些细微之处尚需深入探索,留待后续更为详尽的阐述。 几种格式介…

C语言 ——— 常见的动态内存错误(上篇)

对NULL指针的解引用操作 代码演示: int* ptr (int*)malloc(sizeof(int) * INT_MAX); *ptr 10; free(ptr); 代码解析: 使用 malloc 函数动态开辟 sizeof(int)*INT_MAX 这么多个字节的空间,而 INT_MAX 是整型类型的最大值,那么…

优化WAN流量:如何通过调整系统设置降低企业网络成本

一、症状与问题背景 当电脑显示空闲状态时,如果满足以下条件,第二拨号链接可能会意外激活: 您正在使用基于 Microsoft Windows 的计算机,该计算机连接到远程网络并且是 Active Directory 域服务 (AD DS) 域的成员。 您通过二级…

jpg怎么转换成pdf?6个简单方法,实现jpg转换成pdf

你是否也曾想将jpg图片转换为pdf格式文档呢?亦或者在处理文档或制作报告时,不知道怎么才能更快地将多张图片整合成一个pdf文件呢?如果你正在寻找简单快速的方法,又有哪些工具可以帮助您完成图片转pdf呢?别着急&#xf…

Windows服务器部署基于【若依管理系统】开发的项目

🎯导读:本文档详述了基于前后端分离的若依系统(版本3.8.8)在Windows环境下从零开始的部署流程,包括JDK、Redis、MySQL等环境的搭建与配置。前端部署涉及Vue项目构建、图片优化及利用Nginx托管;而后端则涵盖…

猫咪掉毛严重如何清理?希喂,霍尼韦尔宠物空气净化器实测分享

随着养宠人群的增多,市场关注到铲屎官们的需要,带来了新的科技产品——宠物空气净化器。宠物空气净化器是在普通空气净化器基础上,调整服务对象,为吸附宠物毛发而设计的。不少消费者被它的功能所吸引,打算购入使用。然…

带你速通C语言——函数(11)

在 C 语言中,函数是组织代码的重要方式,它们允许我们将代码划分为可重用的模块,每个模块执行特定的任务。函数的使用有助于代码的清晰性和维护性,也是编写结构化程序的基本构建块之一。 1.函数的基本组成 在 C 中定义函数时&…

Agentic Security:一款针对LLM模型的模糊测试与安全检测工具

关于Agentic Security Agentic Security是一款针对LLM模型的模糊测试与安全检测工具,该工具可以帮助广大研究人员针对任意LLM执行全面的安全分析与测试。 请注意 Agentic Security 是作为安全扫描工具设计的,而不是万无一失的解决方案。它无法保证完全防…

八爪鱼现金流-034,实际使用,资产折线图

每个月发工资后,记账月报。 回顾资产折线图。 比较大的波动,一次是22年2月左右贷款买房。一次是24年8月宝宝出生。 孩子开销太大。呜呜呜。 话说,这个折线图,能不能加一个标签或者备注呢? 这个需求功能稍后我研究一…

【STM32 HAL库】寻迹小车 开环控制 状态机 TB6612+TCRT5000+HC-05

【STM32 HAL库】寻迹小车 开环控制 状态机 TB6612TCRT5000HC-05 前言硬件硬件准备模块说明主控 APM32F103VBT6核心板DC/DC降压模块TB6612电机驱动TCRT5000红外循迹模块HC-05蓝牙透传模块 代码逻辑宏观框架状态机 框架测试微观模块电机模块循迹模块蓝牙控制模块 前言 碎碎念一下…

keepalived安装-centos7

一、yum安装 1、安装Keepalived: yum install -y keepalived 2、启动Keepalived服务: systemctl start keepalived 3、设置Keepalived服务开机自启 systemctl enable keepalived 4、检查Keepalived服务状态: systemctl status keepal…

VAuditDemo常规漏洞

VAuditDemo常规漏洞 一、留言类功能漏洞 messageDetail.php - 存在数字型SQL注入,反射型XSS SQL注入 sqlwaf修改措施 反射型XSS messageSub.php search.php - 存在反射型xss 二、用户操作类漏洞 1、登录功能 logCheck.php - 空验证码绕过漏洞 2、编辑用户信息类 upd…

秘密指南!浮毛会危害人体健康吗?宠物空气净化器帮助解决危害

每当立秋一到,对于我这样的重度鼻炎患者而言,无疑是又一轮掉毛季的预警。家中猫咪的毛发仿佛永远扫不尽,皮屑也无处不在,让人头疼不已。好在,两年前我采纳了宠物医生的建议,用上了宠物空气净化器&#xff0…

Element-plus el-input 添加图标

案例图 根据官方文档来,我们需要先注册图标并应用到全局。 import { createApp } from "vue" import App from "./App.vue"const app createApp(App) //创建VUE对象import * as ElementPlusIconsVue from "element-plus/icons-vue"f…

竞争和冒险

竞争和冒险 文章目录 竞争和冒险总结 产生原因 数字电路中,信号传输与状态变换时都会有一定的延时。 在组合逻辑电路中,不同路径的输入信号变化传输到同一点门级电路时,在时间上有先有后,这种先后所形成的时间差称为竞争&#xf…

【方法】如何给ZIP压缩文件添加密码?

如果想要保护ZIP压缩文件不被他人随意打开,可以设置密码保护,那要如何设置呢?下面推荐两种方法,一起来看看吧! 方法1: 如果想在压缩文件的时候,同时设置密码,可以使用WinRAR或者7-…

Qt 系统相关 - 文件

目录 1. 文件概述 2. 输入输出设备类 3. 文件读写类 4. 文件和目录信息类 1. 文件概述 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。 Qt 提供了很多关于文件的类,通过这些类能够对文件系统进行操作&#x…