对 unix 文件进行阻塞写操作
Having a Blocking write operation to a unix file
有没有什么方法可以在 unix 上打开文件进行写入,这是阻塞的(实际上是在完成 "write" 操作之前等待数据进入文件?
我有一个程序可以从列表中获取结果行并将它们写入文件。
我目前的实现如下(我去掉了每行的处理)
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) 在结束前写入文件。 (我可以看到这段时间磁盘上的文件在增长)
当我想要的是,仅当数据确实在文件中时才显示我的 INFO 消息:程序看起来较慢,但会在最后一条消息后立即结束。
我尝试使用 BufferedWriter(来自 new BufferedWriter() 和 Files.newBufferedWriter())、FileOutputStream、OutputStream,但所有这些似乎只建议非阻塞 IO 操作
该程序在 Ubuntu 上 运行(我读到该实现依赖于文件系统)
那么,在执行下一行代码之前,有什么方法可以等待 println()/write() 操作完成吗?
我 "feel" java 委托实际写入 OS,并且不等待数据在磁盘上继续,但由于 java 等待最后一次写入完成才退出,必须有办法在每一行之后等待
肮脏的解决方法:每 10,000 行,我关闭文件并使用 StanddardOpenOption.APPEND
.
再次打开它
这具有预期的行为,只有 可接受的 时间开销。
clean 解决方案 : 用`StanddardOpenOption.SYNC.
打开文件
这具有 STRONG 时间开销
的预期行为
有没有什么方法可以在 unix 上打开文件进行写入,这是阻塞的(实际上是在完成 "write" 操作之前等待数据进入文件?
我有一个程序可以从列表中获取结果行并将它们写入文件。
我目前的实现如下(我去掉了每行的处理)
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) 在结束前写入文件。 (我可以看到这段时间磁盘上的文件在增长)
当我想要的是,仅当数据确实在文件中时才显示我的 INFO 消息:程序看起来较慢,但会在最后一条消息后立即结束。
我尝试使用 BufferedWriter(来自 new BufferedWriter() 和 Files.newBufferedWriter())、FileOutputStream、OutputStream,但所有这些似乎只建议非阻塞 IO 操作
该程序在 Ubuntu 上 运行(我读到该实现依赖于文件系统)
那么,在执行下一行代码之前,有什么方法可以等待 println()/write() 操作完成吗?
我 "feel" java 委托实际写入 OS,并且不等待数据在磁盘上继续,但由于 java 等待最后一次写入完成才退出,必须有办法在每一行之后等待
肮脏的解决方法:每 10,000 行,我关闭文件并使用 StanddardOpenOption.APPEND
.
再次打开它
这具有预期的行为,只有 可接受的 时间开销。
clean 解决方案 : 用`StanddardOpenOption.SYNC.
打开文件
这具有 STRONG 时间开销