Java IO流动(实战操作)

news2024/11/15 11:04:37

目录

    • 1 IO流原理
    • 2 IO流的分类
    • 3 输入、输出流代码示例
    • 4 小结
    • 5 文件在前后台之间传递


在Java中,IO流是一种用于处理输入和输出操作的机制。它提供了一种统一的方式来读取和写入数据,平日开发中在文件读写,网络通信,特定场景的数据库操作,文本处理等地方会频繁使用IO流。

流最主要的功能就是输入、输出。最简单理解:

获取txt文本中内容到程序中处理叫输入流(Input),将程序处理完的内容写到txt文本中叫输出流(Output)。说白了一个负责读一个负责写。

1 IO流原理

IO流是基于流的概念,它将数据的输入和输出看作是一个连续的流。数据从一个地方流向另一个地方,流的方向可以是输入(读取数据)或输出(写入数据)。Java中的IO流分为字节流和字符流两种类型,分别用于处理字节数据和字符数据。

IO流的原理是通过流的管道将数据从源头传输到目标地。源头可以是文件、网络连接、内存等,而目标地可以是文件、数据库、网络等。IO流提供了一组丰富的类和方法来实现不同类型的输入和输出操作。

2 IO流的分类

Java中的IO流可以按照数据的类型和流的方向进行分类。

  1. 按数据类型分类
    • 字节流(Byte Stream):以字节为单位读写数据,适用于处理二进制数据,如图像、音频、视频等。常见的字节流类有InputStreamOutputStream
    • 字符流(Character Stream):以字符为单位读写数据,适用于处理文本数据。字符流会自动进行字符编码和解码,可以处理多国语言字符。常见的字符流类有ReaderWriter
  2. 按流的方向分类
    • 输入流(Input Stream):用于读取数据。输入流从数据源读取数据,如文件、网络连接等。常见的输入流类有FileInputStream、ByteArrayInputStream、SocketInputStream等。
    • 输出流(Output Stream):用于写入数据。输出流将数据写入到目标地,如文件、数据库、网络等。常见的输出流类有FileOutputStream、ByteArrayOutputStream、SocketOutputStream等。

分类继承结构图如下:
在这里插入图片描述

3 输入、输出流代码示例

开发过程中使用比较多的是InputStreamOutputStream,这两个类层级较高的父类,是抽象类,通常会创建其下的子类。

  • InputStream

    ByteArrayInputStreamStringBufferInputStreamFileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。下面一以FileInputStreamFileOutputStream为例。

  • OutputStream

    ByteArrayOutputStreamFileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,

  1. FileInputStream案例

    字节输入流的步骤如下:

    1. 创建流对象
    2. 创建一个缓存字节的容器数组
    3. 读取数据
    4. 操作保存数据的数组
    5. 关闭流
    public void input() throws IOException {
            String fileName="D:\\file\\测试.txt";
            File file = new File(fileName);
            InputStream in = new FileInputStream(file);
            byte[] b = new byte[1024];
            //Reads some number of bytes from the input stream and stores them into the buffer array b.
            in.read(b);
            in.close();
            System.out.println(new String(b));
    }
    

    可以将文件转成流后,调用read()方法将流读取出来存到字节数组中,所存的字节数组作为参数传入,可以看到打印的正是文件中所写的内容
    在这里插入图片描述

  2. FileOutputStream案例

    将输出流写入文件的步骤如下:

    1. 选择流:创建流对象
    2. 准备数据源,把数据源转换成字节数组类型
    3. 通过流向文件当中写入数据
    4. 刷新流
    5. 关闭流
    public void output() throws IOException {
            String s = "hello";
            OutputStream out = new FileOutputStream("D:\\file\\输出.txt");
            byte[] bytes = s.getBytes();
            out.write(bytes);
            out.close();
        }
    

在这里插入图片描述

OutputStream是字节流,所以要先将输出内容转成字节数组,在通过write(byte [])方法写出去。

不要混淆了InputStream/OutputStream和File的功能

前两者只负责往文件中读写数据,只是以一种流的形式对数据内容进行多元化的操作,至于文件的生成,命名等一系列和文件整体相关的操作,是File类的责任。

还比较常用的是BufferInputStream缓冲流

缓冲流的好处:

缓冲流内部包含一个缓冲区域,默认8kb,每一次程序调用read方法其实都是从缓冲区域当中读取内容,如果读取失败就说明缓冲区域当中没有内容,那么就从数据源当中读取内容,然后会尽可能读取更多的字节放入到缓冲区域当中,最后缓冲区域当中的内容,会全部返回给程序。从缓冲区读取数据会比直接从数据源读取数据的速度快,效率也更高,性能更好。

简单说:

没有缓存区,那么每read一次,就会发送一次IO操作;
有缓存区,第一次read时,会一下读取x个字节放入缓存区,然后后续的read都会从缓存中读取,当read到缓存区末尾时,会再次读取x个字节放入缓存区。

处理流处理数据和节点流处理数据的方法基本上完全相同。

4 小结

流的读写其实很简单,且步骤比较固定,但是将文件转成流之后可操作性就变得很大很大。

一不可能直接对文件进行修改,但流是通用的,改变流的内容、形式再输出给文件,展示出来的效果就发生改变;

二是文件有可能很大,不可能将这么大的文件在网络上传递,就要转成流,一点一滴连续的传输。这就是为什么下载或上传过程中可以随意暂停、开始也不影响,因为只要保证这些点滴最终拼起来是完整的即可。

本文只演示了最简单的对txt文本格式的数据读写,原理是一样的,每一位数据都有唯一对应的字节码,可以从数据转成字节、从字节转成数据。所以才叫字节流。

但文件个格式多种多样,输出前必须要转成相同格式的流,就是在InputStreamOutputStream操作之间按照自己需求自定义操作。

5 文件在前后台之间传递

开发过程中经常需要将文件从前台传递给后台或后台传给前台,这步操作怎么实现?

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

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

相关文章

哔哩哔哩 B站 bilibili 视频倍速设置 视频倍速可自定义

