当前位置: 首页 > 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. 总结

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

相关文章:

Java文件读写程序

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

深入解析Java事件监听机制与应用

Java事件监听机制详解 一、事件监听模型组成 事件源(Event Source) 产生事件的对象(如按钮、文本框等组件) 事件对象(Event Object) 封装事件信息的对象(如ActionEvent包含事件源信息&#xf…...

MetaMask安装及使用-使用水龙头获取测试币的坑?

常见的异常有: 1.unable to request drip, please try again later. 2.You must hold at least 1 LINK on Ethereum Mainnet to request native tokens. 3.The address provided does not have sufficient historical activity or balance on the Ethereum Mainne…...

AI:OpenAI论坛分享—《AI重塑未来:技术、经济与战略》

AI:OpenAI论坛分享—《AI重塑未来:技术、经济与战略》 导读:2025年4月24日,OpenAI论坛全面探讨了 AI 的发展趋势、技术范式、地缘政治影响以及对经济和社会的广泛影响。强调了 AI 的通用性、可扩展性和高级推理能力,以…...

Linux配置vimplus

配置vimplus CentOS的配置方案很简单,但是Ubuntu的解决方案网上也很多但是有效的很少,尤其是22和24的解决方案,在此我整理了一下我遇到的问题解决方法 CentOS7 一键配置VimForCPP 基本上不会有什么特别难解决的报错 sudo yum install vims…...

服务端HttpServletRequest、HttpServletResponse、HttpSession

一、概述 在JavaWeb 开发中,获取客户端传递的参数至关重要。http请求是客户端向服务端发起数据传输协议,主要包含包含请求行、请求头、空行和请求体四个部分,在这四部分中分别携带客户端传递到服务端的数据。常见的http请求方式有get、post、…...

实验九视图索引

设计性实验 1. 创建视图V_A包括学号,姓名,性别,课程号,课程名、成绩; 一个语句把学号103 课程号3-105 的姓名改为陆君茹1,性别为女 ,然后查看学生表的信息变化,再把上述数据改为原…...

git 本地提交后修改注释

dos命令行进入目录,idea可以点击Terminal 进入命令行 git commit --amend -m "修改内容"...

面向具身智能的视觉-语言-动作模型(VLA)综述

具身智能被广泛认为是通用人工智能(AGI)的关键要素,因为它涉及控制具身智能体在物理世界中执行任务。在大语言模型和视觉语言模型成功的基础上,一种新的多模态模型——视觉语言动作模型(VLA)已经出现&#…...

Thrust库中的Gather和Scatter操作

Thrust库中的Gather和Scatter操作 Thrust是CUDA提供的一个类似于C STL的并行算法库,其中包含两个重要的数据操作:gather(聚集)和scatter(散开)。 Gather操作 Gather操作从一个源数组中按照指定的索引收集元素到目标数组中。 函数原型: t…...

计算机发展的历程

计算机系统的概述 一, 计算机系统的定义 计算机系统的概念 计算机系统 硬件 软件 硬件的概念 计算机的实体, 如主机, 外设等 计算机系统的物理基础 决定了计算机系统的天花板瓶颈 软件的概念 由具有各类特殊功能的程序组成 决定了把硬件的性能发挥到什么程度 软件的分类…...

深度学习驱动下的目标检测技术:原理、算法与应用创新(三)

五、基于深度学习的目标检测代码实现 5.1 开发环境搭建 开发基于深度学习的目标检测项目,首先需要搭建合适的开发环境,确保所需的工具和库能够正常运行。以下将详细介绍 Python、PyTorch 等关键开发工具和库的安装与配置过程。 Python 是一种广泛应用于…...

Python爬虫实战:研究 RPC 远程调用机制,实现逆向解密

1. 引言 在网络爬虫技术的实际应用中,目标网站通常采用各种加密手段保护其数据传输和业务逻辑。这些加密机制给爬虫开发带来了巨大挑战,传统的爬虫技术往往难以应对复杂的加密算法。逆向解密作为一种应对策略,旨在通过分析和破解目标网站的加密机制,获取原始数据。 然而,…...

[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c

RTKLib详解:qzslex.c、rcvraw.c与solution.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解…...

jenkins流水线常规配置教程!

Jenkins流水线是在工作中实现CI/CD常用的工具。以下是一些我在工作和学习中总结出来常用的一些流水线配置:变量需要加双引号括起来 "${main}" 一 引用无账号的凭据 使用变量方式引用,这种方式只适合只由密码,没有用户名的凭证。例…...

Java中序列化和反序列化的理解

基本概念 序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程,而反序列化(Deserialization)则是将这种形式重新转换为对象的过程。 核心作用 持久化存储:将对象状态保存到文件或数据库中 网络传输:在网络间传递对象…...

基于OpenCV的SIFT特征和FLANN匹配器的指纹认证

文章目录 引言一、概述二、代码解析1. 图像显示函数2. 核心认证函数2.1 创建SIFT特征提取器2.2 检测关键点和计算描述符(源图像)2.3 检测关键点和计算描述符(模板图像)2.4 创建FLANN匹配器2.5 使用K近邻匹配 3. 匹配点筛选4. 认证…...

零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)

第十一章:实战项目 - 桌面应用开发(JavaFX入门) 欢迎来到我们实战项目的桌面应用开发部分!在前面的章节中,我们可能已经接触了Swing。现在,我们将目光投向JavaFX,一个更现代、功能更丰富的用于…...

Milvus 视角看主流嵌入式模型(Embeddings)

嵌入是一种机器学习概念,用于将数据映射到高维空间,其中语义相似的数据被紧密排列在一起。嵌入模型通常是 BERT 或其他 Transformer 系列的深度神经网络,它能够有效地用一系列数字(称为向量)来表示文本、图像和其他数据…...

leetcode:58. 最后一个单词的长度(python3解法)

难度:简单 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s "Hello World"…...

虹科应用 | 探索PCAN卡与医疗机器人的革命性结合

随着医疗技术的不断进步,医疗机器人在提高手术精度、减少感染风险以及提升患者护理质量方面发挥着越来越重要的作用。医疗机器人的精确操作依赖于稳定且高效的数据通信系统,虹科提供的PCAN四通道mini PCIe转CAN FD卡,正是为了满足这一需求而设…...

entity线段材质设置

在cesium中,我们可以改变其entity线段材质,这里以直线为例. 首先我们先创建一条直线 const redLine viewer.entities.add({polyline: {positions: Cesium.Cartesian3.fromDegreesArray([-75,35,-125,35,]),width: 5,material:material, 保存后可看到在地图上创建了一条线段…...

[STM32] 5-1 时钟树(上)

文章目录 前言5-1 时钟树(上)时钟树的基本介绍时钟树的基本结构大树和小树频率运算简介计数器和分频STM32内部结构树的结构于关键节点SYSCLK(System Clock) 系统时钟 72M maxHCLK(AHB Clock) AHB时钟 36M maxPLCK(APB1 Clock) APB1时钟 36M maxPLCK2(APB…...

【Linux网络与网络编程】12.NAT技术内网穿透代理服务

1. NAT技术 之前我们说到过 IPv4 协议中IP 地址数量不充足的问题可以使用 NAT 技术来解决。还提到过本地主机向公网中的一个服务器发起了一个网络请求,服务器是怎么将应答返回到该本地主机呢?(如何进行内网转发?) 这就…...

【​​HTTPS基础概念与原理​】TLS握手过程详解​​

以下是 TLS握手过程的详细拆解,涵盖客户端与服务器之间的关键交互步骤,包括ClientHello、ServerHello、证书验证、密钥交换等核心阶段,并对比TLS 1.2与TLS 1.3的差异: 一、TLS握手的核心目标 协商协议版本:确定双方支…...

从辅助到协作:GitHub Copilot的进化之路

如果说现代程序员的标配工具除了VS Code、Stack Overflow之外,还有谁能入选,那一定是GitHub Copilot。从2021年首次亮相,到如今深度集成进开发者日常流程,这个“AI编程助手”已经不只是写几行自动补全代码的小帮手了,而…...

Linux运行时的参数、命令、网络、磁盘参数和日志监控

一、监控 1. free 功能:用于查看系统内存使用情况,包括物理内存总量、已用内存、空闲内存、缓冲区(buffer)和缓存(cache)占用,以及交换内存(swap)的使用与剩余情况。常…...

鸿蒙页面布局入门

本文以仿猫眼电影M站首页布局为案例,展示ArkUI在实际开发中的应用。内容包括案例效果及相关知识点,深入解析布局框架以及头部、脚部、内容区域的构建思路与代码实现,最后提供完整代码和教程资源,助力你强化实践能力。 1. 案例效果…...

VTK|类似CloudCompare的比例尺实现2-vtk实现

文章目录 实现类头文件实现类源文件调用逻辑关键问题缩放限制问题投影模式项目git链接实现类头文件 以下是对你提供的 ScaleBarController.h 头文件添加详细注释后的版本,帮助你更清晰地理解每个成员和方法的用途,尤其是在 VTK 中的作用: #ifndef SCALEBARCONTROLLER_H #de…...

阿里巴巴开源移动端多模态LLM工具——MNN

MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练,并在设备端的推理和训练方面具有行业领先的性能。目前,MNN 已集成到阿里巴巴集团的 30 多个应用中,如淘宝、天猫、优酷、钉钉、闲鱼等,覆盖了直播、短视频…...