0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java中基础的 IO 流

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-10 16:16 次阅读

java 中,程序通常会和其他外部设备进行数据交互,比如写入磁盘,网络发送数据等等,今天我们来学学 java 中 基础的 IO 流。

IO 流

与其他外部设备进行数据交互,比如将数据从内存中保存到磁盘文件中或者从网络上下载数据并加载到内存中,这个过程都是一种单向且有顺序的数据传输,被称之为流。

IO 就是 Input 输入和 Output 输出。输入输出以内存为中心的流向划分的。传输数据到内存就是输入流,从内存中输出数据就是输出流。

InputStream

InputStream 是所有输入流的父类,是一个抽象类,读取的数据单位是字节(byte)。

图片

主要的抽象方法是 read(),这个方法就是读取数据内容并返回 -1~255 的 int 值。read() 方法是一个阻塞的方法,只有将内容全部读取完成之后才能运行下一行代码。

public abstract int read() throws IOException;

以 FileInputStream 实现类作为示例:

public static void main(String[] args) throws Exception {
    // input.txt 内容为 hello, inputStream
    InputStream input = new FileInputStream("input.txt");
    int n = 0;
    while((n = input.read()) != -1){
        System.out.print((char) n);
    }
    input.close();
}

示例中的 read() 方法只能一个字节的一个字节读取数据,效率不高,当文件中存在多个字节为一个汉字的中文时,上面的示例将打印出乱码。

InputStream 支持将一次性读取多个字节到缓冲区,利用缓冲区提高效率。返回值的数据不再是读取的数据字节,而是读取的字节数。并且可以正常的打印出中文字符。

// 将读取的内容填充到 byte 数组
public int read(byte b[]) throws IOException
// 将读取的内容填充 byte 数组中 off 开始,len 长度的区域
public int read(byte b[], int off, int len)  throws IOException

将缓冲区大小设置为 1024 个字节示例:

public static void main(String[] args) throws Exception {
    //input.txt 文件内容为 你好, inputStream
    InputStream input = new FileInputStream("input.txt");

    byte[] result = new byte[1024];

    while(input.read(result) != -1){
        System.out.print(new String(result, "utf-8"));
    }
    input.close();
}

OutputStream

OutputStream 是所有输出流的父类。和 InputStream 一样是一个抽象类。

图片

主要的抽象方法是 write(),也是一个阻塞的方法,只有将内容全部写完成之后才能运行下一行代码。write() 方法和 read() 方法一样都是一个字节一个字节的操作的。

public abstract void write(int b) throws IOException;

以 FileInputStream 实现类作为示例:

public static void main(String[] args) throws Exception {
    OutputStream out = new FileOutputStream("out.txt");
    try {
        out.write("h".getBytes());
        out.write("e".getBytes());
        out.write("l".getBytes());
        out.write("l".getBytes());
        out.write("0".getBytes());
    } finally {
        if(out != null) {
            out.close();
        }
    }
}

write() 按单个字节写入磁盘的效率比较低下,OutputStream 提供了 write(byte[]) 一次性大批量的将字节输出到磁盘。对于 IO 设备来说,一次性写入 1 个字节和写入 1000 个字节的时间都是差不多的。

public static void main(String[] args) throws Exception {
    OutputStream out = new FileOutputStream("out.txt");
    try {
        out.write("哈喽,outputStream".getBytes());
    } finally {
        if(out != null) {
            out.close();
        }
    }
}

关闭资源

不管是 InputStream 还是 OutputStream 在使用资源之后都需要调用 close()方法。在示例中如果在 close() 方法调用之前抛出异常则不会自动关闭资源。以下两种方式都可以关闭资源:

  1. try..finally 方式
public static void main(String[] args) throws Exception {
    InputStream input = new FileInputStream("input.txt");
    try {
        byte[] result = new byte[1024];

        while(input.read(result) != -1){
            System.out.print(new String(result, "utf-8"));
        }
    } finally {
        if(input != null) {
            input.close();
        }
    }

}
  1. try(resource)

