Як читати файл із відносного шляху в проекті Java? java.io.File не може знайти вказаний шлях


113

У мене є проект з 2 пакетами:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

У пакеті (2) у мене є текстовий файл ListStopWords.txt, у пакеті (1) у мене клас FileLoadder. Ось код у FileLoader:

File file = new File("properties\\files\\ListStopWords.txt");

Але майте цю помилку:

The system cannot find the path specified

Чи можете ви дати рішення, щоб його виправити? Дякую.


12
Ваші обидва приклади пакету однакові. Чи не означає properties.filesдля 2?
BalusC

Відповіді:


173

Якщо він вже є у classpath, то просто отримайте його з classpath, а не з файлової системи диска. Не спішись із відносними шляхами в java.io.File. Вони залежать від поточного робочого каталогу, над яким ви повністю не маєте контролю зсередини коду Java.

Припустимо, що ListStopWords.txtце той самий пакет, що і ваш FileLoaderклас, тоді виконайте:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

Або якщо все, що ви, в кінцевому рахунку, насправді є InputStreamцим:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

Це, безперечно, перевагу над створенням, new File()оскільки це urlможе не обов'язково представляти шлях до файлової системи диска, але він також може представляти шлях віртуальної файлової системи (що може статися, коли JAR буде розширено в пам'яті замість тимчасової папки в файловій системі диска) або навіть мережевий шлях, який не може бути визначений Fileконструктором за визначенням .

Якщо файл - як назви назви пакету - насправді є повноцінним файлом властивостей (містить key=valueрядки) з просто "неправильним" розширенням, то ви можете InputStreamнегайно подати load()метод.

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

Примітка. Коли ви намагаєтесь отримати доступ до нього з внутрішнього staticконтексту, використовуйте FileLoader.class(або що завгодно YourClass.class) замість getClass()наведених вище прикладів.


Чи було FileLoader видалено з Java? Я намагаюся зробити це зі статичного контексту (java 6), і я не можу знайти жодного способу імпортувати його, і він постійно говорить мені, що він не може вирішити тип. Як не дивно, він автоматично завершився, коли я його набрав, але потім перейшов до помилки.
турбо

2
о, це повинен бути ClassLoader.class.
турбо

4
@turbo: FileLoaderвласний власний клас OP. Це повинен бути саме той клас, в якому ви намагаєтеся отримати ресурс. Таким чином, так NameOfYourCurrentClass.class.getResourceAsStream(...). Не ClassLoader.classвдасться, якщо ClassLoaderклас завантажується іншим завантажувачем класів, що може статися в додатку "підприємство" з ієрархією декількох завантажувачів (наприклад, веб-додаток Java EE).
BalusC

Ой, бачу. Я не розумів, що це залежить. Дякуємо, що очистили це!
турбо

10
Будь-яка пропозиція, якщо файл не в одному пакеті? У моєму випадку я намагаюся відкрити файл, який знаходиться в тестовому пакеті.
Робін Ньюхаус

44

Наступний рядок може бути використаний, якщо ми хочемо вказати відносний шлях до файлу.

File file = new File("./properties/files/ListStopWords.txt");  

3
чи можу я знати, чому 3 косої між стежкою.
MSNaidu

Помилка:> Неправомірний символ втечі в прямому рядку.
ІгорГанапольський

Як перетворити це на InputStream?
ІгорГанапольський

1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
Камерон Хадсон

42

Відносний шлях працює в Java, використовуючи. оператор.

  • . означає таку саму папку, що й поточний контекст.
  • .. означає батьківську папку поточного запущеного контексту.

Тож питання полягає в тому, як ти знаєш шлях, куди зараз дивиться ява?

зробіть невеликий експеримент

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

Спостерігаючи за результатами, ви дізнаєтесь поточний каталог, де шукає Java. Звідти просто скористайтеся оператором ./, щоб знайти свій файл.

наприклад, якщо вихідний

G: \ JAVA8Ws \ MyProject \ вміст.

і ваш файл присутній у папці MyProject просто використовуйте

File resourceFile = new File("../myFile.txt");

Сподіваюся, це допомагає


після години пошуку цієї відповіді забезпечив мені рішення
erdostamasa

8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}

1
@IgorGanapolsky це ім'я Класу. Ви можете звернутися до .classбуквального, лише вказавши повну назву його класу.
Томаш Муларчик

Я думаю, що він має намір стати FileLoader.
jamesdeath123


5

Я міг би прокоментувати, але у мене менше представників цього. Відповідь Самрата зробила роботу за мене. Краще побачити поточний шлях до каталогу через наступний код.

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

Я просто використовував це для усунення проблеми, з якою я стикався в своєму проекті. Обов’язково використовуйте ./ для повернення до батьківського каталогу поточного каталогу.

    ./test/conf/appProperties/keystore 

Я запускаю свій код через tomcat, і тому поточний каталог не є папкою проекту - Як я можу визначити відносний шлях до кореня проекту? На даний момент я використовую важкий шлях: "C: \\ Користувачі \\ користувач \\ Настільний \\ Репозиторії \\ L1_WebShop \\ dblogs.log";
Тіаго

@TiagoRedaelli перевірити це Ques: stackoverflow.com/questions/12843217 / ...
dezible

4

Хоча відповідь, надана BalusC, працює в цьому випадку, вона порушиться, коли шлях файлу містить пробіли, оскільки в URL-адресі вони перетворюються на% 20, що не є дійсним ім'ям файлу. Якщо ви створюєте об'єкт File за допомогою URI, а не String, білі простори будуть оброблятися правильно:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());

2

Я хотів проаналізувати 'command.json' всередині src / main // js / Simulator.java. Для цього я скопіював файл json у папку src і дав абсолютний шлях таким чином:

Object obj  = parser.parse(new FileReader("./src/command.json"));

2

введіть тут опис зображення

Припускаючи, що ви хочете читати з resourcesкаталогу в FileSystemкласі.

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

Примітка: Провідні .не потрібні.


1

Для мене насправді проблема полягає в тому, звідки йде шлях до класу об'єкта File <project folder path> or ./src, тому використовуйте File file = new File("./src/xxx.txt");вирішену мою проблему


0

String basePath = новий файл ("myFile.txt"). GetAbsolutePath (); цей базовий шлях ви можете використовувати як правильний шлях вашого файлу


-1

Якщо ви намагаєтеся зателефонувати getClass()зі статичного методу чи статичного блоку, ви можете зробити наступний спосіб.

Ви можете зателефонувати getClass()на Propertiesоб’єкт, в який ви завантажуєтесь.

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

Просто не вистачає завершальної цитати.
jamesdeath123

-1

Якщо текстовий файл не читається, спробуйте скористатися більш близьким абсолютним шляхом (якщо ви хочете, щоб ви могли використовувати повний абсолютний шлях) таким чином:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

припустимо, що абсолютний шлях дорівнює:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.