Одной из попыток было бы отключить безголовый на некоторое время, открыть файл и, наконец, включить его снова. Что-то вроде:
System.setProperty("java.awt.headless", "true"); // assume it is enabled somewhere
File desktop = new File(System.getProperty("user.home"), "Desktop");
File text = new File(desktop, "a.txt");
System.setProperty("java.awt.headless", "false");
Desktop.getDesktop().open(text);
System.setProperty("java.awt.headless", "true");
Однако иногда System.setProperty("java.awt.headless", "false");
недостаточно для отключения свойства без заголовка. Одним из решений dirty было бы изменить его значение с помощью reflect
.
System.setProperty("java.awt.headless", "true"); // assume it is enabled somewhere
File desktop = new File(System.getProperty("user.home"), "Desktop");
File text = new File(desktop, "a.txt");
setHeadless(false);
Desktop.getDesktop().open(text);
setHeadless(true);
Desktop.getDesktop().open(text);
с setHeadless
метод:
private static void setHeadless(boolean enabled) {
try {
Field defaultHeadlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("defaultHeadless");
defaultHeadlessField.setAccessible(true);
defaultHeadlessField.set(null, enabled);
Field headlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("headless");
headlessField.setAccessible(true);
headlessField.set(null, enabled);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
Вторая попытка (и еще больше «форсирование») будет открывать ее через командную строку. Для Windows ОС (я не знаю о Linux / MacOS ) будет:
File desktop = new File(System.getProperty("user.home"), "Desktop");
File text = new File(desktop, "a.txt");
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("cmd.exe", "/c", text.getAbsolutePath()).start();