Java куда поместить файл

Обновлено: 06.07.2024

Автор оригинала: mkyong.

В Java мы можем использовать getResourceAsStream или getResource для чтения файла или нескольких файлов из папки ресурсы или корневого каталога пути к классу.

Метод getResource возвращает URL и обычно преобразует его в Файл ; Не работает в файле JAR .

1. Файлы в ресурсах папка

1.1 Просмотрите файлы в src/main/ресурсы , позже мы получим доступ к файлам и распечатаем содержимое файла.

1.2 По умолчанию инструменты сборки, такие как Maven, Gradle или обычная практика Java, будут копировать все файлы из src/основные/ресурсы в корневой каталог целевые/классы или сборка/классы . Итак, когда мы пытаемся прочитать файл из src/main/ресурсы , мы читаем файл из корневого каталога пути к классам проекта.

1.3 Ниже приведена структура файла JAR. Обычно файлы в папке ресурсы копируются в корневой каталог пути к классу.

2. Получите файл из папки ресурсов.

2.1 Приведенный ниже пример демонстрирует использование getResourceAsStream и getResource методы чтения файла json/файл 1.json из папки ресурсы

  • Метод getResource не работает в файле JAR.
  • Метод getResourceAsStream работает везде.

2.2 Теперь мы упаковываем проект в файл JAR и запускаем его; на этот раз getResource завершится ошибкой и вернет либо Исключение NoSuchFileException , либо Исключение InvalidPathException . Мы не можем прочитать файлы внутри файла JAR по URL-адресу ресурса.

Запустите файл JAR в Linux (Ubuntu), он вызовет Исключение NoSuchFileException .

Запустите файл JAR в Windows, он вызовет Исключение InvalidPathException .

P.S В этом примере используется плагин Maven maven-jar-плагин чтобы создать файл JAR.

3. Получите файл из папки ресурсов – Модульный тест

3.1 Мы помещаем тестовые ресурсы в папку src/test/ресурсы для модульных тестов. Обычно файлы в тестовых ресурсах копируются в папку target/test-classes .

3.2 Это работает так же, как мы читаем файл из src/main/ресурсы . Мы используем то же самое getResourceAsStream и getResource методы чтения файла из src/test/ресурсов .

4. Получите все файлы из папки ресурсов. (Среда, ОТЛИЧНАЯ от JAR)

Если мы не знаем точного имени файла и хотим прочитать все файлы, включая файлы вложенных папок из папки ресурсов, мы можем использовать NIO Файлы.перейдите , чтобы легко получить доступ к файлам и прочитать их.

4.1 В приведенном ниже примере используются Файлы.пройдите чтобы прочитать все файлы из папки src/основные/ресурсы/json :

4.2 Однако стандартные Файлы.прогулка в примере 4.1 не удается получить доступ к файлам в файле JAR напрямую, попробуйте запустить пример 4.1 в среде JAR, и он выдает Исключение FileSystemNotFoundException .

Если я создаю приложение в Eclipse с использованием Java и хочу, чтобы это приложение читало из txt-файла, где я должен поместить текстовый файл в пакете, чтобы не указывать его путь (чтобы я мог просто сказать " file.txt "). Думал, что он должен был зайти в папку src, но не работает.

Щелкните правой кнопкой мыши папку проекта и выберите «Создать» -> «файл». Файл будет в папке проекта, а не в исходной папке.

Как упоминалось выше @tschaible, рабочий каталог Eclipse по умолчанию находится в корне проекта. Поэтому программа будет искать файл с корневого уровня.

Однако, если вы намереваетесь запускать программу из командной строки, она действует иначе, поскольку рабочий каталог по умолчанию соответствует папке, из которой вы запускаете java-файл (также известной как папка src). Поэтому важно помнить об этом несоответствии при тестировании Java-программы из командной строки.

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

Если вы не хотите указывать путь и хотите открыть файл из файловой системы с помощью API java.io.File, поместите его в рабочий каталог.

В Eclipse рабочий каталог по умолчанию является корневым уровнем вашего проекта, но вы можете изменить его (а также проверить, что он установлен) в конфигурации запуска Eclipse. Они доступны в пункте меню «Выполнить> Выполнить конфигурации . », а настройка рабочего каталога находится на вкладке «Аргументы» для программ Java.

