Java中的I/O系统中的字节流

## 一、简介
在Java的I/O体系中,节点流是直接与数据源或数据汇(目的地)相连的流。它们构成了数据传输的最底层操作,是构建更复杂的I/O操作的基础。理解节点流对于深入掌握Java的I/O系统至关重要。

## 二、文件相关的节点流

### 1. `FileInputStream`
 - **功能与特点**
   - `FileInputStream`是字节输入节点流,用于从文件中读取字节数据。它直接与文件系统中的文件建立连接,按照字节顺序读取文件内容。这意味着它可以处理任何类型的文件,无论是文本文件、二进制文件(如图片、音频等)。
   - 例如,当读取一个二进制图像文件时,`FileInputStream`可以逐个字节地获取文件中的数据,而不需要对文件内容进行任何特殊的解释(因为它只是处理字节)。
 - **示例代码**
   ```java
   import java.io.File;
   import java.io.FileInputStream;
   import java.io.IOException;

   public class FileInputStreamExample {
       public static void main(String[] args) {
           try {
               File file = new File("example.txt");
               FileInputStream fis = new FileInputStream(file);
               int data;
               while ((data = fis.read())!= -1) {
                   System.out.print((char) data);
               }
               fis.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }
   ```
   - 在这个示例中,我们创建了一个`FileInputStream`对象来读取`example.txt`文件。通过`read`方法逐个字节地读取文件内容,直到到达文件末尾(`read`返回 -1)。

### 2. `FileOutputStream`
 - **功能与特点**
   - `FileOutputStream`是字节输出节点流,用于将字节数据写入文件。它直接操作文件系统中的文件,将字节流按照顺序写入文件。如果文件不存在,它可以创建新文件;如果文件已经存在,根据构造函数的不同参数设置,可以选择覆盖原有文件内容或者追加内容到文件末尾。
   - 例如,当我们想要保存从网络上下载的二进制文件(如一个软件安装包)到本地磁盘时,可以使用`FileOutputStream`将字节数据写入到指定的文件中。
 - **示例代码**
   ```java
   import java.io.File;
   import java.io.FileOutputStream;
   import java.io.IOException;

   public class FileOutputStreamExample {
       public static void main(String[] args) {
           try {
               File file = new File("output.txt");
               FileOutputStream fos = new FileOutputStream(file);
               String data = "Hello, World!";
               byte[] byteData = data.getBytes();
               fos.write(byteData);
               fos.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }
   ```
   - 这里我们创建了一个`FileOutputStream`对象来写入`output.txt`文件。将字符串"Hello, World!"转换为字节数组后,使用`write`方法将字节数据写入文件。

### 3. `FileReader`
 - **功能与特点**
   - `FileReader`是字符输入节点流,专门用于读取文本文件中的字符数据。与`FileInputStream`不同,`FileReader`在读取数据时会考虑字符编码,能够正确地将字节转换为字符。它以字符为单位读取文件内容,使得处理文本文件更加方便和直观。
   - 例如,当读取一个包含中文字符的文本文件时,`FileReader`可以正确地将字节按照合适的编码(如UTF - 8)转换为字符,而不会出现乱码问题(前提是编码设置正确)。
 - **示例代码**
   ```java
   import java.io.File;
   import java.io.FileReader;
   import java.io.IOException;

   public class FileReaderExample {
       public static void main(String[] args) {
           try {
               File file = new File("example.txt");
               FileReader fr = new FileReader(file);
               int data;
               while ((data = fr.read())!= -1) {
                   System.out.print((char) data);
               }
               fr.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }
   ```
   - 在这个示例中,`FileReader`从`example.txt`文本文件中逐个字符地读取数据,直到文件末尾。

