FileOutputStream写入Date类型报错,求替代库及问题解决方案
问题原因及修复方案
问题1:FileOutputStream无法写入Date、boolean类型报错
- 根本原因:
FileOutputStream是面向二进制的字节输出流,仅支持写入byte[]、0~255范围的int值这两类参数,不支持直接写入引用类型(如Date)、boolean类型,因此编译报错。 - 无需引入第三方库,直接使用JDK自带的
PrintWriter/BufferedWriter字符流即可实现多类型文本写入,字符流会自动将各类数据转为可阅读的文本格式写入日志文件。
问题2:删除Date、boolean写入后count值未写入文件
- 两个直接原因:
FileOutputStream.write(int)方法仅会写入int值的低8位二进制内容,写入的是二进制字节而非文本数字,你用文本编辑器打开日志文件自然看不到可读的count数值。- 代码里把
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
相关产品推荐
相关产品推荐

