news 2026/4/23 18:26:40

Java 流(Stream)、文件(File)和IO(输入输出)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 流(Stream)、文件(File)和IO(输入输出)
  • 流(Stream)、文件(File)和 IO(输入输出)是处理数据读取写入的基础设施,它们允许程序与外部数据(如文件、网络、系统输入等)进行交互
  • java.io 包:
    • Java 标准库中的一个核心包,提供了用于系统输入和输出的类,它包含了处理数据流(字节流和字符流)、文件读写、序列化以及数据格式化的工具
    • 处理文件操作、流操作以及低级别 IO 操作的基础包
    • 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
  • 一个流可以理解为一个数据的序列输入流表示从一个源读取数据输出流表示向一个目标写数据

控制台输入&&输出

读取控制台输入

  • Java 的控制台输入由System.in完成。
  • 获取控制台的字符流:
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));

从控制台读取多字符输入

  • 从 BufferedReader 对象读取一个字符要使用read()方法,它的语法如下:
intread()throwsIOException
  • 每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回-1。该方法抛出IOException

从控制台读取字符串

  • 从标准输入读取一个字符串需要使用 BufferedReader 的readLine()方法。它的一般格式是:
StringreadLine()throwsIOException

JDK 5 后的版本我们也可以使用 JavaScanner类来获取控制台的输入
Scanner s = new Scanner(System.in);

控制台输出

  • 控制台的输出由print()println()完成。这些方法都由类 PrintStream 定义System.out 是该类对象的一个引用
  • PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。
  • PrintStream 定义 write() 的最简单格式如下所示:
voidwrite(intbyteval)// 该方法将 byteval 的低八位字节写到流中。intb;b='A';System.out.write(b);// ASystem.out.write('\n');
  • 注意:write() 方法不经常使用,因为print()println()方法用起来更为方便

读写文件

  • 下图是一个描述输入流和输出流的类层次图。

字节流(处理二进制数据)操作文件、图像、视频等。

  • InputStream:抽象类 (输入流);所有字节输入流超类,处理字节的输入操作。
  • OutputStream:抽象类 (输出流);所有字节输出流超类,处理字节的输出操作。
  • 文件:
    • FileInputStream:从文件读取字节数据。
    • FileOutputStream:将字节数据写入文件
  • 缓冲:
    • BufferedInputStream:为字节输入流提供缓冲功能,提高读取效率
    • BufferedOutputStream:为字节输出流提供缓冲功能,提高写入效率
  • 内存:
    • ByteArrayInputStream:将内存中的字节数组作为输入源。
    • ByteArrayOutputStream:将数据写入到内存中的字节数组。
  • 原生数据(Data数据流):
    • DataInputStream:允许从输入流读取 Java 原生数据类型(如 int、float、boolean)。
    • DataOutputStream:允许向输出流写入 Java 原生数据类型
  • 序列化:
    • ObjectInputStream:从输入流读取序列化对象
    • ObjectOutputStream:将对象序列化写入输出流中。
  • 管道:
    • PipedInputStream:用于在管道中读取字节数据,通常与 PipedOutputStream 配合使用
    • PipedOutputStream:用于在管道中写入字节数据,通常与 PipedInputStream 配合使用
  • 过滤:
    • FilterInputStream:字节输入流的包装类,用于对其他输入流进行过滤处理。
    • FilterOutputStream:字节输出流的包装类,用于对其他输出流进行过滤处理。
  • 合并:
    • SequenceInputStream:将多个输入流串联一个输入流进行处理。

字符流(处理文本数据)读取和写入字符串或文件。

  • Reader:抽象类 (输入流);所有字符输入流的超类,处理字符的输入操作。
  • Writer:抽象类 (输出流);所有字符输出流的超类,处理字符的输出操作。
  • 文件:
    • FileReader:从文件读取字符数据。
    • FileWriter:将字符数据写入文件
  • 缓冲:
    • BufferedReader:为字符输入流提供缓冲功能,支持按行读取提高读取效率
    • BufferedWriter:为字符输出流提供缓冲功能,支持按行写入提高写入效率
  • 转换流:
    • InputStreamReader:字节流→字符流
    • OutputStreamWriter:字符流→字节流
  • 字符数组:
    • CharArrayReader:将字符数组作为输入源
    • CharArrayWriter:将数据写入字符数组
  • 字符串:
    • StringReader:将字符串作为输入源
    • StringWriter:将数据写入字符串缓冲区
  • 字符输出流:
    • PrintWriter:便捷的字符输出流,支持自动刷新格式化输出
  • 管道:
    • PipedReader:用于在管道中读取字符数据,通常与 PipedWriter 配合使用
    • PipedWriter:用于在管道中写入字符数据,通常与 PipedReader 配合使用
  • 带行号的缓冲:
    • LineNumberReader:带行号的缓冲字符输入流,允许跟踪读取的行号
  • 重复读取:
    • PushbackReader:允许在读取字符将字符推回流中,以便再次读取

