2015-12-15 3 views
2

У меня есть проект Maven, в котором у меня есть класс SomeClass в src/main/java, который должен считывать файл, расположенный в src/main/resources.Задание общего пути к файлу для работы с jar-файлом

Это был мой первый подход:

private static void someMethod() { 
    // ... [context] ... 
    String fileName = "src/main/resources/some_file.txt"; 
    for(String line : Files.readAllLines(Paths.get(fileName))) { 
    System.out.println(line); 
    } 
} 

Это отлично работает при запуске на консоли затмений, но это не делает, когда я исполняю Jar-файл (произведенный Maven) на консоли Windows (IOException выбрасывается).

Я думал, что это нужно сделать с пути к файлу, так что я изменил код так:

private static void someMethod() { 
    // ... [context] ... 
    String fileName = "C:/Users/.../workspace/.../src/main/resources/some_file.txt"; 
    for(String line : Files.readAllLines(Paths.get(fileName))) { 
    System.out.println(line); 
    } 
} 

Это работает на обоих, консоль Eclipse- и для Windows. Но ясно, что это не сработает на другой машине.

После поиска я изменил статический метод, чтобы быть не статическую, и используется ClassLaoder для получения файла:

private void someMethod() { 
    // ... [context] ... 
    ClassLoader cL = getClass().getClassLoader(); 
    File file = new File(cL.getResource("some_file.txt").getFile()); 
    for(String line : Files.readAllLines(Paths.get(file.getPath()))) { // or getAbsolutePath() 
    System.out.println(line); 
    } 
} 

Это один работает на консоли Eclipse, и когда я System.out.println(file.getPath) он распечатывает правильный путь. Но это не работает на консоли Windows. При выполнении JAR-файл, я получаю это:

Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <:> at index 4: file:\C:\Users\...\target\...-SNAPSHOT.jar!\some_file.txt 
at sun.nio.fs.WindowsPathParser.normalize(Unknown Source) 
at sun.nio.fs.WindowsPathParser.parse(Unknown Source) 
at sun.nio.fs.WindowsPathParser.parse(Unknown Source) 
at sun.nio.fs.WindowsPath.parse(Unknown Source) 
at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source) 
at java.io.File.toPath(Unknown Source) 
... 

Так, долго истории сократить короткий: как я могу указать файл-путь, так что банка-файл, созданный с помощью Maven построить Выполняет правильно, независимо от платформы, на которой он работает?

ответ

6

Поскольку вы пытаетесь прочитать из ресурса пути к классу (то есть ресурса, который не находится в файловой системе, но встроен в банку, как указано src/main/resources), вы не можете использовать Files.lines. Java NIO.2 Path не может использоваться для ресурса внутри JAR.

Вместо этого вам необходимо использовать InputStream. Чтобы прочитать все строки из файла, вы можете обернуть его в BufferedReader. Предполагая, что этот код находится внутри класса SomeClass, вы могли бы иметь следующее (Java 8):

try (BufferedReader br = new BufferedReader(new InputStreamReader(SomeClass.class.getResourceAsStream("/some_file.txt")))) { 
    br.lines().forEach(System.out::println); 
} 
+0

О парень, я не собирался спать ночью. Спасибо .... Это идеальное решение для Java 8. – Farah

Смежные вопросы