文件I/O流

"我们将从文件输入/输出流开始。但是先讲重要的内容。"

有两个用于读写文件的类。FileInputStreamFileOutputStream 。你可能已经猜到了,FileInputStream 可以从文件顺序读取字节,而 FileOutputStream 可以将字节顺序写入文件。这些类包含以下方法:

方法 方法的用途
FileInputStream(String fileName); --- 此为构造方法。它允许你指定磁盘上文件的名称,所创建的对象将从该文件中读取数据。
int read(); --- 此方法从文件读取一个字节并返回该字节。返回值扩展为 int。
int available(); --- 此方法返回未读(可用)字节数。
void close(); --- 此方法"关闭"流。使用完流之后,可以调用此方法。 然后,对象执行关闭文件所需的整理操作,等等。 此时,你无法再从流中读取任何数据。

只是为了好玩,我们来计算一下文件中所有字节的总和。代码看起来如下所示:

汇总文件中的所有字节

复制代码
public static void main(String[] args) throws Exception
{
 //Create a FileInputStream object bound to <<c:/data.txt>>.
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 long sum = 0;

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); //Read the next byte
  sum +=  data; //Add it to the running total
 }
 inputStream.close(); // Close the stream

 System.out.println(sum); // Display the sum on the screen.
}

"我们已经深入了解过此类内容。FileOutputStream 是如何组织的?"

"好的。请看下面:"

方法 方法的用途
FileOutputStream (String fileName); "此为构造方法。它允许你指定磁盘上文件的名称,所创建的对象将向该文件写入数据。"
void write(int data); "此方法写入下一个字节,将数据截断为一个字节。"
void flush(); "要写入的数据通常首先被收集到内存中的大数据块,然后才写入磁盘。" flush 命令强制将所有未保存的信息写入磁盘。
void close(); "此方法'关闭'流。在使用完流之后,可以调用此方法。" 然后,对象执行关闭文件所需的整理操作,等等。

你无法再将数据写入流中,并自动调用 flush。

"完了?"

"是的,实际上只有一个用于写入的方法:write()。它一次只写入一个字节。但允许你根据需要向文件中写入任意多的信息。"

编程是将一个大而复杂的任务分解为许多小任务的过程。实质上,这里发生的过程是一样的:读取和写入大块数据被分解为读取和写入小块数据(一次一个字节)。

下面说明如何使用这些类复制磁盘上的文件:

复制磁盘上的文件

复制代码
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); // Read the next byte into the data variable
  outputStream.write(data); // and write it to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"谢谢你,里希。我终于明白了这段代码的实际工作原理。"

相关推荐
二哈赛车手3 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
吃好睡好便好4 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~4 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8294 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅4 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
未若君雅裁5 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记6 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI6 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
x_yeyue6 小时前
三角形数
笔记·算法·数论·组合数学