IO流 详细介绍

这篇具有很好参考价值的文章主要介绍了IO流 详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、IO流概述

1.IO:输入(Input读取数据)/输出(Output写数据)

2.流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输,IO流就是用来处理设备间数据传输问题的。

3.常见的应用:文件上传、下载、复制等。

IO流 详细介绍,java

文件通常是由一连串的字节或字符构成,组成文件的字节序列称为字节流,组成文件的字符序列称为字符流。Java中根据流的方向可以分为输入流和输出流。输入流是将文件或其它输入设备的数据加载到内存的过程;输出流恰恰相反,是将内存中的数据保存到文件或其他输出设备,详见下图:

IO流 详细介绍,java

 二、IO流分类

2.1  根据数据流向分类:  

输入流:读数据  将硬盘中的数据读取到内存中  

输出流:写数据  将程序中的数据写入到硬盘中

IO流 详细介绍,java

2.2  按照数据类型来分:

字节流: 字节输入流/字节输出流  

字符流: 字符输入流/字符输出流

2.3  IO流应用场景:  

纯文本文件,优先使用字符流  

图片、视频、音频等二进制文件,优先使用字节流  

不确定文件类型,优先使用字节流,字节流是万能的流

2.4  InputStream(字节输入流)、OutputStream(字节输出流)、Reader(字符输入流)、Writer(字符输出流)

2.4.1  InputStream(字节输入流)

InputStream是字节输入流,InputStream是一个抽象类,所有继承了InputStream的类都是字节输入流,主要了解以下子类即可:

IO流 详细介绍,java

主要方法介绍: 

void

close()
关闭此输入流并释放与该流关联的所有系统资源。

abstract int

read()
从输入流读取下一个数据字节。(多次调用会按顺序依次读取)返回-1表示读取完毕

int

read(byte[] b)
从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。

int

read(byte[] b, int off, int len)
将输入流中最多 len 个数据字节读入字节数组。

2.4.2  OutputStream(字节输出流)

IO流 详细介绍,java

主要方法介绍: 

void

close()
关闭此输出流并释放与此流有关的所有系统资源。

void

flush()
刷新此输出流并强制写出所有缓冲的输出字节。

void

write(byte[] b)
将 b.length 个字节从指定的字节数组写入此输出流。

void

write(byte[] b, int off, int len)
将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。

abstract void

write(int b)
将指定的字节写入此输出流。

2.4.3  Reader(字符输入流)

所有继承了Reader都是字符输入流

IO流 详细介绍,java

主要方法介绍:

abstract void

close()
关闭该流。

int

read()
读取单个字符。(多次调用会按顺序依次读取)返回-1表示读取完毕

int

read(char[] cbuf)
将字符读入数组。

abstract int

read(char[] cbuf, int off, int len)
将字符读入数组的某一部分。

 2.4.4  Writer(字符输出流)

所有继承了Writer都是字符输出流

IO流 详细介绍,java

主要方法介绍:

Writer

append(char c)
将指定字符追加到此 writer。

abstract void

close()
关闭此流,但要先刷新它。

abstract void

flush()
刷新此流。

void

write(char[] cbuf)
写入字符数组。

abstract void

write(char[] cbuf, int off, int len)
写入字符数组的某一部分。

void

write(int c)
写入单个字符。

void

write(String str)
写入字符串。

void

write(String str, int off, int len)
写入字符串的某一部分。

 三、文件流

3.1  FileInputStream(文件字节输入流)

FileInputStream:从文件系统中的文件获取输入字节;

FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件有文件系统中的路径名name命名;

步骤:

1.创建字节输入流对象

2.调用字节输入流对象的读数据方法

3.释放资源

字节流读取数据:

方法名称

说明

int read()

从该输入流读取一个字节数据,返回值为-1时说明文件读取完毕(多次调用会按顺序依次读取)

int

read(byte[] b)
从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。

int

read(byte[] b, int off, int len)
将输入流中最多 len 个数据字节读入字节数组。

InputStream in = new FileInputStream("d:/a.txt");

int c = 0;
while((c = in.read()) != -1){
    System.out.println(c);
}

in.close();

上述代码在执行时:如果在执行in.read()时没有读取到末尾,即文件还有可读取的数据,in.read()方法会返回下一个可用字节的整数值(0-255之间)。如果已经读取到了文件末尾,in.read()方法会返回-1。

