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

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. 总结

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

相关文章:

  • 提示工程 - 系统提示(System Prompts)
  • 健康生活:养生实用指南
  • AM32电调学习解读六:main.c文件的函数介绍
  • 在 Vue 中插入 B 站视频
  • 关于 Web 漏洞原理与利用:1. SQL 注入(SQLi)
  • 并发编程(4)
  • Python面试总结
  • STK手动建链+matlab联调
  • 【回眸】发财日记(二)
  • 中科院:LLM工具调用框架TUMS
  • C++笔记-红黑树
  • 【图书管理系统】用户注册系统实现详解
  • linux-----------------库制作与原理(下)
  • 《虚拟即真实:数字人驱动技术在React Native社交中的涅槃》
  • Flask快速入门和问答项目源码
  • 计算机单个进程内存布局的基本结构
  • BERT 核心技术全解析:Transformer 双向编码与掩码语言建模的底层逻辑
  • 基于STM32的多传感器融合的设施农业小型搬运机器人避障控制系统设计
  • go语法大赏
  • python创建flask项目
  • 证监会副主席李明:近期将出台深化科创板、创业板改革政策措施
  • 央媒聚焦文明交流互鉴中的“上博现象” :跨越山海,抒写自信
  • 推开“房间”的门:一部“生命存在的舞台” 史
  • 香港特区政府强烈谴责美参议员恐吓国安人员
  • 全国游泳冠军赛:孙杨、潘展乐同进400自决赛,今晚将正面对决
  • 国家统计局:2024年城镇单位就业人员工资平稳增长