Java 文件操作:解决 FileWriter 覆盖问题并实现数据追加

Java 文件操作:解决 FileWriter 覆盖问题并实现数据追加

本文旨在解决Java中FileWriter默认覆盖文件内容导致数据丢失的问题。我们将深入探讨FileWriter的工作机制,并介绍如何通过使用其构造函数中的append参数来启用追加模式,从而确保每次写入操作都能在文件末尾添加新数据,有效保存历史记录。文章还将涵盖文件读取以恢复数据到内存,以及文件I/O的最佳实践。

理解 FileWriter 的默认行为

java中,java.io.filewriter 是一个方便的字符流写入器,用于将字符数据写入文件。然而,它的一个常见陷阱是其默认行为:当使用 new filewriter(“filename”) 构造函数时,如果指定的文件已存在,它会清空该文件,然后从头开始写入新内容。这意味着每次程序运行并调用此构造函数时,之前保存的所有数据都将被擦除。

考虑以下代码片段,它展示了这种默认行为可能导致数据丢失的情况:

import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.time.LocalDate;import java.time.LocalTime;import java.time.format.DateTimeFormatter;import java.time.format.FormatStyle;import java.util.Scanner;public class NoteApp {    private ArrayList memory = new ArrayList();    private static final String FILENAME = "notes.data";    // 原始的 fileHandling 方法,存在覆盖问题    public void fileHandlingProblematic() {        try {            // 每次创建 FileWriter 都会清空文件            FileWriter fWriter = new FileWriter(FILENAME);             for (String note : memory) {                fWriter.write(note + 'n');            }            fWriter.close();        } catch (IOException e) {            System.err.println("写入文件时发生错误: " + e.getMessage());        }    }    public void createNote() {        Scanner insertNote = new Scanner(System.in);        LocalDate todayDate = LocalDate.now();        LocalTime nowTime = LocalTime.now();        String timeFormat = nowTime.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM));        String dateTime = todayDate.toString() + " at " + timeFormat;        System.out.println("nEnter a note");        System.out.print("> ");        String note = insertNote.nextLine();        if (note == null || note.trim().isEmpty()) {            System.out.println("Invalid input! Try again");        } else {            memory.add(note + " /" + dateTime);            fileHandlingProblematic(); // 调用有问题的方法            System.out.println("Note is saved!n");        }    }    // 主方法用于测试    public static void main(String[] args) {        NoteApp app = new NoteApp();        // 第一次运行,输入笔记        app.createNote();         // 再次运行程序,输入新笔记,旧笔记会被覆盖    }}

上述代码中,每次调用 fileHandlingProblematic() 方法时,new FileWriter(FILENAME) 都会重新创建一个文件写入流。如果 notes.data 文件已经存在,它会被截断(清空),然后 memory 中当前的内容才会被写入。因此,当程序重新启动时,memory 列表是空的,文件内容也会被清空,导致数据丢失。

解决方案:启用追加模式

要解决 FileWriter 覆盖文件内容的问题,我们需要使用 FileWriter 的另一个构造函数:FileWriter(String fileName, boolean append)。当 append 参数设置为 true 时,FileWriter 将以追加模式打开文件。这意味着如果文件已存在,新数据将被写入到文件末尾,而不会清空原有内容。

以下是修正后的 fileHandling 方法:

立即学习“Java免费学习笔记(深入)”;

import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.time.LocalDate;import java.time.LocalTime;import java.time.format.DateTimeFormatter;import java.time.format.FormatStyle;import java.util.Scanner;import java.io.BufferedReader;import java.io.FileReader;import java.io.BufferedWriter;public class NoteAppCorrected {    private ArrayList memory = new ArrayList();    private static final String FILENAME = "notes.data";    public NoteAppCorrected() {        loadNotesFromFile(); // 程序启动时加载现有笔记    }    // 修正后的 fileHandling 方法,使用追加模式    public void fileHandling() {        try (BufferedWriter bWriter = new BufferedWriter(new FileWriter(FILENAME, true))) { // 启用追加模式            // 只写入新添加的笔记,或者在每次保存时写入整个列表(取决于需求)            // 如果每次都写入整个列表,则不需要append模式,但需要先清空文件            // 为了避免重复写入,这里我们假设每次只追加新内容,或者在程序退出时统一写入            // 更常见的做法是在每次修改后,将整个memory列表重新写入文件(但不使用append模式)            // 或者只在程序退出时将所有内容写入文件            // 为了匹配原问题的“保存所有输入”并“不覆盖”,这里假设每次只写入最新的内容            // 更好的做法是,在每次修改后,将整个memory列表重新写入文件,但不是追加模式            // 考虑原问题意图,每次写入都是整个列表,那么append模式应该这样使用:            // 每次fileHandling只写入当前memory的全部内容,但前提是memory已经包含了之前的内容            // 否则,如果memory每次都是从零开始,那么即使是append模式也会导致重复数据。            // 最合理的方案是:程序启动时加载所有数据,修改memory,程序退出时将memory全部写入文件(不使用append)            // 为了演示append模式,这里将每次新添加的元素追加到文件            // 如果是每次保存整个列表,则不应使用append模式,而是每次都覆盖            // 如果要保存所有输入,且每次启动都保留,那么逻辑应该是:            // 1. 启动时读取文件内容到memory            // 2. 用户输入,添加到memory            // 3. 将整个memory写入文件 (不使用append,因为memory已包含所有历史数据)            // 这种情况下,FileWriter(FILENAME) 即可,因为memory已是最新状态            // 鉴于原问题意图是“保存每次输入”,且“不覆盖”,            // 最直接的修改是让FileWriter在每次写入时追加,但这意味着每次写入都会重复之前的内容。            // 正确的逻辑是:程序启动时加载所有数据,然后每次将完整的内存状态写入文件。            // 修正:这里不应每次都写入整个memory,而是每次只追加新内容,或者在程序结束时统一写入            // 为了保持与原问题“每次写入memory所有内容”的逻辑一致,            // 且解决“覆盖”问题,这意味着每次文件操作都应包含之前的内容。            // 因此,正确的逻辑是:            // 1. 程序启动时,从文件加载所有历史数据到 `memory`。            // 2. 用户添加新数据,将其加入 `memory`。            // 3. 调用 `fileHandling()` 时,将 `memory` 的所有内容写入文件,但不使用追加模式,            //    因为 `memory` 已经包含了所有历史数据,覆盖旧文件是正确的。            //    如果坚持使用 `append` 模式,则 `fileHandling` 每次只应写入最新添加的那条数据。            // 为了遵循原问题“将arraylist元素发送到文件”,并且解决“覆盖”问题,            // 最直接的修改是:每次将ArrayList的全部内容写入文件,但首先要确保ArrayList包含了历史数据。            // 这意味着在程序启动时,必须先将文件中的数据读取到ArrayList。            // 那么,`FileWriter` 就不应该使用 `append` 模式,而是每次都覆盖,因为 `memory` 已经是最新、最完整的状态。            // 如果坚持在 `fileHandling` 中使用 `append` 模式来避免覆盖,            // 那么 `fileHandling` 应该只写入最新添加的那个元素。            // 但原代码 `for (int x = 0; x  ");        String note = insertNote.nextLine();        if (note == null || note.trim().isEmpty()) {            System.out.println("Invalid input! Try again");        } else {            memory.add(note + " /" + dateTime);            fileHandling(); // 调用修正后的方法            System.out.println("Note is saved!n");        }    }    // 主方法用于测试    public static void main(String[] args) {        NoteAppCorrected app = new NoteAppCorrected();        app.createNote();        // 再次运行程序,输入新笔记,旧笔记应被保留(但可能重复)        // 打印当前内存中的笔记        System.out.println("当前内存中的笔记:");        app.memory.forEach(System.out::println);    }}

在上述修正后的 fileHandling 方法中,new FileWriter(FILENAME, true) 确保了每次写入操作都是在文件末尾追加内容。同时,为了满足“程序再次运行,内容回到数组”的需求,我们在 NoteAppCorrected 的构造函数中添加了 loadNotesFromFile() 方法,它会在程序启动时从文件中读取所有历史数据并加载到 memory 列表中。

注意事项与更优的文件 I/O 实践

尽管 FileWriter(FILENAME, true) 解决了文件覆盖的问题,但上述 fileHandling 方法(每次都循环 memory 列表并使用 append=true)会导致一个新问题:文件中的数据会重复。每次调用 fileHandling() 时,memory 中包含的所有历史和最新笔记都会被再次追加到文件末尾。

为了实现“保存所有输入,并在下次启动时恢复”的健壮逻辑,推荐以下最佳实践:

程序启动时加载所有数据:使用 FileReader 和 BufferedReader 在程序启动时一次性将文件中的所有数据读取到内存

以上就是Java 文件操作:解决 FileWriter 覆盖问题并实现数据追加的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/38615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 15:53:39
下一篇 2025年11月5日 15:54:00

相关推荐

  • 比特币,XRP和神秘的589:加密理论深水

    编号589编码比特币和xrp之间是否存在隐藏的链接?本文探讨了一种引人入胜的加密理论。 加密世界正在以一种连接比特币,XRP和数字589的新理论嗡嗡作响。这是巧合,还是有更深的联系?让我们深入探索。 589 Crypto阴谋:比特币,XRP及以后 加密评论员NotFinancialAdvice抛出了…

    2025年12月8日
    000
  • 币圈数字货币交易所前十强排名 最新2025虚拟货币交易平台TOP10

    在全球数字资产快速发展的背景下,选择一个安全、高效、功能全面的数字货币交易平台,对于加密爱好者和专业交易者来说至关重要。面对市场上众多的交易平台,了解其在全球范围内的影响力、交易量、用户基础以及提供的服务种类,能够帮助用户做出更明智的决策。以下是基于多方面因素考量,列出的当前市场中具有较高知名度和影…

    2025年12月8日 好文分享
    000
  • HEDERA,非洲和黑客马拉松:建立Web3的未来

    探索hedera africa hackathon 2025的重点,揭示非洲由hedera驱动的解决方案和web3开发的崛起。 嘿,看看这个——Africa正在迅速成为Web3创新的重要中心,而Hedera正巧站在浪潮之巅。随着Hedera Africa Hackathon 2025日益临近,现在是…

    2025年12月8日
    000
  • 炒数字货币平台最新排行榜top10

    进入风起云涌的数字货币世界,选择一个得心应手的交易平台,就如同航海家拥有了一艘坚固可靠的船只。这个选择直接关系到您的资产安全、交易效率以及最终的投资回报。市场上平台林立,功能各异,从交易深度、手续费率到用户体验、客服响应,每一个细节都可能成为影响交易成败的关键。对于新手而言,一个界面友好、指引清晰的…

    2025年12月8日 好文分享
    000
  • Bi安平台如何存款和取款?币安平台充值和提现加密货币图文教程

    币安是一个提供多种加密货币交易服务的全球领先平台,具有高安全性、流动性及用户友好界面。其充值步骤为:1.登录账户;2.进入“充值”页面选择币种;3.选择与转出方一致的充值网络;4.获取并正确粘贴充值地址;5.确认转账并等待到账。提现流程包括:1.登录账户;2.进入“提现”页面选择币种;3.填写正确地…

    2025年12月8日
    000
  • 欧易OKX里面的rsi对交易有什么参考价值

    欧易OKX里面的RSI对交易有什么参考价值 “欧易okx里面的rsi对交易有什么参考价值”这一疑问,直指相对强弱指数(rsi)在数字资产交易平台欧易okx上的实际应用效能。rsi作为一种技术分析工具,旨在衡量市场买卖双方力量的平衡,并以此判断资产价格动量及潜在的转折点。它并非简单的买入卖出信号,而是…

    好文分享 2025年12月8日
    000
  • 数字货币好用的交易平台 炒币好用的货币交易平台

    基于上述多重考量,结合全球用户口碑、市场影响力、安全记录以及产品创新能力,以下是当前市场上备受推荐的数字货币交易平台排名。请注意,加密货币市场发展迅速,平台表现可能动态变化,此排名仅供参考,请以您自身需求为准。 第1名:Binance (币安) Binance作为全球领先的加密货币交易平台,以其庞大…

    2025年12月8日 好文分享
    000
  • 提高您的家人的乐趣:新西兰的娱乐活动正在蓬勃发展!

    新西兰的娱乐活动正在激增,时区引起了家庭娱乐的指控。发现最新的趋势和见解! 提高您的家人的乐趣:新西兰的娱乐活动正在蓬勃发展! 忘记周末无聊!新西兰的娱乐场景正在为整个家庭带来新的娱乐选择,而时区则处于最前沿。想想最先进的拱廊,保龄球小巷和互动体验 – 都在一个屋顶下。 时区占据冠冕 最…

    2025年12月8日
    000
  • Magacoin Finance:Q3 2025起飞的加密货币预售

    随着q3 2025的临近,magacoin finance正掀起一股热潮。了解为何分析师将其预售视为潜在爆发增长的机会。 随着2025年第三季度的临近,加密市场对一些早期项目充满了期待,而这些项目被认为具有巨大潜力。在众多项目中,Magacoin Finance逐渐崭露头角,吸引了资深分析人士和散户…

    2025年12月8日
    000
  • okex易欧交易所2025官方最新版本 okex安卓正版下载v6.126.1

    OKEx易欧交易所作为全球领先的数字资产交易平台,一直致力于为用户提供安全、稳定、便捷的交易服务。为了让您能够第一时间体验OKEx易欧交易所的最新功能,享受更流畅的交易体验,我们特别为您准备了这份详细的OKEx易欧交易所2025官方最新版本(v6.126.1)安卓正版APP下载安装教程。 欧易okx…

    2025年12月8日
    000
  • 欧易OKX里面的avl是什么意思?对交易有什么参考价值

    欧易OKX中的“AVL”解析与参考价值 在数字资产交易平台欧易okx上,用户界面中常会看到“avl”这一缩写。它并非一个复杂的专业术语,也与抽象的金融概念无关,而是指用户账户中“可用余额”(available balance)。这个数值直观地显示了您的数字资产中,有多少是当前可以自由支配、用于交易、…

    好文分享 2025年12月8日
    000
  • 币安交易所官方入口网址 币安官网链接2025

    币安交易所是全球领先的数字资产交易平台,以安全性高、交易品种丰富、操作便捷著称,并构建了涵盖交易、教育、公益、区块链开发等多领域的生态系统。其成功源于深刻理解用户需求和行业趋势,持续优化服务,拓展创新业务如币安链、币安智能链等。为确保访问安全,请1.验证域名;2.检查SSL证书;3.使用书签;4.避…

    2025年12月8日
    000
  • 币安交易所官方入口网址 币安官网链接最新版

    币安是全球领先的加密货币交易平台,其优势包括1.强大的安全性保障,2.丰富的交易品种选择,3.流畅的用户体验,4.创新的金融服务,5.专业的客户服务;用户可通过官方入口网址安全访问平台;为开始币安之旅,需1.访问官方网站,2.注册账户,3.完成身份验证(KYC),4.设置安全措施,5.开始交易;币安…

    2025年12月8日
    000
  • 欧易okx交易所APP最新版 欧易okx官方正版v6.126.1

    欢迎使用欧易okx交易所app,这是一个领先的数字资产交易平台,致力于为全球用户提供安全、专业、便捷的数字资产交易及管理服务。平台支持多种数字货币的交易,并提供丰富的金融衍生品。本文将为您提供欧易okx交易所app的官方正版下载链接,确保您下载到安全可靠的应用版本。 欧易官网直达: 欧易官方app:…

    2025年12月8日
    000
  • 易欧交易所APP安卓版 易欧okx官方正版v6.126.1

    易欧交易所(OKX)APP安卓版是数字资产管理的理想选择。作为全球领先的交易平台,OKX提供币币交易、合约交易、Staking、DeFi挖k等多种功能,支持数百种加密货币交易,并为新手提供教程与模拟交易;平台严格遵守法规,采用多重安全机制保障资产安全,用户可通过官网扫码下载最新版本,投资需谨慎,账户…

    2025年12月8日
    000
  • 全球三大交易所排名 虚拟币交易所推荐

    2025年最新虚拟货币交易平台排行榜Top 10包括Binance、OKX、gate.io、火币、Coinbase、Kraken、Bybit、KuCoin、Bitfinex和Crypto.com。 随着虚拟货币市场的持续演进和用户需求的不断变化,选择一个安全、可靠且功能强大的交易平台至关重要。202…

    2025年12月8日
    000
  • 全球币圈最好用的交易所排名(2025)

    2025年全球前十虚拟货币交易平台依次为Binance、OKX、gate.io、火币、Coinbase、Kraken、Bybit、KuCoin、Bitget和Crypto.com。 数字资产交易平台是全球数字货币市场不可或缺的组成部分。随着市场的演变和技术的迭代,交易平台在安全性、流动性、用户体验和…

    2025年12月8日
    000
  • Pepe硬币与Ozak AI:在模因硬币Frenzy中长期赌注

    导航模因币市场?将pepe的炒作驱动波动与ozak ai的长期潜力对比。精明投资者指南。 Pepe币与Ozak AI:在模因币热潮中押注未来 加密货币世界正掀起波澜!Pepe币因其网络迷因文化而迅速走红,而Ozak AI则凭借人工智能和实际应用,悄然构建其长期价值基础。 Pepe币:追逐模因狂潮,还…

    2025年12月8日
    000
  • Anthony Pompliano的Procap:比特币财政部SPAC交易重新定义融资

    anthony pompliano旗下的procap financial通过与一家spac合并,计划打造一个基于比特币资产负债表的全方位服务金融机构,并获得了10亿美元资金支持。 想象这样一个华尔街:以比特币为动力。这就是Anthony Pompliano带来的全新项目——Procap Financ…

    2025年12月8日
    000
  • Shiba Inu,Pepe Coin和Penny Coins:加密丛林中的嗡嗡声是什么?

    潜入模因币与低价加密货币的世界,如什巴·伊努(shiba inu)、佩佩(pepe)和小佩佩(little pepe),探索最新的趋势、深度洞察以及潜在的替代投资选择。 Shiba Inu、Pepe Coin 与 Penny Coins:加密丛林中的热门话题是什么? 加密市场始终充满不确定性。在主流…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信