### 4. `FileWriter`
 - **功能与特点**
   - `FileWriter`是字符输出节点流,用于将字符数据写入文本文件。它同样会根据系统默认的字符编码(或者可以指定编码)将字符转换为字节后写入文件。如果文件不存在,会创建新文件;如果文件存在,默认会覆盖原有文件内容,但也可以设置为追加模式。
   - 例如,当我们想要记录一些日志信息到文本文件时,可以使用`FileWriter`将字符形式的日志内容写入到文件中。
 - **示例代码**
   ```java
   import java.io.File;
   import java.io.FileWriter;
   import java.io.IOException;

   public class FileWriterExample {
       public static void main(String[] args) {
           try {
               File file = new File("output.txt");
               FileWriter fw = new FileWriter(file);
               fw.write("This is a sample text.");
               fw.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }
   ```
   - 这里`FileWriter`将指定的字符串写入到`output.txt`文件中。

## 三、数组相关的节点流

### 1. `ByteArrayInputStream`
 - **功能与特点**
   - `ByteArrayInputStream`是字节输入节点流,它的数据源是一个字节数组。这在处理内存中的字节数据时非常有用,例如,当我们已经将一些数据读取到字节数组中,想要对这些数据进行类似文件读取的操作(如按照顺序逐个字节处理)时,可以使用`ByteArrayInputStream`。
   - 它允许我们将字节数组视为一个输入流的数据源,从而可以复用很多针对输入流的操作方法。
 - **示例代码**
   ```java
   import java.io.ByteArrayInputStream;

   public class ByteArrayInputStreamExample {
       public static void main(String[] args) {
           byte[] byteArray = {65, 66, 67};
           ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
           int data;
           while ((data = bais.read())!= -1) {
               System.out.print((char) data);
           }
       }
   }
   ```
   - 在这个示例中,我们创建了一个包含字符'A'、'B'、'C'(对应的ASCII码值)的字节数组,然后使用`ByteArrayInputStream`将字节数组作为数据源进行读取操作。

### 2. `ByteArrayOutputStream`
 - **功能与特点**
   - `ByteArrayOutputStream`是字节输出节点流,它将字节数据输出到一个字节数组中。这在需要在内存中构建字节数据时非常有用,例如,当我们想要动态地生成一些字节数据(如将多个小的字节数据片段组合成一个大的字节数组)时,可以使用`ByteArrayOutputStream`。
   - 它提供了一种方便的方式来操作字节数据,最后可以通过`toByteArray`方法获取生成的字节数组。
 - **示例代码**
   ```java
   import java.io.ByteArrayOutputStream;

   public class ByteArrayOutputStreamExample {
       public static void main(String[] args) {
           ByteArrayOutputStream baos = new ByteArrayOutputStream();
           try {
               baos.write(65);
               baos.write(66);
               baos.write(67);
           } catch (java.io.IOException e) {
               e.printStackTrace();
           }
           byte[] result = baos.toByteArray();
           for (byte b : result) {
               System.out.print((char) b);
           }
       }
   }
   ```
   - 在这个示例中,我们使用`ByteArrayOutputStream`向字节数组中写入字符'A'、'B'、'C'(对应的ASCII码值),然后获取生成的字节数组并打印出对应的字符。

## 四、管道相关的节点流

### 1. `PipedInputStream`和`PipedOutputStream`
 - **功能与特点**
   - `PipedInputStream`和`PipedOutputStream`是用于线程间通信的字节流。`PipedOutputStream`用于向管道写入字节数据,`PipedInputStream`用于从管道读取字节数据。它们必须成对使用,并且在使用前需要连接起来。
   - 例如,在一个多线程的应用中,一个线程负责生成数据,另一个线程负责处理数据,就可以使用`PipedInputStream`和`PipedOutputStream`来实现数据在两个线程之间的传递。
 - **示例代码**
   ```java
   import java.io.IOException;
   import java.io.PipedInputStream;
   import java.io.PipedOutputStream;

   class DataProducer implements Runnable {
       private PipedOutputStream pos;

       public DataProducer(PipedOutputStream pos) {
           this.pos = pos;
       }

       @Override
       public void run() {
           try {
               String data = "Hello, Pipe!";
               byte[] byteData = data.getBytes();
               pos.write(byteData);
               pos.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }

   class DataConsumer implements Runnable {
       private PipedInputStream pis;

       public DataConsumer(PipedInputStream pis) {
           this.pis = pis;
       }

       @Override
       public void run() {
           try {
               int data;
               while ((data = pis.read())!= -1) {
                   System.out.print((char) data);
               }
               pis.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }

   public class PipedStreamExample {
       public static void main(String[] args) {
           try {
               PipedOutputStream pos = new PipedOutputStream();
               PipedInputStream pis = new PipedInputStream();
               pos.connect(pis);

               Thread producerThread = new Thread(new DataProducer(pos));
               Thread consumerThread = new Thread(new DataConsumer(pis));

               producerThread.start();
               consumerThread.start();

               producerThread.join();
               consumerThread.join();
           } catch (IOException | InterruptedException e) {
               e.printStackTrace();
           }
       }
   }
   ```
   - 在这个示例中,`DataProducer`线程使用`PipedOutputStream`向管道写入数据,`DataConsumer`线程使用`PipedInputStream`从管道读取数据。

节点流在Java的I/O系统中提供了直接与各种数据源和数据目的地交互的能力,是构建复杂I/O操作的基础组件。通过合理地使用不同类型的节点流,我们可以有效地处理文件、内存数据以及线程间的数据传输等各种I/O相关的任务。

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

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

相关文章

AnaTraf | 提升网络性能:深入解析网络关键指标监控、TCP重传与TCP握手时间

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的数字化时代,网络的稳定性和性能对企业的运营效率至关重要。无论是内部通信、应用程序的运行,还是对外提供服务,网络都发挥着关键作用。对于网络工程师或IT运维人员…

【多类别分类中的准确率召回率平均策略】

文章目录 1. 机器学习中的微平均策略(Micro Average Strategy)2. 机器学习中的宏平均策略(Macro Average Strategy)3、weighted 平均策略 1. 机器学习中的微平均策略(Micro Average Strategy) 在机器学习和…

移动端面试问题笔记(一)

1. 1pxborder的问题 原因: 设备像素比不同 从移动端的角度说个具体的场景,以iphone6为例。 iphone6的屏幕宽度为375px,设计师做的视觉稿一般是750px,也就是2x,这个时候设计师在视觉稿上画了1px的边框,于是你就写了“bo…

EasyX图形库的安装

前言 EasyX是一个图形库,可以用来做一些c/c小游戏,帮助学习。 一、进入EasyX官网 https://easyx.cn/ 二、点击下载EasyX 三、下载好后以管理员身份运行它 四、点击下一步 五、然后它会自动检测你的编辑器,用哪个就在哪个点安装 六、安装成功…

【linux问题】Linux命令行终端窗口的输出,显示不全问题

Linux命令行终端窗口的输出,显示不全问题 问题: 图中显示的是一个Linux命令行终端窗口, nmcli dev wifi 是一个命令——列出所有能用的Wi-Fi。 执行命令后,窗口输出了显示了所有能用的Wi-Fi网络列表。 但是在每一行末尾有一个“…

KPaaS:基于微服务架构的低代码平台

基于微服务架构的低代码平台是当前企业数字化转型的重要工具。通过将微服务架构与低代码平台结合,可以实现高效、灵活且可扩展的应用开发。在当今数字化转型的浪潮中,企业面临着诸多挑战,其中IT资源有限以及对高效开发的需求尤为突出。KPaaS业…

AI一键生成钢铁是怎样炼成的ppt!用这2个工具轻松拿捏ppt制作!

钢铁是怎样炼成的,是中小学语文新课标必读书目,它是由前苏联作家尼古拉奥斯特洛夫斯基于1930年至1934年写成的半自传体长篇小说,全书详细记叙了保尔柯察金于20世纪初期的成长历程。 对于每个接受过九年义务教育的大小朋友来说,这…

漏洞挖掘JS构造新手向

