Java IO 流
Java IO流
流的概念
Java程序通过流来进行输入/输出。
流是生产或消费信息的抽象。
流通过Java的输入输出系统与物理设备链接。
尽管物理设备不尽相同,但是所有流的行为具有同样的方式。
这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着,一个输入流能够抽象多种类型的输入:从磁盘文件、从键盘或从网络套接字;同样,一个输出流可以输出到:控制台、磁盘文件或相连的网络。处理输入输出不需要代码理解键盘和网络的不同。
Java中流的实现是在java.io包定义的类层次结构内部的。
输入/输出流概念
输入/输出时,数据在通信通道中流动。
所谓“数据流stream”指的是所有数据通信通道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据是从一个地方流到另一个地方,这种数据流动的通道都可以称为数据流。
输入/输出是相对于程序来说的,程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。
若程序是数据流的源,即数据的提供者,这个数据流相对于程序来说就是一个“输出数据流”(数据从程序流出);若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)。
输入/输出类
在java.io包中提供了60多个类(流)。
从功能上分为两大类:输入流和输出流。
从流结构上可分为字节流(Byte Streams,以字节为处理单位或称面向字节)和字符流(Character Streams,以字符为处理单位或称面向字符)。
字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。
字符流是Java 1.1版后新增加的以字符为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer。
在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。
输入流和输出流的处理逻辑
读数据的逻辑为:
open a stream
while more information
read information
close the stream
写数据的逻辑为:
open a stream
while more information
write information
close the stream
另一种流的分类
节点流:从特定的地方读写的流类。例如,磁盘或一块内存区域。
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。
与目标相连的一定是节点流。
InputStream
三个基本的读方法:
abstract int read()
抽象方法,所以InputStream是一个抽象类。读取输入流的下一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。
int read(byte[] b)
从输入流读入一些字节数据,把它们放进一个数组b,返回实际读取的字节数,如果返回-1,表示读到了输入流的末尾。
int read(byte[] b, int off, int len)
将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
为什么只有第一个read方法是抽象的,而其余两个read方法都是具体的?
因为第二个read方法依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现。所以说只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现。
程序例子:

import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class InputStreamTest1 { public static void main(String[] args) throws IOException { InputStream is = new FileInputStream("d:/test.txt"); byte[] buffer = new byte[200]; int length = 0; while (-1 != (length = is.read(buffer, 0, 200))) { // 将字节数组转换成字符串 String str = new String(buffer, 0, length); System.out.println(str); } // 将流所关联到的资源关闭 is.close(); } }
参考资料
圣思园张龙老师Java SE系列视频教程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了