3.2  FileOutputStream(文件字节输出流)

IO流 详细介绍,java

字节流写入数据常用的三种方式: 

方法名称

说明

void write(int b)

将指定的字节写入此文件输出流 一次写一个字节数据

void write(byte[] b)

将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据

void write(byte[] b, int off, int len)

将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据

void write(byte[] b, int off, int len)是Java中OutputStream类的一个方法,用于将指定字节数组中的一部分数据写入输出流。

参数解释:

  • b:要写入的字节数组。
  • off:写入的起始偏移量,即从数组的第off个位置开始写入数据。
  • len:要写入的字节数,即写入b数组中从off位置开始的连续len个字节。

如何追加写入数据:

字节流写入数据通过 new FileOutputStream(new File("mayikt.txt"), true); 表示追加写入数据。 如果第二个参数为true,则字节流写入文件的末尾。此方法通过在构造FileOutputStream对象时将第二个参数设置为true来实现追加写入。

InputStream in = new FileInputStream("d:/a.txt");
OutputStream out = new FileOutputStream("d:/aa.txt");

int c = 0;
while((c = in.read()) != -1){
    out.write(c);
}

in.close();
out.close();

一次读取1024个byte,一个kb: 

import java.io.*;

public class Demo03 {
    public static void main(String[] args) throws IOException {
        InputStream is = new FileInputStream("d:/apache-tomcat-8.5.75.zip");
        OutputStream os = new FileOutputStream("d:/tomcat.zip",true);//append:true 追加
        byte[] b = new byte[1024];
        int len = 0;

        while ( (len = is.read(b)) != -1 ){
            os.write(b,0,len);
        }

        //关闭IO流管道 关闭的时候会有刷新作用
        is.close();
        os.close();
    }
}

3.3  FileReader(文件字符输入流)

FileReader是一字符为单位读取文件,也就是一次读取两个字节,如:

IO流 详细介绍,java

Reader r = new FileReader("E:/a.txt");
int c = 0;
while((c = r.read()) != -1){
    char ch = (char)c;
    System.out.println(ch);
}
r.close();

3.4  FileWriter(文件字符输出流)

Reader r = new FileReader("d:/a.txt");
Writer w = new FileWriter("d:/aaa.txt",true);
int c = 0;
while((c = r.read()) != -1){
    char ch = (char)c;
    w.write(ch);
}
r.close();
w.close();

四、缓冲流

传统方式一个字节一个字节读取或者写入数据,会频繁的发生系统内核调用(用户态→内核态切换)效率非常低。

我们可以使用字节缓冲流,缓冲区是一个内存区域的概念,类似于池子 以“快”的形似写入或者读取数据 减少系统调用频率。

构造函数传递字节流对象,不是文件路径,缓冲流提供了一个缓冲区 做了封装以块的形式读写数据,读写数据还是依赖于字节流对象。

注意:字节缓冲流的缓冲区大小默认是8K,即:8192字节

缓冲流主要是为了提高效率而存在的,减少物理读取次数,缓冲流主要有:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter,并且BufferedReader提供了实用方法readLine(),可以直接读取一行,BufferWriter提供了newLine()可以写换行符。

4.1  采用字节缓冲流改造文件复制代码

IO流 详细介绍,java

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:/SOFT/CentOS-7-x86_64-Minimal-2009.zip"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:/centos.zip"));

byte[] arr = new byte[1024];
int len = 0;
while ( (len = bis.read(arr)) != -1 ){
    bos.write(arr,0,len);//将 arr 数组中的内容从0的位置到len的位置 放到bos中
}

bis.close();
bos.close();

可以显示的调用flush,flush的含义是刷新缓冲区,也就是将缓存区中的数据写到磁盘上,不再放到内存里了,在执行os.close()时,其实默认执行了os.flush(),我们在这里可以不用显示的调用

4.2  采用字符缓冲流改造文件复制代码 

IO流 详细介绍,java文章来源地址https://www.toymoban.com/news/detail-656728.html

BufferedReader r = new BufferedReader(new FileReader("d:/abc/a.txt"));
BufferedWriter w = new BufferedWriter(new FileWriter("d:/abc/b.txt"));