前置思路文章 JS逆向混淆前端对抗 油猴JS逆向插件 JS加解密之mitmproxy工具联动Burp JS挖掘基础 伪协议 JavaScript伪协议是一种在浏览器中模拟网络请求的方法。它使用window.XMLHttpRequest对象或fetch()方法来模拟发送HTTP请求,而不是通过实际的网络请求来获…

碰到这个问题请更新或重新安装fastapi版本

ValueError: too many values to unpack (expected 2) ERROR: Exception in ASGI application Traceback (most recent call last) File "/usr/local/lib/python3.8/site-packages… Ubuntu,容器中, 碰到上面这个问题,请更新fastapi的版…

微信小程序——编写一个表白墙小程序

一、前期准备 注册微信小程序账号 在微信公众平台上注册小程序账号,获取小程序的 AppID。 安装开发工具 下载并安装微信开发者工具,用于小程序的开发、调试和预览。 二、界面设计 首页 展示最新的表白内容列表,每条表白可以包括发布者昵称、…

⌈ 传知代码 ⌋ 无监督动画中关节动画的运动表示

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

前端响应式布局

1.什么是响应式布局? 响应式布局是一种使网页在不同设备(如手机、平板和桌面)上均能良好显示的设计理念。 2.响应式布局的原理? 通过灵活的网格布局、CSS 媒体查询和弹性单位等技术,实现内容自适应屏幕尺寸变化。 3.响…

Spring 的三级缓存机制

Spring 在处理 循环依赖 时使用了 三级缓存机制,这是 Singleton Bean 创建过程中为了解决循环依赖的一种策略。通过三级缓存,Spring 可以提前暴露未完全初始化的对象,避免循环依赖导致的无限递归错误。 1. 三级缓存的结构 Spring IOC 容器的…

开发规范 - mac系统1小时装机极速装机开发环境

idea 官网下载,然后想办法破解 idea必备配置 设置自动import IDEA插件安装 idea必备插件 maven helperlombokMybatisX jdk配置 jdk不用单配配置,在idea中,选择一个语言环境(jdk8/jdk11/jdk17…),然后默认下载j…

php计算经纬度距离 及 某点是否在经纬度节点范围

js版 计算经纬度距离 及 某点是否在经纬度节点范围 本文档由 https://blog.csdn.net/AdminGuan/article/details/128118657 改版而来。 php 版 计算经纬度距离 及 某点是否在经纬度节点范围 public function index(){//1.计算两个点(经纬度)的距离$staVal [lng > 106.64…

unity学习笔记-Text mesh Pro

Text mesh Pro组件 组件使用的大致流程细节导入之后字体没有显示可能一可能二 注意事项 好久没更了…最近在学习使用别人的框架进行开发,坑也不少,不过学习到了很多设计思维。 言归正传。忘了是什么是时候的版本开始,unity多了这个组件&#…

K哥30个站点的逆向爬虫代码|pyexecjs库的基本使用

仓库地址:https://github.com/kgepachong/crawler/ 常见问题 JS 代码里引用了三个库,npm install 安装一下即可,如果安装了还提示找不到库,那就是路径问题,推荐在当前目录下执行命令安装,或者在 Python 代…

WPF入门_02依赖属性

1、依赖属性主要有以下三个优点 1)依赖属性加入了属性变化通知、限制、验证等功能。这样可以使我们更方便地实现应用,同时大大减少了代码量 2)节约内存:在WinForm中,每个UI控件的属性都赋予了初始值,这样每个相同的控件在内存中都会保存一份初始值。而WPF依赖属性很好地…

uiautomatorviewer安卓9以上正常使用及问题处理

一、安卓9以上使用uiautomatorviewer问题现象 打开Unexpected error while obtaining UI hierarchy 问题详情 Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException 二、问题处理 需要的是替换对应D:\software\android-sdk-windows…

Linux环境下Jmeter执行压测脚本

Linux环境下Jmeter执行压测脚本 前提官网下载Jmeter执行脚本 前提 注意:Jmeter的运行依赖Java环境 官网下载Jmeter 1、下载链接:https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zip 2、解压 unzip apache-jmeter-5.6.3.zip 执行脚本…