gpt4 book ai didi

java - 检查文件是否已完全写入

转载 作者:太空宇宙 更新时间:2023-11-04 08:29:59 25 4
gpt4 key购买 nike

如果我从 java 执行该软件,我如何知道该软件是否已完成写入文件?例如,我使用输入文件 RawText 执行 geniatagger.exe,该输入文件将生成输出文件 TAGGEDTEXT.txt。当 geniatagger.exe 完成写入 TAGGEDTEXT.txt 文件时,我可以使用此文件做一些其他工作。问题是 - 我怎么知道 geniatagger 已经完成了文本文件的写入?

try{
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("geniatagger.exe -i "+ RawText+ " -o TAGGEDTEXT.txt");
}

最佳答案

你不能,或者至少不可靠。

在这种特殊情况下,您最好的选择是观看过程完成。

您可以获得进程的返回代码作为奖励,这可以告诉您是否发生了错误。

如果您实际上在谈论 this GENIA tagger ,下面是一个演示各种主题的实际示例(请参阅代码下方有关编号注释的说明)。该代码使用 Linux 版 v1.0 进行了测试,并演示了如何安全地运行一个期望输入和输出流管道正常工作的进程。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.concurrent.Callable;

import org.apache.commons.io.IOUtils;

public class GeniaTagger {

/**
* @param args
*/
public static void main(String[] args) {
tagFile(new File("inputText.txt"), new File("outputText.txt"));
}

public static void tagFile(File input, File output) {
FileInputStream ifs = null;
FileOutputStream ofs = null;
try {
ifs = new FileInputStream(input);
ofs = new FileOutputStream(output);
final FileInputStream ifsRef = ifs;
final FileOutputStream ofsRef = ofs;

// {1}
ProcessBuilder pb = new ProcessBuilder("geniatagger.exe");
final Process pr = pb.start();

// {2}
runInThread(new Callable<Void>() {
public Void call() throws Exception {
IOUtils.copy(ifsRef, pr.getOutputStream());
IOUtils.closeQuietly(pr.getOutputStream()); // {3}
return null;
}
});
runInThread(new Callable<Void>() {
public Void call() throws Exception {
IOUtils.copy(pr.getInputStream(), ofsRef); // {4}
return null;
}
});
runInThread(new Callable<Void>() {
public Void call() throws Exception {
IOUtils.copy(pr.getErrorStream(), System.err);
return null;
}
});

// {5}
pr.waitFor();
// output file is written at this point.
} catch (Exception e) {
e.printStackTrace();
} finally {
// {6}
IOUtils.closeQuietly(ifs);
IOUtils.closeQuietly(ofs);
}
}

public static void runInThread(final Callable<?> c) {
new Thread() {
public void run() {
try {
c.call();
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}.start();
}
}
  1. 使用ProcessBuilder启动进程,它比普通的Runtime.getRuntime().exec(...)有更好的界面。

  2. 在不同线程中设置流管道,否则 ({5}) 中的 waitFor() 调用可能永远无法完成。

  3. 请注意,我通过管道将 FileInputStream 传送到了该进程。根据上述 GENIA 页面,该命令需要实际输入而不是 -i 参数。连接到进程的OutputStream必须关闭,否则程序将继续运行!

  4. 将过程结果复制到 FileOutputStream,即您正在等待的结果文件。

  5. 让主线程等待,直到进程完成。

  6. 清理所有流。

关于java - 检查文件是否已完全写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7732471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com