Java чтение файлов куда располагать в проекте
Пакет java.io содержит почти каждый класс, который может потребоваться Вам для совершения ввода и вывода в Java. Все данные потоки представлены потоком ввода и адресом вывода. Поток в пакете java.io осуществляет поддержку различных данных, таких как примитивы, объекты, локализованные символы и т.д.
Содержание
Потоки
Потоки в Java определяются в качестве последовательности данных. Существует два типа потоков:
- InPutStream – поток ввода используется для считывания данных с источника.
- OutPutStream – поток вывода используется для записи данных по месту назначения.
Java предоставляет сильную, но гибкую поддержку в отношении ввода/вывода, связанных с файлами и сетями, однако в данном руководстве рассмотрены лишь базовые функции, связанные с потоками и вводом/выводом. Рассмотрим далее по порядку наиболее распространенные примеры.
Байтовый поток
Примечание по примеру: чтобы скопировать файл, необходимо в папке проекта создать файл file.txt с любым или пустым содержимым.
Пример
Теперь рассмотрим файл file.txt со следующим содержимым:
В качестве следующего шага необходимо скомпилировать java-программу и выполнить ее, что позволит создать файл copied_file.txt с тем же содержимым, что имеется в file.txt. Таким образом, разместим обозначенный код в файле FileCopy.java и выполним следующее действие:
Символьные потоки
Мы можем переформулировать представленный выше пример, в котором два данных класса используются для копирования файла ввода (с символами юникода) в файл вывода.
Примечание по примеру: чтобы скопировать файл, необходимо в папке проекта создать файл file.txt с любым или пустым содержимым.
Пример
Теперь рассмотрим файл file.txt со следующим содержимым:
В качестве следующего шага необходимо скомпилировать программу и выполнить ее, что позволит создать файл copied_file.txt с тем же содержимым, что имеется в file.txt. Таким образом, разместим обозначенный код в файле FileCopy.java и выполним следующее действие:
Стандартные потоки
Все языки программирования обеспечивают поддержку стандартного ввода/вывода, где программа пользователя может произвести ввод посредством клавиатуры и осуществить вывод на экран компьютера. Если вы знакомы с языками программирования C либо C++, вам должны быть известны три стандартных устройства STDIN, STDOUT и STDERR. Аналогичным образом, Java предоставляет следующие три стандартных потока:
Ниже представлена простая программа, которая создает InputStreamReader для чтения стандартного потока ввода, до введения пользователем "q":
Пример
Разместим представленный выше код в файле ReadConsole.java и попробуем скомпилировать и выполнить его согласно тому, как это представлено в следующей программе. Данная программа продолжает чтение и вывод одного и того же символа до нажатия 'q':
Чтение и запись файла
Как было указано выше, поток представляет собой последовательность данных. InputStream используется для считывания данных с источника, OutputStream служит для записи данных по месту назначения.
Ниже представлена иерархия классов для управления потоками Ввода и Вывода.
В данном уроке нам предстоит рассмотреть два важных потока: FileInputStream и FileOutputStream.
Поток FileInputStream – чтение из файла
Поток FileInputStream – это поток, который используется в Java для чтения данных из файла. Объекты могут быть созданы при использовании ключевого слова new, доступны несколько типов конструкторов.
Представленный конструктор использует имя файла в качестве потока с целью создания объекта входного потока для считывания файла:
Представленный ниже конструктор использует объектный файл с целью создания объекта входного потока для чтения файла. Сперва мы создаем объектный файл при использовании метода File() следующим образом:
Теперь, получив объект InputStream, следует ознакомиться со следующим перечнем вспомогательных методов, которые могут быть использованы для считывания потока либо выполнения иных операций в потоке.
№ | Метод и описание |
1 | public void close() throws IOException<> Данный метод в Java закрывает выходной файловый поток. Освобождает какие-либо системные ресурсы, связанные с файлом. Выдает IOException. |
2 | protected void finalize()throws IOException <> Данный метод выполняет очистку соединения с файлом. Позволяет удостовериться в вызове закрытого метода данного выходного файлового потока при отсутствии каких-либо ссылок на данный поток. Выдает IOException. |
3 | public int read(int r)throws IOException<> Данный метод осуществляет в Java считывание заданных байтов данных из InputStream. Возврат данных типа int. Возврат следующего байта данных, в конце файла будет произведен возврат к -1. |
4 | public int read(byte[] r) throws IOException<> Данный метод производит считывание байтов r.length из входного потока в массив. Возврат общего числа считанных байтов. В конце файла будет произведен возврат к -1. |
5 | public int available() throws IOException<> Выдает число байтов, которые могут быть считаны из входного файлового потока. Возврат данных типа int. |
Существуют также другие доступные входные потоки, более детальные сведения о которых представлены по следующим ссылкам:
Поток FileOutputStream – создание и запись файла
Поток FileOutputStream – это поток, который используется в Java для создания файла и последующей записи в него. Поток создаст файл в случае его отсутствия перед его открытием для вывода.
Далее представлены два конструктора, которые могут быть задействованы при создании объекта FileOutputStream.
Представленный конструктор использует имя файла в качестве строки с целью создания объекта входного потока для записи файла в Java:
Представленный ниже конструктор использует объектный файл с целью создания объекта выходного потока для записи файла. Сперва мы создаем объектный файл при использовании метода File() следующим образом:
Теперь, получив объект OutputStream, следует ознакомиться со следующим перечнем вспомогательных методов, которые могут быть использованы для записи потока либо выполнения иных операций в потоке.
№ | Метод и описание |
1 | public void close() throws IOException<> Данный метод в Java закрывает выходной файловый поток. Освобождает какие-либо системные ресурсы, связанные с файлом. Выдает IOException. |
2 | protected void finalize()throws IOException <> Данный метод выполняет очистку соединения с файлом. Позволяет удостовериться в вызове закрытого метода данного выходного файлового потока при отсутствии каких-либо ссылок на данный поток. Выдает IOException. |
3 | public void write(int w)throws IOException<> Данный метод осуществляет запись заданного байта в выходной поток. |
4 | public void write(byte[] w) Запись байтов w.length из указанного массива байтов в OutputStream. |
Существуют также другие доступные выходные потоки, более детальные сведения о которых представлены по следующим ссылкам:
Пример
В следующем примере представлены InputStream и OutputStream – потоки для чтения, создания и записи файла:
Представленный выше java-код создаст файл file.txt и пропишет заданные символы в формате char. То же самое будет выводиться на экран стандартного вывода.
Навигация по файловой системе и вводу/выводу
Существует ряд других классов, которые нам предстоит рассмотреть с целью ознакомления с основами навигации в файловой системе и вводу/выводу.
Каталоги в Java
В Java каталог представлен Файлом, который может содержать список других файлов и каталогов. Используя объект File, вы можете создать каталог, прокрутить список файлов, представленных в каталоге. Для получения более детальных сведений, ознакомьтесь с перечнем всех методов, которые могут быть вызваны из объекта File, будучи связанными с каталогами.
Создание каталогов
Существуют два служебных метода File, которые могут быть использованы для создания каталогов:
- Метод mkdir() позволяет создать папку в Java, возвращая значение true при успехе операции, и false в случае сбоя. Сбой свидетельствует о том, что путь указанный в объекте File уже существует, либо что каталог не может быть создан в связи с тем, что полный путь еще не существует.
- Метод mkdirs() создает каталог и все вышестоящие каталоги.
В следующем примере представлено создание папки "/java/proglang/newdir":
Пример
Скомпилируйте и выполните следующий код для создания каталога "/java/proglang/newdir".
Примечание ? Java автоматически формирует разделители пути в UNIX и Windows с учетом соглашений. При использовании косой черты (/) при работе с Java в системе Windows, производится корректное разрешение пути.
Список файлов в папке
Метод list(), представленный объектом File, может быть использован для предоставления перечня всех файлов и каталогов, имеющихся в заданной папке, в следующем виде:
Пример
Вследствие этого будет получен следующий результат, основанный на каталогах и файлах, доступных в вашем каталоге /NetBeans 8.2/Projects/ReadDirectory/ReadDirectory/:
Можно прописать абсолютный путь к файлу, скажем вот так:
Насколько я понимаю, так делать совсем плохо, ибо мы не знаем, куда пользователь сохранит нашу программу.
Можно прописать относительный путь к файлу, скажем вот так:
Но тогда (если только я правильно понял из проделанных экспериментов) чтобы получить полный путь к файлу JVM делает "конкатенацию" текущей директории с прописанным относительным путём. Т.е. если я запускаю программу такой командой:
То JVM будет искать файл по такому расположению:
Насколько я понимаю, так делать совсем плохо, ибо мы не знаем, с какой директории будет запускать пользователь нашу программу.
Можно делать что-то вообще интересное и непростое, типа такого:
Здесь поиск файла будет происходить из пакета, где находится класс this.getClass() . (т.е. та самая "конкатенация" происходит с путём к пакету класса)
Но ведь наверное плохо мешать файлы классов с файлами ресурсов?
Здесь поиск файла происходит в директориях classpath . Но по идее, тогда может оказаться несколько подходящих файлов? И что же это будет?!
В общем вопросы: Правильно ли то, что я написал? Какие ещё способы существуют? Когда какой способ использовать? Какой способ наилучший (если он существует)?
723 1 1 золотой знак 7 7 серебряных знаков 23 23 бронзовых знака intellij idea лучше всего так Run -> Edit configuration -> working derictory(указать рабочую директорию) Хранить изображения и другие ресурсы не нуждающиеся в редактировании внутри JAR - нормальная практика. Обычно создают отдельный каталог images на одном уровне с корнем пакета, либо копируют его туда при сборке JAR.Общим ответом на это будет просто слово "зависит" - главный вопрос в том, с чем вы работаете. Как правило, java-приложения распространяются в виде jar-архивов, и если у вас есть распространяемые с приложением ресурсы (например, иконки), то они должны либо оказаться именно там, среди классов, либо, если вы распространяете приложение в виде архива и отдельных ресурсов снаружи архива, то вам нужно самому находить расположение jar-файла и вручную восстанавливать путь к ресурсом по аналогии с working directory. В случае, если вы пишете некоторую утилиту, которая обрабатывает аргументы, то вам, скорее всего, придется иметь дело из абсолютными, и с относительными путями - если вы пишете, скажем, ресайзер изображений, то вызов java -jar path/resizer.jar image.jpg 300x400 потребует простого проброса аргумента внутрь ImageIcon напрямую, без вообще какого-либо анализа.
Другими словами, все описанные методы имеют свое применение, и являются более или менее предпочтительными в зависимости от ситуации; каждый из них не чем-то плох, а неприменим в текущей ситуации. Если вопрос заключается в поиске ресурсов приложения, то лучше всего либо закидывать в jar, либо искать место установки приложения и отсчитывать от него (т.к. working dir может оказатсья любым).
Автор оригинала: 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 .
Каждое приложение, программа имеют возможности записи чего-либо в файл. В данном уроке я продемонстрирую как можно записать какие-то данные в файл, а потом считать их оттуда.
Какие проблемы мы будем решать в этом уроке?
Подготовительные работы
Создадим простой проект, не обязательно Maven проект, так как нам не потребуется не каких дополнительных библиотек.
После того как вы создали проект, создайте класс WorkInFile.java и напишите туда стандартную конструкцию main:
Теперь создадим класс который будет иметь методы для работы с файлами, а назовем его FileWorker.java все методы в нем которые не есть private будут статическими для того чтобы мы получали к ним доступ без экземпляра этого класса.
Как записывать в файл?
В классе FileWorker.java создадим статический метод который будет осуществлять запись в файл и назовем этот метод write(String text; String nameFile):
Обратите особое внимание на то, что после записи каких либо данных в файл мы должны его закрыть, только после этого действия данные запишутся в файл.
2. Как читать файл?
Теперь в классе FileWorker создадим метод для чтения файла, также статический:
Также если файла нет то метод выкинет Exception.
Для проверки на существование файла создадим метод, так как нам еще потребуется эта проверка в следующих методах:
Теперь проверим его:
В первом случае когда файл не существует мы получим это:
Во втором случае, мы получим содержимое файла в виде строки. (для этого закомментируйте первый случай)
3. Как обновить файл?
Как такого Update для файлов нет, но способ обновить его есть, для этого можно его перезаписать.
Давайте создадим метод update в классе FileWorker:
Тут мы считываем старый файл в StringBuilder после чего добавляем к нему новый текст и записываем опять. Обратите внимание что для этого мы используем наши методы.
В результате обновления файла:
4. Как удалить файл?
В тот же наш утилитный класс FileWorker добавим метод delete, он будет очень простым так как у объекта File уже есть метод delete():
Читайте также: