You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FileOutputStream写入Date类型报错,求替代库及问题解决方案

问题原因及修复方案

问题1:FileOutputStream无法写入Date、boolean类型报错

  • 根本原因:FileOutputStream是面向二进制的字节输出流,仅支持写入byte[]、0~255范围的int值这两类参数,不支持直接写入引用类型(如Date)、boolean类型,因此编译报错。
  • 无需引入第三方库,直接使用JDK自带的PrintWriter/BufferedWriter字符流即可实现多类型文本写入,字符流会自动将各类数据转为可阅读的文本格式写入日志文件。

问题2:删除Date、boolean写入后count值未写入文件

  • 两个直接原因:
    1. FileOutputStream.write(int)方法仅会写入int值的低8位二进制内容,写入的是二进制字节而非文本数字,你用文本编辑器打开日志文件自然看不到可读的count数值。
    2. 代码里把out.close()写在了for循环内部,第一次循环执行完就直接关闭了输出流,就算有后续数据也无法写入,就算你用try-with-resources语法自动关流,也不应该在循环里手动关流。

修正后的代码(仅需修改Logger类即可)

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;

public class Logger
{
    ArrayList<UserInfo> obj = new ArrayList<>();

    public Logger(Date date, int count, boolean correct){
        obj.add(new UserInfo(date, count, correct));
        // PrintWriter构造方法第二个参数true表示追加写入,不需要追加可以去掉,每次覆盖旧日志
        try (PrintWriter out = new PrintWriter("atm.log", "UTF-8")) {
            for (UserInfo s : obj) {
                // 按自定义格式写入,三个字段用制表符分隔,方便后续读取解析
                out.printf("%tF %tT\t%d\t%b%n", s.getDate(), s.getDate(), s.getCount(), s.isCorrect());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

补充说明

  • 上述代码会自动将Date格式化为年-月-日 时:分:秒的可读格式,count直接输出数字,boolean输出true/false,不同字段用制表符分隔,方便后续读取拆分。
  • try-with-resources语法会自动帮你关闭输出流,不需要手动调用close()方法,也不会出现提前关流的问题。

内容的提问来源于stack exchange,提问作者Matt Beagle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:27:02