我有一个名为error.log.1
的文件。
我想告诉Java使用系统编辑器打开这个文件。
如果将其命名为error.log
,则可以执行以下操作:
Desktop.getDesktop().edit(new File("error.log") );
但是,由于它不是可识别的文件扩展名,因此无法打开。相反,我得到了一个错误:
Exception in thread "main" java.io.IOException: Failed to open error.log.1.
Error message: No application is associated with the specified file for this operation.
at sun.awt.windows.WDesktopPeer.ShellExecute(Unknown Source)
at sun.awt.windows.WDesktopPeer.open(Unknown Source)
at java.awt.Desktop.open(Unknown Source)
at net.joshuad.hypnos.workbench.EditorTest.main(EditorTest.java:9)
发布于 2018-08-13 09:25:42
我不确定什么是“系统编辑器”,但如果它是您想要打开的特定应用程序,您将需要运行该应用程序并将日志文件名作为参数传递。
您需要确定应用程序的路径,然后才能使用Runtime.getRuntime().exec()
方法打开该文件。
例如,如果要使用记事本打开日志文件,可以这样做:
Runtime.getRuntime().exec("C:\\Windows\\System32\\notepad.exe error.log.1");
当然,这假设应用程序接受文件名作为参数。你需要研究一下这个系统编辑器的命令行语法。
发布于 2018-08-13 10:51:49
正如Zephyr所建议的,一个好的解决方案是指定默认编辑器的路径(编写一些特定于平台的代码)。或者更好的是,你可以打包你自己的跨平台文本编辑器,像jEdit这样的东西可能是一个很好的选择。
然而,如果你真的想使用Desktop.getDesktop().edit(path)
,那么一个技巧就是简单地检查文件扩展名,如果它是未知的,那么在末尾添加".log“或".txt”。
有点像这样:
File originalName = new File("path/to/my/file/error.log.1");
File appendedName = new File(originalName.getAbsolutePath()+".log");
boolean success = originalName.renameTo(appendedName);
if (success) {
Desktop.getDesktop().edit(appendedName);
}
//Change it back when you are done:
appendedName.renameTo(originalName);
显然,如果多个源/应用程序同时读取原始文件,这将不起作用(您可以制作副本而不是重命名),但它可能适合您的用例。
https://stackoverflow.com/questions/51813927
复制相似问题