Я должен считать текстовый файл, когда я запускаю свою программу. Я использую затмение и запустил новый проект Java. В моей папке проекта я получил "src" папку и стандарт "Системная библиотека JRE" + staedteliste.txt... Я просто не знаю, куда поместить текстовый файл. Я буквально попробовал каждую папку, я мог думать прочь.... Я не могу использовать "твердый кодированный" путь, потому что текстовый файл должен быть включен с моим приложением...
Я использую следующий код для чтения файла, но я получаю эту ошибку:
Error:java.io.FileNotFoundException:staedteliste.txt(No such file or directory)
public class Test {
ArrayList<String[]> values;
public static void main(String[] args) {
// TODO Auto-generated method stub
URL url = Test.class.getClassLoader().getResource("src/mjb/staedteliste.txt");
System.out.println(url.getPath()); // I get a nullpointerexception here!
loadList();
}
public static void loadList() {
BufferedReader reader;
String zeile = null;
try {
reader = new BufferedReader(new FileReader("src/mjb/staedteliste.txt"));
zeile = reader.readLine();
ArrayList<String[]> values = new ArrayList<String[]>();
while (zeile != null) {
values.add(zeile.split(";"));
zeile = reader.readLine();
}
System.out.println(values.size());
System.out.println(zeile);
} catch (IOException e) {
System.err.println("Error :"+e);
}
}
}
Сначала спросите себя: является ли ваш файл внутренним компонентом вашего приложения? (Обычно это означает, что он упакован в ваш JAR или WAR, если это веб-приложение; обычно это какой-то файл конфигурации или статический ресурс, доступный только для чтения).
Если да, вы не хотите указывать абсолютный путь для файла. Но вы также не хотите обращаться к нему с помощью относительного пути (как ваш пример), потому что Java предполагает, что этот путь относительно « текущего каталога ». Обычно предпочтительный способ для этого сценария - загрузить его относительно пути к классам .
Java предоставляет для этого метод classLoader.getResource () . И Eclipse (в обычной настройке) предполагает, что src /
находится в корне вашего пути к классам, поэтому после компиляции он копирует все в ваш выходной каталог ( bin /
) , файлы java в скомпилированной форме ( .class
), все остальное как есть.
Так, например, если вы поместите свой файл в src / Files / myfile.txt
, он будет скопирован во время компиляции в bin / Files / myfile.txt
; а во время выполнения bin /
будет в (корне) вашего пути к классам. Итак, вызвав getResource ("/ Files / myfile.txt")
(в некоторых его вариантах), вы сможете его прочитать.
Отредактировано : Кроме того, если ваш файл концептуально привязан к классу Java (например, некоторый com.example.MyClass
имеет связанный файл конфигурации MyClass.cfg
) , вы можете использовать метод getResource () из класса и использовать относительный путь (ресурса): MyClass.getResource ("MyClass.cfg")
. Затем файл будет найден в пути к классам, но с предварительно добавленным пакетом класса. Таким образом, в этом сценарии вы обычно помещаете файлы MyClass.cfg
и MyClass.java
в один и тот же каталог.
Один из возможных путей -
Используйте загрузчик ресурсов, чтобы найти файл:
URL url = Test. class.getClassLoader (). getResource ("myfile.txt");
System.out.println (url.getPath ());
...
В зависимости от имени пакета класса Java вы, вероятно, будете на 4 или 5 уровней ниже по структуре каталогов.
Если ваш пакет класса Java, например, com.stackoverflow.project, то ваш класс находится в src / com / stackoverflow / project.
Вы можете либо переместить вверх по структуре каталогов с несколькими ../
, либо вы можете переместить текстовый файл в тот же пакет, что и ваш класс. Было бы проще переместить текстовый файл.
Предположим, у вас есть проект под названием "TestProject" в Eclipse, и папка вашего рабочего пространства находится по адресу E:/eclipse/workspace. Когда вы собираете проект Eclipse, ваш classpath будет e:/eclipse/workspace/TestProject
. Когда вы пытаетесь прочитать "staedteliste.txt", вы пытаетесь получить доступ к файлу по адресу e:/eclipse/workspace/TestProject/staedteliste.txt
.
Если вы хотите иметь отдельную папку для своего проекта, то создайте папку Files в TestProject, а затем обратитесь к файлу по (относительному пути) /Files/staedteliste.txt
. Если вы поместите файл в папку src, то вам придется обращаться к нему с помощью /src/staedteliste.txt
. Папка Files внутри папки src будет иметь вид /src/Files/staedteliste.txt
Вместо относительного пути можно использовать абсолютный, добавив e:/eclipse/workspace/
в начале, но использование относительного пути лучше, потому что вы можете перемещать проект, не беспокоясь о рефакторинге, пока структура папок проекта остается прежней.
Вероятно, вам стоит взглянуть на различные варианты getResource в классе ClassLoader: http://java.sun.com/j2se/1.4.2/docs/api/ java / lang / ClassLoader.html