2015-12-10 3 views
0

У меня есть класс, который считывает файл:Почему моя библиотека не может получить доступ к своим ресурсам?

package classlibrary; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.net.URL; 

public class ReadingResource { 
    public static String readResource() throws IOException { 
     URL resource = ClassLoader.getSystemClassLoader().getResource("classlibrary/test_file.txt"); 
     BufferedReader br = new BufferedReader(new FileReader(resource.getPath())); 
     return br.readLine(); 
    } 
} 

Файл ресурсов находится в том же каталоге, где этот класс. Я создал библиотеку из этого класса и файла.

Теперь я хочу, чтобы использовать его в другом классе:

package uritesting; 

import classlibrary.ReadingResource; 
import java.io.IOException; 

public class URITesting { 
    public static void main(String[] args) throws IOException { 
     System.out.println(ReadingResource.readResource()); 
    } 
} 

Когда я делаю .jar файл из этого класса, установить класс в качестве основного класса, добавьте .jar сверху и выполнить он как «java -jar URITesting.jar» Я получаю исключение FileNotFoundException, говоря, что класс ReadingResource не может найти указанный файл. Это смешно, потому что путь, указанный в сообщении об исключении, на самом деле является правильным путем к файлу.

Файлы here.

EDIT: Я разработал проект в NetBeans. Когда я запускаю его там, он работает нормально. В этом случае путь к классам отличается. Он содержит оба ресурса URITestingProject и ReadingResource.

Однако, когда я запускаю его как автономный JAR, путь к классу содержит только URITestingProject. Что странно для меня, так это то, что он не жалуется на то, что не найдет класс ReadingResource. Это означает, что он загружен, хотя его нет в пути к классу:/

+0

нет 'test_file.txt' в' URITesting.jar'. Вы имеете в виду ClassLibraryTest.jar? – Tobias

+0

Да, я имею в виду ClassLibraryTest.jar. Метод 'ReadingResource.readResource()' должен искать файл 'test_file.txt' в своих собственных ресурсах, то есть в ClassLibraryTest.jar. – gicig

ответ

0

Проблема resource.getPath(). Невозможно рассчитать путь, действительный для чтения файлов, внутри файла jar, на другом сервере и так далее. Однако вы можете получить данные через поток вместо:

InputStream data = ClassLoader.getSystemClassLoader().getResourceAsStream("classlibrary/test_file.txt"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(data, "utf-8")); 

В качестве примечания: При чтении с читателем, это хорошая идея, чтобы указать кодировку: