我会尽力为您翻译中文。以下是需要翻译的内容:
第一次处理事件时,一切都很好!即使有多个文件需要处理。但在后续处理中,我收到了以下错误消息:
“由于另一个进程正在使用该文件,因此无法访问该文件。”
我做错了什么?我该怎么做才能成功处理连续的文件?
我忘记提及两个重要说明:
1. 我正在使用Windows 7。 2. 当我以调试模式运行应用程序时,它可以正常工作。
编辑:如果在尝试使用文件之前添加延迟,它将正常工作:
那么,Windows有可能没有及时解锁文件吗?我该如何以正确的方式修复它?
我按照 Java7 nio2教程 中关于监视目录更改的内容,使用 WatchDir.java 代码示例递归监视整个目录的内容。
代码如下:
// Get list of events for the watch key.
for (WatchEvent<?> event : key.pollEvents()) {
// This key is registered only for ENTRY_CREATE events, but an OVERFLOW event
// can occur regardless if events are lost or discarded.
if (event.kind() == OVERFLOW) {
continue;
}
// Context for directory entry event is the file name of entry.
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>)event;
Path fileName = ev.context();
Path fullPath = dir.resolve(fileName);
try {
// Print out event.
System.out.print("Processing file: " + fileName);
processed = fileProcessor.processFile(fullPath);
System.out.println("Processed = " + processed);
if (processed) {
// Print out event.
System.out.println(" - Done!");
}
}
catch (FileNotFoundException e) {
System.err.println("Error message: " + e.getMessage());
}
catch (IOException e) {
System.err.println("Error processing file: " + fileName.toString());
System.err.println("Error message: " + e.getMessage());
}
好的,问题(我肯定是在做一些愚蠢的事情)就在这里:
processed = fileProcessor.processFile(fullPath);
它的作用类似于这样:
public synchronized boolean processFile(Path fullPath) throws IOException {
String line;
String[] tokens;
String fileName = fullPath.getFileName().toString();
String fullPathFileName = fullPath.toString();
// Create the file.
File sourceFile = new File(fullPath.toString());
// If the file does not exist, print out an error message and return.
if (sourceFile.exists() == false) {
System.err.println("ERROR: " + fullPathFileName + ": No such file");
return false;
}
// Check file extension.
if (!getFileExtension(fullPathFileName).equalsIgnoreCase("dat")) {
System.out.println(" - Ignored.");
return false;
}
// Process source file.
try (BufferedReader bReader = new BufferedReader(new FileReader(sourceFile))) {
int type;
// Process each line of the file.
while (bReader.ready()) {
// Get a single line.
line = bReader.readLine();
// Get line tokens.
tokens = line.split(delimiter);
// Get type.
type = Integer.parseInt(tokens[0]);
switch (type) {
// Type 1 = Salesman.
case 1:
-> Call static method to process tokes.
break;
// Type 2 = Customer.
case 2:
-> Call static method to process tokes.
break;
// Type 3 = Sales.
case 3:
-> Call static method to process tokes.
break;
// Other types are unknown!
default:
System.err.println("Unknown type: " + type);
break;
}
}
PrintStream ps = null;
try {
// Write output file.
// Doesn't matter.
}
finally {
if (ps != null) {
ps.close();
}
}
return true;
}
}
第一次处理事件时,一切都很好!即使有多个文件需要处理。但在后续处理中,我收到了以下错误消息:
“由于另一个进程正在使用该文件,因此无法访问该文件。”
我做错了什么?我该怎么做才能成功处理连续的文件?
我忘记提及两个重要说明:
1. 我正在使用Windows 7。 2. 当我以调试模式运行应用程序时,它可以正常工作。
编辑:如果在尝试使用文件之前添加延迟,它将正常工作:
Thread.sleep(500);
// Process source file.
try (BufferedReader bReader = new BufferedReader(new FileReader(sourceFile))) {
那么,Windows有可能没有及时解锁文件吗?我该如何以正确的方式修复它?