实现了 Closeable 接口的 InputStream 和 OutputStream 使用 try(resource) 时,编译器会自动增加 finally。

public static void main(String[] args) throws Exception {
    try (OutputStream out = new FileOutputStream("out.txt")){
        out.write("编译器会添加 finally".getBytes());
    }

}

总结

今天就是简单地给大家介绍 Java 的 IO 流,为接下来学其他 IO 类打个基础。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IO
    IO
    +关注

    关注

    0

    文章

    397

    浏览量

    38513
  • 数据
    +关注

    关注

    8

    文章

    6512

    浏览量

    87601
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72767
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 磁盘
    +关注

    关注

    1

    文章

    338

    浏览量

    24883
收藏 人收藏

    评论

    相关推荐

    java中的IO流与Guava工具

    流将数据(从文件、网络、数据等)写入到程序,这里的IO指的是基于流作为载体进行数据传输。如果把数据比作合理的水,河就是IO流,也是数据的载体。 Java为我们提供了非常多的操作IO的接
    的头像 发表于 09-25 16:24 488次阅读

    Java基础-IO-01-IO的概述

    JAVA
    电子学习
    发布于 :2022年12月30日 14:15:14

    Java基础-IO-16-Java编码和解码的代码实现

    JAVA
    电子学习
    发布于 :2022年12月30日 14:19:59

    Java基础-IO-02-IO的体系和字节输出基本用法

    JAVA
    电子学习
    发布于 :2022年12月30日 14:31:34

    2009年最新java中级课堂实录学习视

    eclipse的使用、集合、AWT、Swing、IO、多线程、网络、反射、注解等知识!包括一些知识结合程序,对于学习完JAVA基础的同学很有帮助!希望能带给学JAVA的同学一定的帮助
    发表于 04-05 05:00

    Java的输入输出盘点

    Java分为两种,一种是字节流,另一种是字符,分别由四个抽象类来表示(每种包括输入和输出两种所以一共四个):InputStream
    发表于 07-11 07:56

    Java NIO编程理论基础之Java IO及linux网络IO模型发展

    Java NIO编程理论基础篇——Java IO的发展以及linux网络IO模型
    发表于 07-18 12:40

    javaIO演进之路概述

    第一章 javaIO演进之路
    发表于 07-24 16:53

    浅析javaIO模型

    java IO初识与Linux网络IO模型简介
    发表于 08-05 06:28

    javaIO和单片机的IO口整体对比

    作为从本科学单片机出身笔者,对IO口独有情钟,这里对javaIO和单片机的IO口整体对比一
    发表于 01-18 08:28

    指纹识别JAVA源代码

    import java.applet.*;import java.awt.*;import java.awt.image.*;import java.net.*;import
    发表于 10-09 13:49 288次下载

    java中的io流分析

    一、流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。 实际
    发表于 09-27 14:51 0次下载
    <b class='flag-5'>java</b>中的<b class='flag-5'>io</b>流分析

    关于java中的io流知识总结详解

    一、Java io的开始:文件 1. 我们主要讲的是流,流的本质也是对文件的处理,我们循序渐进一步一步从文件将到流去。 2. java 处理文件的类 File,java提供了十分详细的
    发表于 09-28 13:20 0次下载

    java的字符流分析

    上次聊到了 java 的 字符流 Reader ,今天来看看它的好朋友 Writer 字符流。 Writer java 中的 IO 输出流不是只有 OutputStream 还有按字符输出
    的头像 发表于 10-10 15:38 350次阅读

    几种常用Reader输入流的使用方式

    上次聊到了 java 的字节流 InputStream,今天来看看它的好朋友 Reader 字符流。 Reader java 中的 IO 输入流不是只有 InputStream 还有按字符输入
    的头像 发表于 10-10 15:46 287次阅读