Не удается запустить файл в сети с помощью Java Desktop?
(У меня есть проблема, которую я проиллюстрировал в этом вопросе, но у меня не было правильных ответов. Я уточнил свою проблему и попытался отредактировать первоначальный вопрос, чтобы отразить это, но я предполагаю, что из-за того, что SO отображает неотвеченные вопросы, он потерял импульс, и нет никакого способа чтобы восстановить его. Поэтому я снова публикую свой правильный вопрос).
У меня есть файл, который находится в общей сетевой папке:
"\\KUROSAVVAS-PC\Users\kuroSAVVAS\Desktop\New Folder\Warsaw Panorama.JPG"
(Пробелы там намеренно)
Следующий код:
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
try {
String s = "\\\\KUROSAVVAS-PC\\Users\\kuroSAVVAS\\Desktop\\New Folder\\Warsaw Panorama.jpg";
File f = new File(s);
System.out.println(f.exists());
Desktop.getDesktop().open(f);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Печатает в консоль, что файл существует (System.out.println (f.exists ());), но выдает это исключение!:
java.io.IOException: Failed to open file:////KUROSAVVAS-PC/Users/kuroSAVVAS/Desktop/New%20%20%20%20%20Folder/Warsaw%20%20%20%20Panorama.jpg. Error message: The system cannot find the file specified.
at sun.awt.windows.WDesktopPeer.ShellExecute(WDesktopPeer.java:59)
at sun.awt.windows.WDesktopPeer.open(WDesktopPeer.java:36)
at java.awt.Desktop.open(Desktop.java:254)
at Test.main(Test.java:13)
Кто-нибудь знает, почему может произойти нечто подобное? Я перепробовал все, от создания URI до декодирования их потом... Ничего не работает.
4 ответа
Кажется, что есть ошибка при попытке доступа к ресурсу на сетевом диске с пробелами в пути. Смотрите эту запись в базе данных ошибок Sun.
Поскольку этой ошибке уже год, я не думаю, что вы исправите ее в ближайшее время. Попробуйте последнюю ВМ. Если это не поможет, попробуйте найти источник WDesktopPeer
, Вместо того, чтобы кодировать путь, постарайтесь сохранить его как есть (с обратной косой чертой и всем) и заключите его в кавычки. Это может сработать.
[РЕДАКТИРОВАТЬ] В частности, не заменять \
с /
не надо готовить file://
и оставить пробелы как есть (вместо того, чтобы заменить их %20
)
С Java 7 вы можете сделать это
public static void main(String[] args) throws IOException {
String s = "\\\\KUROSAVVAS-PC\\Users\\kuroSAVVAS\\Desktop\\New Folder\\Warsaw Panorama.jpg";
Path p = Paths.get(s);
Desktop.getDesktop().browse(p.toUri());
}
Решение Java 6:
public static void launchFile(File file) {
if (!Desktop.isDesktopSupported())
return;
Desktop dt = Desktop.getDesktop();
try {
dt.open(file);
} catch (IOException ex) {
// this is sometimes necessary with files on other servers ie
// \\xxx\xxx.xls
launchFile(file.getPath());
}
}
// this can launch both local and remote files
public static void launchFile(String filePath) {
if (filePath == null || filePath.trim().length() == 0)
return;
if (!Desktop.isDesktopSupported())
return;
Desktop dt = Desktop.getDesktop();
try {
dt.browse(getFileURI(filePath));
} catch (Exception ex) {
ex.printStackTrace();
}
}
// generate uri according to the filePath
private static URI getFileURI(String filePath) {
URI uri = null;
filePath = filePath.trim();
if (filePath.indexOf("http") == 0 || filePath.indexOf("\\") == 0) {
if (filePath.indexOf("\\") == 0){
filePath = "file:" + filePath;
filePath = filePath.replaceAll("#", "%23");
}
try {
filePath = filePath.replaceAll(" ", "%20");
URL url = new URL(filePath);
uri = url.toURI();
} catch (MalformedURLException ex) {
ex.printStackTrace();
} catch (URISyntaxException ex) {
ex.printStackTrace();
}
} else {
File file = new File(filePath);
uri = file.toURI();
}
return uri;
}
Этот ответ был в отчете об ошибке, но я отредактировал его, чтобы исправить, когда есть хэш.
TL;DR ответа ZAMMBI (+1 BTW). (Использование Java 6)
Это работает, как и ожидалось
Desktop.getDesktop().open(new File("\\\\host\\path_without\\spaces.txt")); //works
Это терпит неудачу из-за известной ошибки Java:
Desktop.getDesktop().open(new File("\\\\host\\path with\\spaces.txt")); //fails <shakes fist>
Этот обходной путь работает
Desktop.getDesktop().browse(new URI("file://host/path%20with/spaces.txt")) //works (note slash direction and escape sequences)
Этот обходной путь, кажется, должен работать, но не:
Desktop.getDesktop().browse((new File("\\\\host\\path with\\spaces.txt")).toURI());
Этот обходной путь работает и, по-видимому, является наиболее общей формой:
File curFile = new File("\\\\host\\path with\\or_without\\spaces\\local or network.txt");
Desktop.getDesktop().browse(new URI(curFile .toURI().toString().replace("file:////","file://")));