String line = null;
while( (line = r.readLine()) != null ){
    w.write(line+"\n");
}
r.close();
w.close();
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Example {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
             BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {

            String line; // 用于存储读取的每一行内容的变量

            // 循环读取input.txt文件中的每一行内容,直到读取到文件末尾为止
            while ((line = reader.readLine()) != null) {
                writer.write(line); // 将读取到的内容写入output.txt文件
                writer.newLine(); // 写入换行符
            }
        } catch (IOException e) {
            e.printStackTrace(); // 异常处理,打印出错信息
        }
    }
}

到了这里,关于IO流 详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 头歌:Java高级特性 - IO流 (答案+详细注释)第1关:什么是IO流+第2关:字节流-输入输出+第3关:字符流 - 输入输出+第4关:复制文件

    目录 第1关:什么是IO流 第2关:字节流-输入输出 第3关:字符流 - 输入输出 第4关:复制文件

    2024年02月10日
    浏览(64)
  • Java流式编程详细介绍

    流是从支持数据处理操作的源生成的元素序列。 流的操作特点如下: 元素序列:就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值 源:流会使用一个提供数据的源,如集合、数组或输入/输出资源 数据处理操作:流的数据处理功能支持类似于数据库

    2024年02月10日
    浏览(41)
  • Java反射使用的详细介绍

    反射概述 : 反射认为类的每一个成份都是一个对象, 对于任何一个Class类,在\\\"运行的时候\\\"都可以直接得到这个类全部成分。 在运行时,可以直接得到这个类的构造器对象: Constructor 在运行时,可以直接得到这个类的成员变量对象: Field 在运行时,可以直接得到这个类的成员方法

    2024年02月05日
    浏览(36)
  • Java中泛型的详细介绍

    引言:         Java语言中的泛型是一种强大的特性,它允许我们在编写代码时指定类、接口和方法的参数类型。通过使用泛型,我们可以提高代码的重用性、可读性和安全性。在本博客中,我们将详细介绍Java中泛型的知识。         泛型是Java 5中引入的一个新特性。

    2024年01月18日
    浏览(35)
  • Java Http各个请求类型详细介绍

    在Spring Boot框架中,HTTP请求类型是构建Web应用程序的重要组成部分。常见的请求类型包括GET、POST、PUT和DELETE,每种类型都有其特定的用途和特点。本文将详细比较这四种请求类型,帮助您在开发过程中做出明智的选择。 GET请求是最常见的请求类型,主要用于从服务器检索数

    2024年02月02日
    浏览(31)
  • Java注解的介绍和使用详细讲解

    注解概述 : Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。 注解的作用 : 对Java中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定。 例如

    2024年01月19日
    浏览(33)
  • Java 中注解的详细介绍及使用

    Java 注解,也称为 Java Annotations,是一种元数据(Meta-data)标记语言,它在 Java 代码中添加了额外的信息和说明。注解可以用于类、方法、变量、参数、包等各种程序成分上,以达到不同的应用场景。 Java 注解是从 Java 5 开始引入的,在当时就被广泛认为是 Java 语言一个非常重

    2024年02月03日
    浏览(50)
  • Java 中的优先级队列详细介绍

    当应该根据优先级处理对象时,将使用 PriorityQueu 。 众所周知 Queue 是 遵循先进先出算法 的,但是有时候需要 按照优先级来处理队列中的元素 ,这时候 PriorityQueue 就派上用场了。 PriorityQueue 基于 优先级堆 。 优先级队列的元素 根据自然顺序排序 ,或者由 队列构造时提供的

    2024年02月14日
    浏览(45)
  • 【Java系列】SpringBoot 集成MongoDB 详细介绍

    目录 写在前面 一、步骤介绍 步骤 1: 添加 MongoDB 依赖 步骤 2: 配置 MongoDB 连接信息 步骤 3: 创建实体类 步骤 4: 创建 Repository 接口 步骤 5: 使用 Repository 进行操作 二、特殊处理 在Spring Boot中集成MongoDB的过程相对简单,以下是一个基本的步骤指南。确保项目已经使用了Spring Boo

    2024年02月04日
    浏览(41)
  • 【JAVA】#详细介绍!!! 文件操作之File对象(1)!

    本文内容不涉及文件内容操作,主要是对指定文件元信息的获取,以及通过java代码如何创建一个文件或者删除文件 目录 文件操作的File对象  File对象的基本操作方法 得到文件(夹)对象的信息元 1.getParent 2. getName 3.getPath  4. getAbsolutePath和getCanonicalPath 文件和目录的创建 文件

    2024年02月02日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包