目录 一、复制如下代码 二、在B站视频播放页面进入控制台 三、将复制的代码粘贴到下方输入框,并 回车Enter 即可 四、然后就可以了 一、复制如下代码 (该代码用于设置倍速为3,最后的数值是多少就是多少倍速,可以带小数点&#…

Docker容器:Harbor 私有仓库迁移

文章目录 一.私有仓库迁移的介绍1.为何要对Harbor 私有仓库的迁移2.Harbor 私有仓库的迁移特点3. Harbor 私有仓库的迁移注意要点 二.私有仓库迁移配置1.源Harbor配置(192.168.198.11)(1)接着以下操作查看容器状况及是否可以登录 …

【滑动窗口】leetcode1004:最大连续1的个数

一.题目描述 最大连续1的个数 这道题要我们找最大连续1的个数,看到“连续”二字,我们要想到滑动窗口的方法。滑动窗口的研究对象是一个连续的区间,这个区间需要满足某个条件。那么本题要找的是怎样的区间呢?是一个通过翻转0后得到…

容器导入与导出

docker的一大优势就是可移植性,容器因此docker容器可以随意的进行导入导出操作。 容器导出 使用export命令可以导出容器,具体操作如下: 创建一个容器,进行基本的配置操作 本案例中我首先创建一个nginx容器,然后启动…

开发过程中自己遇到的异常(六)

连接数据库失败: InternalError: (pymysql.err.InternalError) (1130, "Host xxx.xx.1.106 is not allowed to connect to this MySQL server") (Background on this error at: http://sqlalche.me/e/2j85) 解决方式: mysql> use mysql; …

基于静电放电算法优化的BP神经网络(预测应用) - 附代码

基于静电放电算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于静电放电算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.静电放电优化BP神经网络2.1 BP神经网络参数设置2.2 静电放电算法应用 4.测试结果:5…

DebugInfo 模型功能系统介绍 文本上色 文本与表格对齐 分隔线 秒表计算器 语义日期

背景 今天系统性的为大家介绍一下 DebugInfo 模块。这个模块提供了一些丰富的基本功能的封装,希望能给有需要的人带来些许帮助。 文本上色 DebugInfo 模块引入了 colorama提供文本颜色支持。 # -*- coding:UTF-8 -*-# region 引入必要依赖 from DebugInfo.DebugI…

NGINX相关配置

NGINX相关配置 NGINX配置信息 nginx 官方帮助文档:http://nginx.org/en/docs/Nginx的配置文件的组成部分: 主配置文件:/conf/nginx.conf(/nginx/conf/nginx.conf) 子配置文件: include conf.d/*.conf#事件驱动相关的配置 同步 event { wo…

VMware安装启动windows虚拟机出错 efi vmware virtual ...... No media

本人是在最近一台新电脑想要装windows系统的虚拟机,下载了VMware workstation 17pro,也下载了官方的windows系统镜像iso文件。 但是在开启虚拟机的过程中,出现了类似以下的错误: efi vmware virtual … No media 看到有人说需要下…

OLED透明屏技术:引领品牌营销的视觉革命

在当今竞争激烈的市场中,品牌营销的成功与否关系到企业的生存和发展。 而随着科技的不断进步,新的广告展示技术不断涌现,其中OLED透明屏技术以其独特的视觉效果和创新性的应用在品牌营销领域引起了广泛关注。 那么,尼伽将详细介…

flutter和原生利用pigeon建立通道

首先导入依赖: dependencies: pigeon: ^10.0.0定义一个文件: /// 用于定于flutter和平台的桥接方法 /// HostApi() 标记的,是用于 Flutter 调用原生的方法; /// FlutterApi() 标记的,是用于原生调用 Flutter 的方法&…

pycharm 右键运行代码时总是测试模式运行(run pytest)

*# 问题 使用pycharm时,右键运行代码,结果是这样的: 运行_‘pytesr(xxx.py 内)’ 英语界面可能是这样:run_‘pytesr(xxx.py)’我并不想使用测试模式。如何改回正常模式? 解决办法 本着遇到什么问题就搜什么问题的态…

英语略读三

课文的客观,或者逻辑推理 同增通减 比错 对比选项,找一个明显的区别 防并列,文章再说主语在干嘛干嘛的,但是与答案的角度不一样,是并列的关系 在对比选项,不是证明正确的 具体问题具体分析,but…

ICCV 2023 Oral | 从无约束图像集合中生成新视角的交叉光线神经辐射场

文章链接:https://arxiv.org/abs/2307.08093 代码链接:https://github.com/YifYang993/CR-NeRF-PyTorch.git 01. 介绍 本工作旨在通过从不受限制的图像集合(例如从互联网中爬取的图像)中合成新视角图片,从而提供3D沉浸…

在大规模推荐系统中整合 ML 模型的经验教训

一、说明 在这篇博文中,我们分享了将 Netflix 大规模搜索和推荐系统的多个相关机器学习模型整合到一个统一模型中的系统设计经验。给定不同的推荐用例,许多推荐系统将每个用例视为单独的机器学习任务,并为每个任务训练定制的 ML 模型。相比之…

Linux(基础IO、文件权限、Makefile)

目录 1、man 手册 1.1 汉化 1.2 具体使用 2、文件权限 2.1 权限理解 2.2 文件详细信息查询 2.3 权限更改 3、常用函数接口 3.1 open 3.2 read 3.3 write 3.4 close 3.5 函数使用示例 4、make与Makefile 4.1 make 与 Makefile区别 4.2 Makefile的编写 5、vim简…

windows11系统重装步骤及优化技巧

目录 目录 本文目的 Windows11介绍 Windows下载 和win10对比 重装步骤 系统设置调整 系统备份还原 C盘减肥,空间优化技巧 Java开发工具 本文目的 说明windows11的系统重装步骤,大部分步骤也适用于其他windows版本。常用软件的安装与介绍。系统…

《图解HTTP》——上野 宣

图解HTTP 看完这本书并在此博客下摘录书中的部分知识以便回顾。 第一章 了解Web及网络基础 1.1 使用HTTP协议访问Web Web使用一种名为HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流程。而协…

Compose - 交互组合项

按钮 Button OutLinedButton带外边框、TextButton只是文字、IconButton只是图标形状。 Button(onClick { }, //点击回调modifier Modifier,enabled true, //启用或禁用interactionSource MutableInteractionSource(),elevation ButtonDefaults.elevatedButtonElevation( /…

Docker网络-探索容器网络如何相互通信

当今世界,企业热衷于容器化,这需要强大的网络技能来正确配置容器架构,因此引入了 Docker Networking 的概念。Docker 是一种容器化平台,允许您在独立、轻量级的容器中运行应用程序和服务。Docker 提供了一套强大的网络功能&#x…