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

    文章

    448

    浏览量

    39152
  • 数据
    +关注

    关注

    8

    文章

    7026

    浏览量

    89034
  • 内存
    +关注

    关注

    8

    文章

    3025

    浏览量

    74046
  • JAVA
    +关注

    关注

    19

    文章

    2967

    浏览量

    104750
  • 磁盘
    +关注

    关注

    1

    文章

    379

    浏览量

    25209
收藏 人收藏

    评论

    相关推荐

    IO与NIO有何区别

    NIO 提到IO,这是Java提供的一套类库,用于支持应用程序与内存、文件、网络间进行数据交互,实现数据写入与输出。JDK自从1.4版本后,提供了另一套类库NIO,我们平时习惯称呼为NEW IO
    的头像 发表于 09-25 11:00 879次阅读
    <b class='flag-5'>IO</b>与NIO有何区别

    javaIO与Guava工具

    Guava IO 日常系统交互,文件的上传下载都是常见的,一般我们会通过jdk提供的IO操作库帮助我们实现。IO指的是数据相对当前操作程序的入与出,将数据通过 输出
    的头像 发表于 09-25 16:24 731次阅读

    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字节码分析

    本文基于数据框架理论,提出了如何将数据分析方法应用于JAVA 字节码,通过建立数据与半格、数据
    发表于 12-25 13:22 9次下载

    java与文件实验

    实验10 与文件一、实验目的 1. 理解数据的概念2. 理解Java的层次结构3. 理解文件的概念二、实验要求 1. 掌握字节流
    发表于 09-23 19:04 1919次阅读

    javaio分析

    一、的概念 (stream)的概念源于UNIX管道(pipe)的概念。在UNIX,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 一个
    发表于 09-27 14:51 0次下载
    <b class='flag-5'>java</b><b class='flag-5'>中</b>的<b class='flag-5'>io</b><b class='flag-5'>流</b>分析

    关于javaio知识总结详解

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

    基础:Java IO学习总结

    IO的分类 根据处理数据类型的不同分为:字符和字节流 根据数据流向不同分为:输入流和输出
    发表于 03-08 14:38 2074次阅读

    Java并行存在的问题及解决办法详解

    对于从事Java开发的童鞋来说,相信对于Java8的并行并不陌生,没错,我们常常用它来执行并行任务,但是由于并行(parallel stream)采用的是享线程池,可能会对我们的性
    发表于 04-03 15:55 12次下载

    JAVANIO通过MappedByteBuffer操作大文件

    java io操作通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java n
    的头像 发表于 05-05 23:42 3500次阅读

    java的字符分析

    上次聊到了 java 的 字符 Reader ,今天来看看它的好朋友 Writer 字符。 Writer java
    的头像 发表于 10-10 15:38 561次阅读