2013-09-26 2 views
-1

Уважаемые эксперты, этот вопрос связан сфайл, который находится внутри пакета, не открывая из приложения Java

Обновленный Вопрос

И я использовал два кода из:

Следующий код работает нормально, если я запускаю приложение от workspace.

URL resource = Thread.currentThread().getContextClassLoader().getResource("resources/User_Guide.pdf"); 
      File userGuideFile = null; 
      try { 
       userGuideFile = new File(resource.getPath()); 
       if (Desktop.isDesktopSupported()) 
       { 
        Desktop desktop = Desktop.getDesktop(); 
        desktop.open(userGuideFile); 
       } 
      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 

Но если я копирую мой project.jar в другое место, он не открывает файл и показывает в моем журнале как file is not found "c:\workspace\project...pdf". И я использовал следующий код из same page, Мой pdfReader читатель самана показывает исключение file is either not supproted or damaged:

Код:

if (Desktop.isDesktopSupported())  
{  
    Desktop desktop = Desktop.getDesktop();  
    InputStream resource = Thread.currentThread().getContextClassLoader().getResource("resources/User_Guide.pdf"); 
try 
{ 
    File file = File.createTempFile("User_Guide", ".pdf"); 
    file.deleteOnExit(); 
    OutputStream out = new FileOutputStream(file); 
    try 
    { 
     // copy contents from resource to out 
    } 
    finally 
    { 
     out.close(); 
    } 
    desktop.open(file);  
}  
finally 
{ 
    resource.close(); 
} 
} 

Пожалуйста, дайте мне некоторое представление. Ваша помощь будет оценена по достоинству. Thank you

Примечание: Я попытался открыть файл *.txt и работает нормально. Но не работает в PDF и DOC. Основная проблема заключается в том, что я запускаю приложение, меняя каталог рабочего пространства проекта. На самом деле я хочу сделать так: Ntebeans клавиатура-short-code документы, которая находится под Help menu

+0

другое место в пределах одной и той же рабочей области или в другом рабочем пространстве различных компьютерных – SpringLearner

+0

То же компьютер другое место, например: 'мое рабочее пространство внутри E: \ workspace' и скопировать мой файл банку в' D: \ apps'. Я должен распространять свое приложение более чем на 50 компьютеров ... – Yubaraj

+0

Новый путь содержит пробелы? –

ответ

1

Банкомат - это архивный архив. Поэтому сначала просмотрите его с помощью 7zip/WinZip или тому подобного. Проверьте, что в этом пути действительно resources/User_Guide.pdf (с учетом регистра!). В банке вполне может быть /User_Guide.pdf.

Невозможно сразу получить файл (= файл в файловой системе) из ресурса (только случайно). Таким образом, вы получаете InputStream.

InputStream in = getClass().getResource("/resources/User_Guide.pdf"); 

NullPointerException если не найден. С getClass класс должен быть в одном банке, а путь в этом случае начинается с /.

Теперь вы можете скопировать входной поток в некоторый временный файл и открыть его. В Java 7:

File file = File.createTempFile("User_Guide", ".pdf"); 
Files.copy(in, file.toPath()); 

Если вы получаете исключение FileAlreadyExistsException в файлах.копия строки, а затем добавьте следующий CopyOption:

Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING); 

Для Java < 7:

// copy contents from resource to out 
byte[] buf = new byte[4096]; 
while ((int nread = in.read(buf, 0, buf.length)) > 0) { 
    out.write(buf, 0, nread); 
} 
+0

[File.toPath] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#toPath%28%29) существует только с Java 7. Для предыдущая версия, если вы не хотите изобретать колесо, для выполнения таких задач существуют классы apache commons io. –

+0

Спасибо .... Я использую версию 1.6 – Yubaraj

0

у меня нет достаточной репутации прокомментировать принятый ответ Joop Эгген, но линия

InputStream in = getClass().getResource("/resources/User_Guide.pdf"); 

выдает сообщение об ошибке «Несовместимые типы: URL-адрес не может быть преобразован в InputStream». Вместо того, чтобы использовать метод getResourceAsStream():

InputStream in = getClass().getResourceAsStream("/resources/User_Guide.pdf"); 
Смежные вопросы