Не удается запустить файл в сети с помощью 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://")));
Другие вопросы по тегам