为了账号安全,请及时绑定邮箱和手机立即绑定

对 unix 文件进行阻塞写入操作

对 unix 文件进行阻塞写入操作

函数式编程 2023-08-09 15:49:39
有没有某种方法可以在unix上打开一个阻塞的文件进行写入(在完成“写入”操作之前实际上等待数据进入文件?我有一个程序,它从列表中获取结果行并将它们写入文件中。我当前的实现如下(我删除了每行完成的处理)    ArrayList<String> lines = new ArrayList<>();    BufferedReader in = new BufferedReader(new FileReader(inFile));    String line;    while((line = in.readLine()) != null){      lines.add(line);    }    int written = 0;    PrintWriter out = new PrintWriter(new FileWriter(outFile));    for(String l : lines){      written++;      out.println(l);      if(written % 10000 == 0)        Message.info("lines written "+written);    }    out.close();当前行为如下:[17:12:43 INFO ] 行写入 10000[17:12:43 INFO ] 行写入 20000[17:12:43 INFO ] 行写入 30000[17:12:44 INFO ] 行写入写入 40000[17:12:44 INFO ] 行写入 50000[17:12:44 INFO ] 行写入 60000[17:12:45 INFO ] 行写入 70000[17:12:45 INFO ] 行写入 80000[17:12: 45 INFO ] 写入 90000 行[17:12:46 INFO ] 写入 100000 行程序运行速度非常快,但最后等待(30-40秒)所有数据(4Go)写入文件才结束。(在此期间我可以看到文件在磁盘上增长)当我想要的时候,只有当数据确实在文件中时才显示我的信息消息:程序看起来会更慢,但会在最后一个之后立即结束信息。我尝试使用 BufferedWriter (来自 new BufferedWriter() 和 Files.newBufferedWriter())、FileOutputStream、OutputStream,但所有这些似乎都只建议非阻塞 IO 操作该程序在 Ubuntu 上运行(我读到该实现依赖于文件系统)那么,有什么方法可以在执行下一行代码之前等待 println()/write() 操作完成吗?我“感觉”java将实际写入委托给操作系统,并且不等待数据在磁盘上继续,但由于java在退出之前等待最后一次写入完成,因此必须有一个每行之后的等待方式
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

肮脏的解决方法:每 10,000 行,我关闭文件并使用StanddardOpenOption.APPEND.
这具有预期的行为,并且只有可接受的时间开销。

干净的解决方案:使用“StanddardOpenOption.SYNC”打开文件。
这具有预期的行为,但时间开销很大


查看完整回答
反对 回复 2023-08-09
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信