2010-08-25 2 views
0

У меня есть проект Java, который имеет эту файловую структуру (как показано в Eclipse):файлы больше не читаемым

ProjectName 
+- Deployment Descriptor: ProjectName 
¦- Java Resources:src 
    ¦- Package1 
     -MyClass.java 
¦- FileFolder 
    -MyFile.txt 

и до сих пор от MyClass я могу читать MyFile.txt с помощью:

try 
{ 
    reader = new BufferedReader(new FileReader(new File("FileFolder/MyFile.txt"))); 

while((line=reader.readLine())!=null) 
{ 
    line=line.trim(); 
    myVector.add(line); 
} 
reader.close(); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

Но когда я помещал Package1 в динамический веб-проект и папку FileFolder в корневой каталог, файл больше не найден.

Кто-нибудь знает, как читать файл?

Заранее благодарен!

ответ

1

Динамические веб-проекты генерируют файлы WAR.

Сервер может или не может расширить WAR-файл обратно в структуру файловой системы.

Лучше всего использовать Class или ClassLoader .getResourceAsStream("/FileFolder/MyFile.txt"), который может читать файлы из файлов JAR/WAR и возвращает InputStream.

Пример:

reader = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/FileFolder/MyFile.txt"))); 

Edit: Если это из Servlet, рассмотреть возможность использования gawi's answer вместо этого.

Редактировать 2: Если это метод static, вам необходимо использовать MyClass.class вместо this.getClass(), где MyClass - это имя класса.

+0

Собственно, да. Я обнаружил, что использование getClassLoader для меня работало: String classLocation = MyClass.class.getName(). Replace ('.', '/') + ".class"; Загрузчик ClassLoader = MyClass.class.getClassLoader(); Затем добавьте: try {URL location = loader.getResource (classLocation); } ... чтобы получить локальное расположение URL-адреса класса.Спасибо за короткий ответ !! --- Извините за двойную запись этого комментария. Я не использую сервлет для доступа к файлу. Это стандартный Java-класс, который в свою очередь называется сервлетом, но я не думаю, что это актуально прямо сейчас. – Icarin

0

Вы открываете файл, используя путь к текущему рабочему каталогу. Это вряд ли будет работать в контейнере веб-приложений, потому что текущий рабочий каталог не будет корнем вашего приложения.

Кроме того, файл может быть не в файловой системе, а в файле WAR.

Правильный способ открыть файл в webapp - использовать метод ServletContext.getResourceAsStream().

+0

Интересно, я не знал, что 'ServletContext' имеет' getResourceAsStream'. – Powerlord

+0

Действительно, это способ доступа ко всем ресурсам WAR (даже того, что находится под/WEB-INF /). ServletContext.getResourcePaths() действует как File.list(), поскольку он отображает содержимое каталога. Обратите внимание, что также можно использовать класс File для доступа к файлам в файловой системе, которые находятся за пределами веб-приложения. В последнем случае вы должны использовать абсолютный путь для поиска вашего файла. – gawi

+0

Собственно, да. Я обнаружил, что использование getClassLoader для меня работало: String classLocation = MyClass.class.getName(). Replace ('.', '/') + ".class"; Loader ClassLoader = MyClass.class.getClassLoader(); И затем добавление: try { URL location = loader.getResource (classLocation); } ... , чтобы получить локальное расположение URL-адреса класса. Спасибо за короткий ответ !! – Icarin

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