辅助类(其他重要类)

  • 提供对文件、目录以及随机文件访问的支持。
  • File(文件和目录操作):用于表示文件或目录,并提供文件操作,如创建、删除、重命名等
  • RandomAccessFile(随机访问文件):支持文件的随机访问,可以从文件的任意位置读写数据
  • Console(控制台输入输出):提供对系统控制台的输入和输出支持。

FileInputStream

  • 用于从文件读取数据
  • 创建一个输入流对象读取文件
// 使用字符串类型的文件名创建InputStreamf=newFileInputStream("C:/java/hello");// 使用一个文件对象创建Filef=newFile("C:/java/hello");InputStreamin=newFileInputStream(f);
  • 创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作
  • int read():读取一个字节的数据,返回值为0 到 255 之间的整数。如果到达流的末尾,返回-1
  • int read(byte[] b):从输入流读取字节,并将其存储字节数组 b中,返回实际读取的字节数。如果到达流的末尾,返回-1
  • int read(byte[] b, int off, int len):从输入流读取最多 len 个字节,并将它们存储字节数组 b 的 off 偏移位置,返回实际读取的字节数。如果到达流的末尾,返回-1
  • long skip(long n):跳过丢弃输入流中的n 个字节,返回实际跳过的字节数
  • int available():返回可以读取的字节数(不阻塞)
  • void close():关闭输入流释放与该流相关的所有资源
  • void mark(int readlimit):在流中的当前位置设置标记readlimit是可以读取的字节数上限
  • void reset():将流重新定位到上次标记的位置,如果没有标记标记失效,抛出IOException
  • boolean markSupported():检查当前输入流是否支持 mark() 和 reset() 操作

FileOutputStream

  • 用来创建一个文件并向文件中写数据。
  • 如果该流在打开文件进行输出前目标文件不存在,那么该流会创建该文件
  • 创建一个输出流对象
// 使用字符串类型的文件名OutputStreamf=newFileOutputStream("C:/java/hello")// 使用一个文件对象Filef=newFile("C:/java/hello");OutputStreamfOut=newFileOutputStream(f);
  • 创建OutputStream对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作
  • void write(int b):将指定的字节写入输出流,b 的低 8 位将被写入流中。
  • void write(byte[] b):将字节数组 b中的所有字节写入输出流
  • void write(byte[] b, int off, int len):将字节数组 b中从偏移量 off 开始的 len 个字节写入输出流
  • void flush():刷新输出流并强制写出所有缓冲的数据,确保数据被立即写入目标输出
  • void close():关闭输出流并释放与该流相关的所有资源关闭后不能再写入
// 构建FileOutputStream对象,文件不存在会自动新建Filef=newFile("a.txt");FileOutputStreamfop=newFileOutputStream(f);// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbkOutputStreamWriterwriter=newOutputStreamWriter(fop,"UTF-8");// 写入到缓冲区writer.append("中文输入");// 换行writer.append("\r\n");// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入writer.append("English");// 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉writer.close();// 关闭输出流,释放系统资源fop.close();// 构建FileInputStream对象FileInputStreamfip=newFileInputStream(f);// 构建InputStreamReader对象,编码与写入相同InputStreamReaderreader=newInputStreamReader(fip,"UTF-8");StringBuffersb=newStringBuffer();while(reader.ready()){// 转成char加到StringBuffer对象中sb.append((char)reader.read());}System.out.println(sb.toString());// 关闭读取流reader.close();// 关闭输入流,释放系统资源fip.close();

文件和I/O

  • File Class(类)
  • FileReader Class(类)
  • FileWriter Class(类)

Java中的目录

创建目录

  • File类中有两个方法可以用来创建文件夹:
    • mkdir():创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径不存在,该文件夹不能被创建。
    • mkdirs():创建一个文件夹它的所有父文件夹
Stringdirname="/tmp/user/java/bin";Filed=newFile(dirname);// 现在创建目录d.mkdirs();
  • 注意:Java 在 UNIX 和 Windows 自动按约定分辨文件路径分隔符。如果你在 Windows 版本的 Java 中使用分隔符 (/),路径依然能够被正确解析

读取目录

  • 一个目录其实就是一个 File 对象,它包含其他文件和文件夹
  • 如果创建一个 File 对象并且它是一个目录,那么调用isDirectory()方法会返回true
  • 可以通过调用该对象上的list()方法,来提取它包含的文件和文件夹的列表
Stringdirname="/tmp";Filef1=newFile(dirname);if(f1.isDirectory()){System.out.println("目录 "+dirname);Strings[]=f1.list();for(inti=0;i<s.length;i++){Filef=newFile(dirname+"/"+s[i]);if(f.isDirectory()){System.out.println(s[i]+" 是一个目录");}else{System.out.println(s[i]+" 是一个文件");}}}else{System.out.println(dirname+" 不是一个目录");}=======================================================目录/tmp bin 是一个目录 lib 是一个目录 demo 是一个目录 test.txt 是一个文件README是一个文件 index.html 是一个文件 include 是一个目录

删除目录或文件

  • 删除文件可以使用 java.io.File.delete()方法。
  • 注意:当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
// 删除文件及目录publicstaticvoiddeleteFolder(Filefolder){File[]files=folder.listFiles();if(files!=null){for(Filef:files){if(f.isDirectory()){deleteFolder(f);}else{f.delete();}}}folder.delete();}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 9:57:42

FieldTrip脑电分析工具箱:为什么它成为神经科学研究者的首选?

FieldTrip脑电分析工具箱&#xff1a;为什么它成为神经科学研究者的首选&#xff1f; 【免费下载链接】fieldtrip The MATLAB toolbox for MEG, EEG and iEEG analysis 项目地址: https://gitcode.com/gh_mirrors/fi/fieldtrip 您是否正在寻找一个功能强大、开源免费的脑…

作者头像 李华
网站建设 2026/4/19 17:56:17

org.openpnp.vision.pipeline.stages.MaskCircle

文章目录org.openpnp.vision.pipeline.stages.MaskCircle功能参数生成测试图片例子 - 对圆形外部做掩码效果例子 - 对圆形内部做掩码ENDorg.openpnp.vision.pipeline.stages.MaskCircle 功能 用于对当前工作图像应用圆形掩码。该阶段会创建一个以图像中心为圆心、指定直径的圆…

作者头像 李华
网站建设 2026/4/19 17:58:11

PCB布局之电源完整性设计:低阻抗路径与去耦策略

调试电路时常见电源噪声超标、纹波过大、芯片工作不稳定等问题&#xff0c;根源多为电源布局不合理 —— 电源路径过长、去耦电容缺失或摆放偏远、电源 / 地平面不完整&#xff0c;导致电源阻抗过高、噪声无法滤除。电源完整性&#xff08;PI&#xff09;布局的核心&#xff0c…

作者头像 李华
网站建设 2026/4/20 13:14:40

PCB布局散热与可制造性

作为硬件工程师&#xff0c;布局时往往侧重电气性能&#xff0c;忽视散热与可制造性&#xff08;DFM&#xff09;&#xff0c;导致产品批量生产时良率低、焊接不良、器件过热老化等问题。散热布局核心是热均衡、防热耦合、留散热通道&#xff1b;DFM 布局核心是适配工艺、简化装…

作者头像 李华
网站建设 2026/4/20 6:50:48

学生管理系统(单链表练习)

功能&#xff1a; 录入学生信息打印学生信息统计学生人数查找学生信息修改学生信息删除学生信息按成绩排序退出系统#include <stdio.h> #include <stdlib.h> #include <conio.h>//学生信息 typedef struct _Student {int stuNum;char name[20];int score; }S…

作者头像 李华
网站建设 2026/4/20 1:21:36

头歌实训-图论实战:从概念到最短路径的Python实现

1. 图论基础&#xff1a;从零理解数据结构 第一次接触图论时&#xff0c;我完全被各种术语搞晕了。直到在头歌实训平台反复练习后&#xff0c;才发现图论其实就像我们日常生活中的社交网络。想象一下微信好友关系&#xff1a;每个人是一个顶点&#xff0c;好友关系就是边&#…

作者头像 李华