2012-06-25 2 views
3

У меня есть список файлов в каталоге по пути к классам, который мне нужно прочитать, и предпочтет использовать File API, но, похоже, я не могу сделать это в архиве. Это работает на моем локальном модульном тесте окружающей среды, но когда я раскрываю как WAR внутри уха, список файлов возвращается нулевое значение:В Java можно получить список файлов каталога в пути пути WAR, используя путь ресурса?

File dir = new File(getClass().getClassLoader().getResource("mydir").getPath()); 
File[] files = dir.listFiles(); 
+0

Как получить список файлов из потока ввода? Я не знаю их имен, поэтому мне нужен список реальных объектов File. –

ответ

2

Вы не можете использовать File API, если война не распакована, но вы можете использовать API-интерфейс Servlet.

Метод ServletContext getResourcePaths может быть использован для получения всех членов «директории», а затем getResource или getResourceAsStream для извлечения содержимого файла в каталоге.

for (String s : context.getResourcePaths("foo")) { 
    InputStream contents = context.getResourceAsStream(s); 
    //do something with the contents 
} 
+0

Я думал, что это может быть так. В любом случае, знаете ли вы, где в документах Java это указано (в отношении списка файлов для распакованной WAR)? –

+0

Нигде явно (что я знаю) в javadoc. Это следствие того, что движок сервлета не обязан размещать содержимое WAR в файловой системе вообще. Этот самородок упоминается в сервлете JSR, но у меня нет конкретной цитаты в javadoc для вас - не все в javadoc. –

0

Если вы используете Java SE 7 попытка:

Path jarPath = Paths.get(...); 
try (FileSystem jarFS = FileSystems.newFileSystem(jarPath, null)) { 
    Path dirJarPath = jarFS.getPath("/foo/mydir"); 
    <use a FileVisitor and Files.walkFileTree> 
} 

http://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitor.html

+0

Извините, я отредактировал сообщение, чтобы добавить тег для JDK 1.6. –

+0

@Puce: Как бы вы даже получили путь к файлу jar, когда ухо, содержащее войну, не распаковано? Делать это в переносном стиле не совсем просто. Даже если бы это было так, я беспокоюсь, что многократное разжатие файла jar не будет очень результативным. –

+0

@SeanReilly Недавно я добавил утилиту в библиотеку Utility SoftSmithy, чтобы получить банку класса, но я еще не выпустил ее. Вы можете найти здесь код (лицензия: CDDL): http://softsmithy.hg.sourceforge.net/hgweb/softsmithy/lib/main-golden/file/058faa0f7621/lib-core/src/main/java/org/ softsmithy/lib/nio/file/JarFiles.java О производительности: вам нужно будет профилировать ее, если есть проблема – Puce

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