当前位置: 首页 > article >正文

Java文件读写程序

1.引言

在日常的软件开发中,文件操作是常见的功能之一。不仅要了解如何读写文件,更要知道如何安全地操作文件以避免程序崩溃或数据丢失。这篇文章将深入分析一个简单的 Java 文件读写程序 Top.java,包括其基本实现、潜在问题以及改进建议,帮助读者学习和理解文件操作的基本原理。

2. Top.java代码解析

2.1 主方法

public static void main(String[] args) {String path = "D:\\Pro25\\src\\fileO\\top.txt";File file = new File(path);Top.writeFile(file);Top.readFile(file);
}
2.1.1 文件路径

代码中定义了一个文件路径 D:\\Pro25\\src\\fileO\\top.txt,这是程序要操作的目标文件。在实际项目中,文件路径应该根据运行环境动态配置或通过配置文件管理,以增强代码的可移植性。

2.1.2 创建文件对象

File file = new File(path); 这行代码创建了一个文件对象,用于后续的文件操作。它不会立即创建物理文件,仅表示一个文件的抽象路径。

2.2 写入文件方法

public static void writeFile(File file){try {//创建文件输出流FileOutputStream fos = new FileOutputStream(file);String name  = "Player1";int score = 200;byte[] b = name.getBytes(StandardCharsets.UTF_8);//写入数据fos.write(b.length);fos.write(b);fos.write(score);fos.flush();//刷新,强制写入System.out.println("写入完成");} catch (Exception e) {throw new RuntimeException(e);}
}
2.2.1 输出流创建

FileOutputStream fos = new FileOutputStream(file); 这行代码创建了文件输出流对象,用于向文件写入数据。若指定的文件不存在,Java 会自动创建该文件。

2.2.2 写入数据细节
  • String nameint score 定义了游戏中的玩家名称和分数。
  • name.getBytes(StandardCharsets.UTF_8) 将字符串编码为 UTF-8 格式的字节数组。
  • 先写入 name 的长度(b.length),接着写入字节数组 b,最后写入分数 score。这种顺序很关键,因为读取时要按照同样的顺序。
  • fos.flush() 强制将缓冲区中的数据写入文件,确保数据不丢失。

2.3 读取文件方法

public static void readFile(File file){try {//创建文件输入流FileInputStream fis = new FileInputStream(file);//缓冲区int len = fis.read();byte[] buf = new byte[len];fis.read(buf);//读取数据int score = fis.read();String name = new String(buf,StandardCharsets.UTF_8);System.out.println(name+score);} catch (Exception e) {throw new RuntimeException(e);}
}
2.3.1 输入流创建

FileInputStream fis = new FileInputStream(file); 这行代码创建了文件输入流对象,用于从文件读取数据。若文件不存在,会抛出异常。

2.3.2 读取数据细节
  • fis.read() 读取文件中的第一个字节,即之前写入的name长度。
  • 根据读取的长度创建字节数组 buf,用于存储玩家名称的字节。
  • 第二次调用 fis.read(buf) 读取玩家名称的字节数据。
  • 第三次调用 fis.read() 读取分数 score
  • 将字节数组解码回字符串 String name = new String(buf,StandardCharsets.UTF_8);,然后输出玩家名称和分数。

3. 代码优点

  • 简单直观:代码结构清晰,易于理解,适合初学者学习文件读写操作。
  • 基本功能完整:涵盖了文件写入和读取的基本流程。

4. 代码缺点及改进建议

4.1 缺少异常处理

代码中仅简单地将异常包装为 RuntimeException 抛出,但实际项目中应进行更细致的异常处理,如记录日志或给用户友好的提示信息。

4.2 读写顺序问题

写入文件时,先写入了 name 的长度,然后是 name 的字节数据,最后是 score。但读取时,我们直接读取了一个字节作为 score,这实际上存在逻辑错误。因为 score 是一个整数(4 个字节),但在代码中仅读取了一个字节。正确的做法是读取 4 个字节来还原 int 类型的分数。

修改后的读取代码:

// 读取 score(4 个字节)
byte[] scoreBytes = new byte[4];
fis.read(scoreBytes);
int score = ByteBuffer.wrap(scoreBytes).getInt();

同时,在写入时也应该写入完整的 4 个字节:

fos.write(score); // 这里实际上只写入了一个字节,正确的写法应该确保写入4个字节
// 正确写法示例(使用ByteArrayOutputStream或其他方式):
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(score);
fos.write(baos.toByteArray());

4.3 缺少资源关闭

在 Java 7 及更高版本中,应使用 try-with-resources 语句自动关闭资源,避免资源泄漏。例如:

try (FileOutputStream fos = new FileOutputStream(file)) {// 写入操作
}

4.4 文件存在性检查

在写入文件前,应检查文件是否存在。如果文件已存在,可能会覆盖原有内容。可以根据需要决定是覆盖还是追加写入。

5. 总结

文件操作是软件开发中的基础技能,掌握这些知识点对于构建健壮的应用至关重要。希望读者能够从本文中学习到文件操作的核心概念,并在实际项目中正确地应用它们。

http://www.lryc.cn/news/2379029.html

相关文章:

  • 深入解析Java事件监听机制与应用
  • MetaMask安装及使用-使用水龙头获取测试币的坑?
  • AI:OpenAI论坛分享—《AI重塑未来:技术、经济与战略》
  • Linux配置vimplus
  • 服务端HttpServletRequest、HttpServletResponse、HttpSession
  • 实验九视图索引
  • git 本地提交后修改注释
  • 面向具身智能的视觉-语言-动作模型(VLA)综述
  • Thrust库中的Gather和Scatter操作
  • 计算机发展的历程
  • 深度学习驱动下的目标检测技术:原理、算法与应用创新(三)
  • Python爬虫实战:研究 RPC 远程调用机制,实现逆向解密
  • [学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c
  • jenkins流水线常规配置教程!
  • Java中序列化和反序列化的理解
  • 基于OpenCV的SIFT特征和FLANN匹配器的指纹认证
  • 零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)
  • Milvus 视角看主流嵌入式模型(Embeddings)
  • leetcode:58. 最后一个单词的长度(python3解法)
  • 虹科应用 | 探索PCAN卡与医疗机器人的革命性结合
  • entity线段材质设置
  • [STM32] 5-1 时钟树(上)
  • 【Linux网络与网络编程】12.NAT技术内网穿透代理服务
  • 【​​HTTPS基础概念与原理​】TLS握手过程详解​​
  • 从辅助到协作:GitHub Copilot的进化之路
  • Linux运行时的参数、命令、网络、磁盘参数和日志监控
  • 鸿蒙页面布局入门
  • VTK|类似CloudCompare的比例尺实现2-vtk实现
  • 阿里巴巴开源移动端多模态LLM工具——MNN
  • 【漫话机器学习系列】256.用 k-NN 填补缺失值