Это можно сделать с помощью .getResourceAsStream ("file.txt")

Проголосовали за правильный ответ? Странно .

Поместите файл в папку, из которой вы запускаете приложение Java (текущая / рабочая папка). Если вы используете настройки Eclipse по умолчанию для запуска вашего приложения, вы должны поместить файл непосредственно в папку проекта Eclipse. Чтобы создать файл в проекте Eclipse, вы можете просто перетащить его туда или щелкнуть правой кнопкой мыши проект Eclipse и создать новый файл.

Чтобы работать с файлами, есть шикарный утилитный класс — java.nio.file.Files . У него есть методы просто на все случаи жизни. Все методы этого класса статические и работают с объектами типа Path. Методов очень много, поэтому мы рассмотрим только основные:

Метод Описание
Создает новый файл с путем path
Создает новую директорию
Создает несколько директорий
Создает временный файл
Создает временную директорию
Удаляет файл или директорию, если она пуста
Копирует файл
Перемещает файл
Проверяет, что путь — это директория, а не файл
Проверяет, что путь — это файл, а не директория
Проверяет, что объект по заданному пути существует
Возвращает размер файла
Возвращает все содержимое файла в виде массива байт
Возвращает все содержимое файла в виде строки
Возвращает все содержимое файла в виде списка строк
Записывает в файл массив байт
Записывает в файл строку
Возвращает коллекцию файлов (и поддиректорий) из заданной директории

2. Создание файлов и директорий

Файлы и директории создавать очень просто. Убедимся на примерах:

Код Примечание
Создает файл
Создает директорию
Создает директорию и все нужные поддиректории, если их не существует.

3. Копирование, перемещение и удаление

Копировать, перемещать и удалять файлы так же легко. На директории это тоже распространяется, но они должны быть пустые.

Код Примечание
Копирует файл
Перемещает и переименовывает файл
Удаляет файл

4. Проверка типа файла и факта существования

Когда у вас есть какой-то путь, полученный извне, вы бы хотели знать, это файл или директория. Ну и вообще: существует такой файл/директория или нет?

Для этого тоже есть специальные методы. Так же можно легко узнать длину файла:

Код Примечание

5. Работа с содержимым файла

И наконец, есть целая серия методов, которые позволяют легко прочитать или записать содержимое файла. Пример:

У меня есть файл свойств, содержащий имя файла, только file=fileName.dat . Я поместил файл свойств в путь класса и мог правильно прочитать имя файла (file.dat) из него в mainClass . После прочтения имени файла я передал имя файла (просто имя не путь) в другой класс под пакетом, скажем pack.myClass , чтобы прочитать этот файл. Но проблема в том, что pack.myClass не смог правильно получить путь к файлу. Я поместил файл fileName.dat внутри и снаружи пакета pack , но не смог заставить его работать.

Кто-нибудь может предложить мне, где положить файл fileName.dat , чтобы я мог его правильно прочитать, и все приложение было бы переносимым.

Код, который я использую, чтобы прочитать файл конфигурации и получить имя файла:

Затем в myClass , который находится под пакетом с именем pack , я делаю:

При использовании относительного имени файла, такого как fileName.dat , вы запрашиваете файл с этим именем в текущем каталоге. Текущий каталог не имеет ничего общего с пакетами. Это каталог, из которого запускается JVM.

Итак, если вы находитесь в каталоге c:\foo\bar при запуске приложения (используя java -cp . pack.MyClass ), он будет искать файл c:\foo\bar\fileName.dat .

.. для последней строки, если main находится в myClass загрузчик классов, доступный в main() , часто будет загрузчиком класса bootstrap, в отличие от класса-загрузчика, предназначенного для ресурсов приложения.

В большинстве случаев было бы лучше искать "fileName.dat" где-то в папке "user.home" , которая является системным свойством, Сначала создайте путь File из "user.home" , а затем попробуйте найти там файл. Это немного догадка, поскольку вы не предоставляете точное имя приложения, но это будет наиболее распространенное место.

В настоящее время вы читаете текущую папку, которая определяется

Class.getResource будет искать в вашем каталоге пакетов файл с указанным именем.

Или getResourceAsStream иногда более удобен, так как вы, вероятно, хотите прочитать содержимое ресурса.

Читайте также: