浅析Java.IO输入输出流 过滤流 buffer流和data流

浅析Java.IO输入输出流 过滤流 Buffer流和Data流

什么是Java IO

Java IO 是针对输入和输出数据的流处理 API。Java IO 库中包含了一组类和接口,提供了对标准输入、输出和文件系统的访问。

在 Java IO 中,数据承载的载体为流(stream)。流是指在数据源和数据目的地之间建立起的一条虚拟的传输通道,数据按照字节的方式在流中传输。Java IO 中的流可以按照接口和实现类分为四种:

  1. 字节流
  2. 字符流
  3. 过滤流
  4. 对象流

在本篇攻略中,我们将着重介绍流中的两种:过滤流和缓冲流。

过滤流

过滤流(FilterStream)是一种节点流,它对新的输入流或输出流添加功能的流。FilterInputStream 和 FilterOutputStream 为其提供了基础。所有的过滤流都是对一个输入流或输出流进行操作,因此其作用可以理解为“修饰”流,通过向构造方法中传递InputStream或OutputStream来简化其他流的操作。

使用过滤流可以在运行时根据需要添加或删除某些特性,进而提高流读写的效率和灵活性。

示例1:使用 GZIP 压缩过滤流压缩文件

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

public class CompressedFile {

    public static void main(String[] args) throws IOException {
        String fileInput = "example.txt";
        String fileOutput = "example.gz";
        FileInputStream input = new FileInputStream(fileInput);
        GZIPOutputStream gzipOutput = new GZIPOutputStream(new FileOutputStream(fileOutput));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = input.read(buffer)) > 0) {
            gzipOutput.write(buffer, 0, len);
        }
        input.close();
        gzipOutput.finish();
        gzipOutput.close();
        System.out.println("File successfully compressed.");
    }

}

上述代码使用 GZIP 压缩过滤流压缩文件。通过使用 GZIPOutputStream 将字节数据压缩成 gzip 文件。需要注意的是,输出流参数中传递的是 FileOutputStream,这是一种节点流,这也可以理解为是一种过滤流。

缓冲流

与过滤流相似,缓冲流(BufferStream)也是一种节点流,它包装了对其他输入输出流的操作,添加了缓存功能,以提高已有输入输出流的效率。所以,它提供了对读写大量数据时的缓存机制,避免了频繁读写硬盘等设备造成的性能问题。

缓冲流依然是与其他输入输出流配合使用的,常用的缓冲流包括BufferedInputStream 和 BufferedOutputStream。

示例2:从文件中读取大量数据

import java.io.*;

public class ReadFromFile {
    public static void main(String[] args) throws IOException {
        String file = "example.txt";
        int bufferSize = 8 * 1024;
        InputStream inputStream = new FileInputStream(file);
        BufferedInputStream bufferedInput = new BufferedInputStream(inputStream, bufferSize);
        byte[] bytes = new byte[bufferSize];
        int offset = 0;
        int numRead;
        while ((numRead = bufferedInput.read(bytes, offset, bufferSize)) > 0) {
            offset += numRead;
        }
        bufferedInput.close();
        System.out.println("File successfully read.");
    }
}

上述代码演示了如何通过缓冲流从文件中读取大量数据。通过使用 BufferedInputStream 及其构造方法的“bufferSize”参数指定缓冲区大小。例如本例中,缓冲大小被设定为 8kb,即缓冲区可以存储 8 * 1024 个字节。读取到的数据先全部存入缓冲区,再从缓冲区获取数据,避免了频繁读写硬盘等设备造成的性能问题,从而使文件的读写效率有了很大的提升。

Data流

Data流是Java IO中的一种数据源和数据目的地都是Java基本数据类型,与其他输入输出流不同,它不仅支持数据的读写,还提供了一些转换数据格式的方法,如 readInt() 和 writeInt() 方法,用于读写整数数据。

Java IO 中的 DataInputStream 和 DataOutputStream 是实现 Data流 的基础。DataOutputStream 提供了向输出流的方法,用来写入基本类型和字符串等常见类型数据;DataInputStream 提供了来自输入流的方法,用来读取和反序列化出写入到 DataOutputStream 中的类型数据。

示例3:读写基本数据类型

import java.io.*;

public class DataStreamExample {
    public static void main(String[] args) throws Exception {
        String dataFile = "example.txt";
        BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream(dataFile));
        DataOutputStream dataOutput = new DataOutputStream(bufferedOutput);

        dataOutput.writeDouble(3.1415926);
        dataOutput.writeInt(1000000);
        dataOutput.writeBoolean(false);

        dataOutput.close();

        BufferedInputStream bufferedInput = new BufferedInputStream(new FileInputStream(dataFile));
        DataInputStream dataInput = new DataInputStream(bufferedInput);

        System.out.println(dataInput.readDouble());
        System.out.println(dataInput.readInt());
        System.out.println(dataInput.readBoolean());

        dataInput.close();
        System.out.println("File successfully read.");
    }
}

上述代码演示了如何使用 Data 输入输出流在文件中读取和写入基本数据类型。该例子首先创建一个文件,并将基本数据类型写入该文件。寻找数据逐个创建一个 DataInputStream,读取文件中的各个数据,再依交叉读取数据读取数据。最后,关闭 DataInputStream,道旁文件读取结束。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析Java.IO输入输出流 过滤流 buffer流和data流 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java拷贝数组方法Arrays.copyOf()是地址传递的证明实例

    首先,需要说明Java中的数组是引用数据类型,因此数组的传递都是地址传递。Arrays.copyOf()方法也不例外,它返回的是被拷贝的新数组的引用。 接下来,我们将通过两个示例来证明。假设现在有一个原数组arr,我们通过Arrays.copyOf()方法,创建一个新的数组copyArr: 示例一 int[] arr = {1, 2, 3}; int[] c…

    Java 2023年5月26日
    00
  • java实用验证码的实现代码

    针对“java实用验证码的实现代码”的完整攻略,我将以下面几个部分进行详细讲解: 验证码介绍:了解什么是验证码以及它的作用。 验证码实现思路:介绍如何实现验证码的代码。 验证码实现示例:提供两个示例说明。 1. 验证码介绍 验证码全称为“Completely Automated Public Turing test to tell Computers and…

    Java 2023年5月23日
    00
  • 浅谈用SpringBoot实现策略模式

    下面我将详细讲解如何用SpringBoot实现策略模式。 策略模式简介 策略模式是一种行为设计模式,它使得我们可以在运行时从一组算法中选择其中一种算法,并将其应用到特定的场景中。策略模式主要由三种角色组成: Context(上下文):主要负责接收客户端的请求,并将请求委托给具体的策略对象进行处理。 Strategy(策略):定义所有具体策略类必须实现的接口/…

    Java 2023年5月15日
    00
  • Perl使用Tesseract-OCR实现验证码识别教程

    下面我将为您详细讲解如何使用Perl语言配合Tesseract-OCR开源库实现验证码识别。整个过程共分为以下几个步骤: 安装Tesseract-OCR 安装Perl模块 获取验证码图片 预处理图片 使用Tesseract-OCR进行识别 整合以上步骤 接下来,我们将一步一步来看每个步骤的详细说明。 安装Tesseract-OCR Tesseract-OCR…

    Java 2023年5月26日
    00
  • 浅析JPA分类表的操作函数

    下面为您详细讲解浅析JPA分类表的操作函数的完整攻略。 简介 JPA是Java Persistence API的缩写,它是JavaEE用于ORM的标准框架,可以方便地处理Java对象与关系型数据库之间的映射关系。在JPA中,分类表(分表)是一种处理大量数据的常用技术,它将一个大表拆分为多个小表,以提高查询、更新等操作的效率。 分类表的实现方式 1. 基于En…

    Java 2023年5月26日
    00
  • Java Apache POI报错“POIXMLException”的原因与解决办法

    “POIXMLException”是Java的Apache POI类库中的一个异常,通常由以下原因之一引起: 文件格式错误:如果文件格式不正确,则可能会出现此异常。例如,可能会尝试读取非Excel文件或尝试读取损坏的Excel文件。 以下是两个实例: 例1 如果文件格式错误,则可以尝试使用正确的文件格式以解决此问题。例如,在Java中,可以使用以下代码: F…

    Java 2023年5月5日
    00
  • 如何实现人民币的大写转换?

    人民币的大写转换是前端开发中需要涉及到的一个非常常见的需求,下面我将详细讲解如何实现人民币的大写转换。 1. 准备工作 首先需要明确的是,人民币的大写转换规则是非常繁琐复杂的,因此写代码之前我们需要理清楚具体的转换规则。在这里,我提供一个比较通用的代码实现,其中包含了大部分的转换规则,如果有需要可以根据自己的实际需求做调整。代码实现如下: function …

    Java 2023年6月15日
    00
  • Mybatis实现自动生成增删改查代码

    下面我给你详细讲解一下Mybatis实现自动生成增删改查代码的完整攻略。 概述 Mybatis是一款基于Java的持久层框架,它提供了自动生成增删改查代码的功能,让开发人员可以快速生成常用的CRUD操作。可以大大提高代码的开发效率,减少了数据库访问层的开发工作量。 步骤 实现Mybatis自动生成增删改查代码的过程如下: 配置Mybatis Generato…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部