当前位置: 首页 > news >正文

Java中I/O系统处理流的使用

## 一、处理流概述

在Java的I/O系统中,处理流(也称为过滤流)是一种对基本的字节流或字符流进行功能增强的流。处理流本身并不直接连接到数据源或数据汇(如文件、网络连接等),而是包裹在其他的节点流(直接与数据源或数据汇交互的流)之上,从而为节点流添加额外的功能,例如缓冲、转换编码、数据处理等功能。

## 二、常见的处理流及使用示例

### (一)缓冲流(BufferedInputStream和BufferedOutputStream、BufferedReader和BufferedWriter)

1. **缓冲字节流**
   - **BufferedInputStream**
     - 作用:为输入字节流提供缓冲功能。它内部有一个缓冲区,减少了从底层数据源(如文件或网络连接)读取数据的次数,从而提高了读取效率。
     - 示例:
       ```java
       import java.io.BufferedInputStream;
       import java.io.FileInputStream;
       import java.io.IOException;

       public class BufferedInputStreamExample {
           public static void main(String[] args) {
               try {
                   FileInputStream fis = new FileInputStream("test.txt");
                   BufferedInputStream bis = new BufferedInputStream(fis);
                   int data;
                   while ((data = bis.read())!= -1) {
                       System.out.print((char) data);
                   }
                   bis.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       ```
   - **BufferedOutputStream**
     - 作用:为输出字节流提供缓冲功能。数据先写入缓冲区,当缓冲区满或者手动刷新时,才将数据写入底层的输出流。
     - 示例:
       ```java
       import java.io.BufferedOutputStream;
       import java.io.FileOutputStream;
       import java.io.IOException;

       public class BufferedOutputStreamExample {
           public static void main(String[] args) {
               try {
                   FileOutputStream fos = new FileOutputStream("output.txt");
                   BufferedOutputStream bos = new BufferedOutputStream(fos);
                   String data = "Hello, World!";
                   byte[] bytes = data.getBytes();
                   bos.write(bytes);
                   bos.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       ```
2. **缓冲字符流**
   - **BufferedReader**
     - 作用:为字符输入流提供缓冲功能,并且提供了方便的`readLine`方法,可以按行读取字符数据。
     - 示例:
       ```java
       import java.io.BufferedReader;
       import java.io.FileReader;
       import java.io.IOException;

       public class BufferedReaderExample {
           public static void main(String[] args) {
               try {
                   FileReader fr = new FileReader("test.txt");
                   BufferedReader br = new BufferedReader(fr);
                   String line;
                   while ((line = br.readLine())!= null) {
                       System.out.println(line);
                   }
                   br.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       ```
   - **BufferedWriter**
     - 作用:为字符输出流提供缓冲功能,并且提供了`newLine`方法,可以方便地写入换行符。
     - 示例:
       ```java
       import java.io.BufferedWriter;
       import java.io.FileWriter;
       import java.io.IOException;

       public class BufferedWriterExample {
           public static void main(String[] args) {
               try {
                   FileWriter fw = new FileWriter("output.txt");
                   BufferedWriter bw = new BufferedWriter(fw);
                   bw.write("This is a test");
                   bw.newLine();
                   bw.write("Another line");
                   bw.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       ```

### (二)转换流(InputStreamReader和OutputStreamWriter)

1. **InputStreamReader**
   - 作用:将字节流转换为字符流。它使用指定的字符编码将字节输入流中的字节解码为字符。
   - 示例:假设我们有一个UTF - 8编码的文件,我们可以使用`InputStreamReader`来正确地读取其中的字符内容。
       ```java
       import java.io.FileInputStream;
       import java.io.IOException;
       import java.io.InputStreamReader;

       public class InputStreamReaderExample {
           public static void main(String[] args) {
               try {
                   FileInputStream fis = new FileInputStream("test_utf8.txt");
                   InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
                   int data;
                   while ((data = isr.read())!= -1) {
                       System.out.print((char) data);
                   }
                   isr.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       ```
2. **OutputStreamWriter**
   - 作用:将字符流转换为字节流。它使用指定的字符编码将字符转换为字节,然后写入字节输出流。
   - 示例:
       ```java
       import java.io.FileOutputStream;
       import java.io.IOException;
       import java.io.OutputStreamWriter;

       public class OutputStreamWriterExample {
           public static void main(String[] args) {
               try {
                   FileOutputStream fos = new FileOutputStream("output_utf8.txt");
                   OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
                   String data = "这是一段测试文字";
                   osw.write(data);
                   osw.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       ```

### (三)数据输入输出流(DataInputStream和DataOutputStream)

1. **DataInputStream**
   - 作用:允许应用程序以与机器无关的方式从底层输入流中读取基本的Java数据类型(如`int`、`double`、`boolean`等)。
   - 示例:
       ```java
       import java.io.DataInputStream;
       import java.io.FileInputStream;
       import java.io.IOException;

       public class DataInputStreamExample {
           public static void main(String[] args) {
               try {
                   FileInputStream fis = new FileInputStream("data.bin");
                   DataInputStream dis = new DataInputStream(fis);
                   int num = dis.readInt();
                   double d = dis.readDouble();
                   boolean b = dis.readBoolean();
                   System.out.println("Int: " + num + ", Double: " + d+ ", Boolean: " + b);
                   dis.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       ```
   - 在这个示例中,假设`data.bin`文件中已经按照`int`、`double`、`boolean`的顺序写入了相应类型的数据。
2. **DataOutputStream**
   - 作用:允许应用程序以与机器无关的方式将基本的Java数据类型写入到底层输出流中。
   - 示例:
       ```java
       import java.io.DataOutputStream;
       import java.io.FileOutputStream;
       import java.io.IOException;

       public class DataOutputStreamExample {
           public static void main(String[] args) {
               try {
                   FileOutputStream fos = new FileOutputStream("data.bin");
                   DataOutputStream dos = new DataOutputStream(fos);
                   dos.writeInt(10);
                   dos.writeDouble(3.14);
                   dos.writeBoolean(true);
                   dos.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       ```

## 三、总结

处理流在Java I/O系统中起着非常重要的作用。它们通过包裹节点流,为基本的I/O操作提供了诸如缓冲、编码转换、数据类型处理等丰富的功能。合理地使用处理流可以提高I/O操作的效率、方便数据的处理以及确保数据的正确读写。在实际开发中,根据具体的需求选择合适的处理流组合是非常关键的。


http://www.mrgr.cn/news/63392.html

相关文章:

  • 布谷语音源码服务器搭建环境及配置流程
  • AI-基本概念-多层感知器模型/CNN/RNN/自注意力模型
  • flask websocket服务搭建,flask-sock 和 flask-socketio
  • opencv python笔记
  • 水生生物图像分割系统:创新方法解析
  • 界面控件Kendo UI for Angular 2024 Q3亮点 - 全新的页面模板
  • Java EasyExcel 导出报内存溢出如何解决
  • WSGI、uwsgi、uWSGI与Nginx
  • sqoop问题汇总记录
  • <实用干货>临床试验数据信息查询--中国临床试验数据库
  • 牛客网最新Java高频面试题汇总(2024最新含答案)
  • Rust 力扣 - 189. 轮转数组
  • ^M 字符处理
  • GaussDB Ustore存储引擎解读
  • Google Play商店中的类似应用:它们对ASO优化重要吗?
  • go-zero 的使用
  • 探索医学数据:使用Seaborn的成对关系图揭示变量间的关联
  • Leetcode 62. 不同路径 动态规划+空间优化
  • 【文本情感分析识别】Python+SVM算法+模型训练+文本分类+文本情感分析
  • vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了
  • 低代码技术:加速企业数字化转型的利器
  • 河南高校大数据实验室建设案例分享
  • 第十九章 特殊工具与技术
  • 10 P1094 [NOIP2007 普及组] 纪念品分组
  • Nginx 文件名逻辑漏洞(CVE-2013-4547)
  • ctfshow--xss靶场web327-web333(一命速通不了的靶场)