首先,一个简单的测试代码:
package javaapplication23;
import java.io.IOException;
import java.util.logging.FileHandler;
public class JavaApplication23 {
public static void main(String[] args) throws IOException {
new FileHandler("./test_%u_%g.log", 10000, 100, true);
}
}
这个测试代码只用 Java 7 创建一个文件“test_0_0.log”,不管我多久运行一次程序。这是预期的行为,因为构造函数中的 append 参数设置为 true。
但是如果我在 Java 8 中运行这个示例,每次运行都会创建一个新文件(test_0_0.log、test_0_1.log、test_0_2.log、...)。我认为这是一个错误。
恕我直言,Java中的相关变化是这样的:
@@ -413,18 +428,18 @@
// object. Try again.
continue;
}
- FileChannel fc;
+
try {
- lockStream = new FileOutputStream(lockFileName);
- fc = lockStream.getChannel();
- } catch (IOException ix) {
- // We got an IOException while trying to open the file.
- // Try the next file.
+ lockFileChannel = FileChannel.open(Paths.get(lockFileName),
+ CREATE_NEW, WRITE);
+ } catch (FileAlreadyExistsException ix) {
+ // try the next lock file name in the sequence
continue;
}
+
boolean available;
try {
- available = fc.tryLock() != null;
+ available = lockFileChannel.tryLock() != null;
// We got the lock OK.
} catch (IOException ix) {
// We got an IOException while trying to get the lock.
@@ -440,7 +455,7 @@
}
// We failed to get the lock. Try next file.
- fc.close();
+ lockFileChannel.close();
}
}
(完整:OpenJDK 变更集 6123:ac22a52a732c)
我知道通常 FileHandler 会被 Logmanager 关闭,但如果系统或应用程序崩溃或进程被终止,情况并非如此。这就是为什么我在上面的示例代码中没有“关闭”语句的原因。
现在我有两个问题:
1)你的意见是什么?这是一个错误吗?(几乎在以下评论和答案中回答)
2) 您知道在 Java 8 中获取旧 Java 7 行为的解决方法吗?(更重要的问题……)
感谢您的回答。