Java куда поместить файл
Автор оригинала: 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 иногда более удобен, так как вы, вероятно, хотите прочитать содержимое ресурса.
Читайте также: