Как работать с java файлами

Обновлено: 07.07.2024

В этом уроке мы будем читать и записывать файлы на Java с помощью FileReader, FileWriter, BufferedReader, BufferedWriter, FileInputStream, FileOutputStream и т. Д.

Вступление

В этой статье мы погрузимся в Чтение и запись файлов на Java .

При программировании, независимо от того, создаете ли вы мобильное приложение, веб-приложение или просто пишете сценарии, вам часто приходится читать или записывать данные в файл. Эти данные могут быть данными кэша, данными, которые вы получили для набора данных, изображения или практически всем, что вы можете придумать.

В этом уроке мы покажем наиболее распространенные способы чтения и записи файлов на Java.

Java предоставляет несколько API (также известных как Java I/O ) для чтения и записи файлов с момента ее первых выпусков. В последующих выпусках ввод-вывод Java был улучшен, упрощен и расширен для поддержки новых функций.

Прежде чем мы перейдем к некоторым реальным примерам, это поможет понять доступные вам классы, которые будут обрабатывать чтение и запись данных в файлы. В следующих разделах мы дадим краткий обзор классов ввода-вывода Java и объясним, что они делают, затем мы рассмотрим потоки Java NIO и, наконец, покажем некоторые примеры чтения и записи данных в файлы.

Потоки ввода-вывода

Существует два типа потоков, которые вы можете использовать для взаимодействия с файлами:

Для каждого из вышеперечисленных типов потоков существует несколько вспомогательных классов, поставляемых с Java, которые мы кратко рассмотрим ниже.

Потоки символов

Потоки символов используются для чтения или записи типа данных символов. Давайте рассмотрим наиболее часто используемые классы. Все эти классы определены в разделе java.io посылка.

Вот некоторые классы, которые вы должны знать, которые можно использовать для чтения символьных данных:

    : Абстрактный класс для чтения потока символов. : Класс, используемый для чтения потока байтов и преобразования в поток символов. : Класс для чтения символов из файла. : Это оболочка над классом Reader , которая поддерживает возможности буферизации. Во многих случаях это наиболее предпочтительный класс для чтения данных, поскольку из файла можно прочитать больше данных за один вызов read () , что уменьшает количество фактических операций ввода-вывода с файловой системой.

И вот некоторые классы, которые вы можете использовать для записи символьных данных в файл:

    : Это абстрактный класс для записи потоков символов. : Этот класс используется для записи потоков символов, а также для преобразования их в потоки байтов. : Класс для фактической записи символов в файл. : Это оболочка над классом Writer , которая также поддерживает возможности буферизации. Это наиболее предпочтительный класс для записи данных в файл, так как в файл может быть записано больше данных за один вызов write () . И , как и BufferedReader , это уменьшает общее количество операций ввода-вывода с файловой системой.

Потоки байтов

Потоки байтов используются для чтения или записи байтовых данных с файлами. Это отличается от того, как они обрабатывали данные раньше. Здесь вы работаете с необработанными байтами, которые могут быть символами, данными изображений, данными в юникоде (для представления символа требуется 2 байта) и т. Д.

В этом разделе мы рассмотрим наиболее часто используемые классы. Все эти классы определены в разделе java.io посылка.

Вот классы, используемые для чтения байтовых данных:

    : Абстрактный класс для чтения потоков байтов. : Класс для простого считывания байтов из файла. : Это оболочка над InputStream , которая поддерживает возможности буферизации. Как мы видели в потоках символов, это более эффективный метод, чем FileInputStream .

А вот классы, используемые для записи байтовых данных:

    : Абстрактный класс для записи байтовых потоков. : Класс для записи необработанных байтов в файл. : Этот класс является оболочкой над OutputStream для поддержки возможностей буферизации. И опять же, как мы видели в потоках символов, это более эффективный метод, чем FileOutputStream благодаря буферизации.

Потоки Java NIO

Java NIO -это неблокирующий API ввода-вывода, который был представлен еще в Java 4 и может быть найден в пакете/| java.nio . С точки зрения производительности это большое улучшение API для операций ввода-вывода.

Буферы, селекторы и каналы являются тремя основными компонентами Java NIO, хотя в этой статье мы сосредоточимся исключительно на использовании классов NIO для взаимодействия с файлами, а не обязательно на концепциях, лежащих в основе API.

Поскольку этот учебник посвящен чтению и записи файлов, в этом коротком разделе мы обсудим только связанные классы:

    : Это иерархическая структура фактического расположения файла и обычно используется для поиска файла, с которым вы хотите взаимодействовать. : Это класс, который предоставляет несколько служебных методов для создания Пути из заданного URI строки. : Это еще один служебный класс, который имеет несколько методов для чтения и записи файлов, не блокируя выполнение в потоках.

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

Разница между вводом-выводом Java и NIO

Основное различие между этими двумя пакетами заключается в том, что методы read() и write() блокируют вызовы области ввода-вывода Java. Под этим мы подразумеваем, что поток, вызывающий один из этих методов, будет заблокирован до тех пор, пока данные не будут прочитаны или записаны в файл.

С другой стороны, в случае NIO методы не являются блокирующими. Это означает, что вызывающие потоки могут выполнять другие задачи (например, чтение/запись данных из другого источника или обновление пользовательского интерфейса), в то время как методы чтение или запись ожидают завершения своей операции. Это может привести к значительному повышению производительности, если вы имеете дело с большим количеством запросов ввода-вывода или большим количеством данных.

Примеры чтения и записи текстовых файлов

В предыдущих разделах мы обсуждали различные API, предоставляемые Java, и теперь пришло время использовать эти классы API в некотором коде.

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

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Примечание : Чтобы избежать путаницы в пути к файлу, пример кода будет считываться и записываться из файла в домашнем каталоге пользователя. Домашний каталог пользователя можно найти с помощью System.getProperty("user.home"); , который мы используем в наших примерах.

Чтение и запись с помощью программы чтения файлов и пишущей машинки

Давайте начнем с использования классов FileReader и Пишущая машинка :

Оба класса принимают строку, представляющую путь к файлу в их конструкторах. Вы также можете передать Файл объект, а также Файловый дескриптор .

Метод read() считывает и возвращает символ за символом, позволяя нам, например, использовать считанные данные в цикле while .

Не забудьте закрыть оба этих класса после использования!

Чтение и запись с помощью BufferedReader и BufferedWriter

Использование BufferedReader и BufferedWriter классов:

Чтение и запись с помощью FileInputStream и FileOutputStream

Использование FileInputStream и FileOutputStream классов:

Чтение и запись с помощью BufferedInputStream и BufferedOutputStream

Использование BufferedInputStream и BufferedOutputStream классов:

Чтение и запись с помощью классов Java.nio

Использование классов java.nio :

В случае , если вы заинтересованы в использовании потоков с java.nio , вы также можете использовать приведенные ниже методы, предоставляемые классом Files , которые работают так же, как потоки, которые мы рассмотрели ранее в статье:

Вывод

В этой статье мы рассмотрели наиболее распространенные способы чтения и записи данных в файл с использованием как пакета ввода-вывода Java, так и более нового пакета Java NIO. Всякий раз, когда это возможно, мы рекомендуем использовать классы Java NIO для файловых операций из-за его неблокирующего API, и, кроме того, код немного более удобен для обслуживания и чтения.

Работа с файлами в Java. Класс File . Основные методы работы

В данной теме расписаны базовые методы класса File , который есть частью системы ввода/вывода Java. Для рассмотренных методов приведены примеры с объяснениями.

Содержание

  • 1. Создание экземпляра класса File . Конструкторы класса
  • 2. Метод getName() . Получить имя файла или каталога
  • 3. Метод getPath() . Получить имя файла
  • 4. Метод isAbsolute() . Определить, указан ли полный путь к файлу
  • 5. Метод getAbsolutePath() . Получить полный путь к файлу
  • 6. Методы canRead() , canWrite() . Определение того, допускает ли файловый объект чтение и запись
  • 7. Метод exists() . Определение наличия файла (каталога)
  • 8. Метод isDirectory() . Определить, связан ли файловый объект с директорием
  • 9. Метод isFile() . Определить, связан ли файловый объект с файлом
  • 10. Метод isHidden() . Определить, есть ли файловый объект скрытым
  • 11. Метод length() . Определить размер в байтах файла, который связан с файловым объектом
  • 12. Метод delete() . Удаление файла
  • 13. Метод mkdir() . Создание папки или каталога
  • 14. Метод mkdirs() . Создание нескольких вложенных папок
  • 15. Метод renameTo() . Переименование файла
  • 16. Метод getTotalSpace() . Определение объема диска
  • 17. Метод getFreeSpace() . Определить свободное место на диске
  • 18. Метод getUsableSpace() . Определение полезного места на диске

Поиск на других ресурсах:

1. Создание экземпляра класса File . Конструкторы класса

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

Наиболее распространенным есть конструктор, который получает строку типа String . В этой строке задается полное (абсолютное) или сокращенное (относительное) имя файла или каталога, который рассматривается (создается, определяется и т.п.).

Также существуют конструкторы, формирующие имя файла из нескольких частей.

Пример.

Результат выполнения программы

2. Метод getName() . Получить имя файла или каталога

Метод getName() возвращает имя файла или каталога, с которым связана файловая переменная. Если абсолютный путь к имени файла (каталога) содержит несколько уровней вложения, то возвращается непосредственно имя этого файла (каталога). Общая форма использования метода следующая

  • name – переменная типа String , которая есть результатом выполнения метода;
  • fileObj – файловый объект, связанный с файлом или каталогом.

Пример.

  • path – строка типа String , что есть именем файла (каталога), которое было задано при создании файловой переменной fileObj .

Пример.

4. Метод isAbsolute() . Определить, указан ли полный путь к файлу

Метод isAbsolute() позволяет определить, указан ли полный путь к файлу при создании файлового объекта в конструкторе класса File . Общая форма использования метода следующая

  • res – результат, который равен true , если при создании файловой переменной fileObj был задан абсолютный путь.

Пример.

5. Метод getAbsolutePath() . Получить полный путь к файлу

Метод getAbsolutePath() возвращает полный путь к файлу. Общая форма использования метода следующая

  • path – строка типа String , которая есть результатом;
  • fileObj – файловый объект, который связан с файлом, для которого нужно определить абсолютный путь.

Пример.

Результат работы программы

7. Метод exists() . Определение наличия файла (каталога)

Метод exists() предназначен для определения существования файла, ассоциированного с файловым объектом. Общая форма использования метода следующая

  • res – результат работы метода. Если res = true , то заданный файл существует;
  • fileObj – объект, который проверяется.

Пример.

8. Метод isDirectory() . Определить, связан ли файловый объект с директорием

Метод isDirectory() предназначен для определения того, есть ли файл директорием (папкой). Общая форма использования метода следующая

  • res – значение типа bool . Если res=true , то файл есть директорием;
  • fileObj – файловый объект, который проверяется.

Пример.

9. Метод isFile() . Определить, связан ли файловый объект с файлом

Метод isFile() возвращает true , если файловый объект связан с файлом. Общая форма использования метода следующая

  • res – результат вычисления. Если файловый объект есть файлом, то res = true ;
  • fileObj – файловый объект.

Пример.

10. Метод isHidden() . Определить, есть ли файловый объект скрытым
  • fileObj – файловый объект;
  • res – результат работы метода. Если res = true , то файловый объект связан со скрытым файлом.

Пример.

11. Метод length() . Определить размер в байтах файла, который связан с файловым объектом

Метод length() предназначен для определения размера файла и имеет следующую общую форму

Пример.

Результат работы программы

12. Метод delete() . Удаление файла

Метод delete() используется для удаления файла. Общая форма использования метода

  • fileObj – файловый объект, который связан с файлом, который нужно удалить;
  • res – результат выполнения метода. Если res = true , то удаление файла состоялось успешно.

Пример.

13. Метод mkdir() . Создание папки или каталога

Метод mkdir() используется для создания папки (каталога). Общая форма использования метода следующая

  • res – результат типа bool . Если каталог создан успешно, то res = true , в противном случае res = false ;
  • fileObj – объект типа File , который связан с именем создаваемого каталога.

Пример. Создается каталог с именем 123 в текущем каталоге.

Результат работы программы

14. Метод mkdirs() . Создание нескольких вложенных папок

Метод mkdirs() позволяет создать несколько уровней вложений папок за один раз. В отличие от метода mkdir() , этот метод создает уровни вложения папок, которые не существуют. В методе mkdir() чтобы создать подпапку нужно, чтобы предварительно обязательно была созданная папка верхнего уровня.

Общая форма использования метода следующая:

  • fileObj – файловый объект, который содержит строку с именем или именами папок, которые нужно создать;
  • res – результат выполнения метода. Если последовательность папок создана успешно, то res = true .

Пример.

15. Метод renameTo(File). Переименование файла

Метод renameTo() предназначен для переименования файла. Общая форма использования метода следующая

  • res – результат выполнения метода. Если файл переименован успешно, то res = true , иначе res = false ;
  • f1 – файловая переменная, соответствующая файлу-источнику, который нужно переименовать;
  • f2 – файловая переменная, соответствующая новому имени файла-источника f1 после его переименования.

Пример.

16. Метод getTotalSpace() . Определение объема диска

С помощью метода getTotalSpace() можно определить общий размер носителя (диска) в байтах. Метод возвращает результат типа long . Общая форма использования метода следующая


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

Какие проблемы мы будем решать в этом уроке?

Подготовительные работы

Создадим простой проект, не обязательно 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():

snimok-ekrana-2016-11-16-v-21-25-22
snimok-ekrana-2016-11-16-v-21-35-19

*Это Говард Стивен Берг (Howard Stephen Berg), один из самых быстро читающих людей в мире 🙂 А FileWriter - Уильям Шекспир.

  • написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
  • это одна из статей из нашего "Самоучителя по Java"

Рассмотрим работу с FileWriter и FileReader:

  • с помощью FileWriter мы можем создавать файлы
  • с помощью FileReader - считывать их
Внимание:

Потоки FileWriter и FileReader немного отличаются от того, с чем мы встречались ранее. Работая с ними, понадобится всегда помнить 3 важных момента:

1. Объявление

Перед тем, как вызывать какие-нибудь методы для работы с файлами, нужно объявить FileWriter/FileReader:

snimok-ekrana-2016-11-17-v-17-07-25

snimok-ekrana-2016-11-17-v-17-10-14

Но Eclipse может не распознать FileReader/FileWriter и начнет ругаться. Если такое произойдет, посмотрите, импортировали ли вы библиотеку java.io.*. Для этого в самой первой строчке напишите:

2. Нужно закрыть поток

FileWriter/FileReader - это потоки, их нужно не только «открыть» (то-есть объявить), но и «закрыть» . Представьте, что Вы открыли кран. Нельзя же уйти из дому, оставив воду литься?

stocksnap_03f8a942c5

Это правило работает и для других потоков - кроме стандартных System.in и System.out.

Закрыть поток можно с помощью .close() :

public static void main ( String [ ] args ) throws Exception <

3. Допишите "волшебную фразу".

В программировании очень важна безопасность . А работа с FileWriter/FileReader - это небезопасно , в процессе может возникнуть масса разных ошибок. Это беспокоит Eclipse (или IntellijIdea - смотря чем пользуетесь), и программу она просто так не запустит. Помните, что к методу нужно дописать «throws Exception» :

Итак, еще раз акцентируем внимание - всегда Вы должны помнить о 3 моментах:

И еще, потоки FileWriter и FileReader воспринимают все файлы как текстовые:

snimok-ekrana-2016-11-16-v-21-44-24

FileWriter

Теперь представим, что Вы начинаете использовать FileWriter.

1. Объявление.

Как Вы помните, нужно не забыть импортировать библиотеки java.io.* и дописать "волшебную фразу" к методу, где Вы собираетесь объявить FileWriter.

Объявляем, как помните, почти как Scanner:

snimok-ekrana-2016-11-17-v-17-07-25

Объявили. А что теперь можно делать? Теперь пора пользоваться возможностями FileWriter!

Основной метод FileWriter - это метод .write() .

Мало? Да, но посмотрите, как много с ним можно сделать:

public static void main ( String [ ] args ) throws Exception < public static void newFile ( int k1 , int k2 ) throws Exception <

*обратите внимание - мы написали нашу "волшебную фразу" и в методе main, и в методе newFile.

Так мы можем записать числа от k1 до k2, от 2 до 9, в наш файл file1.txt. Можно записывать только четные или нечетные числа, какой-нибудь текст, и многое другое.

2. Переход на следующую строку

Но мы Вам кое-чего не сказали. Если запустить код из прошлого пункта, получится:

Если понадобится вывести числа в столбик, понадобится добавить " \n " от "new line", новая строка. Запишем в файл стих:

public static void main ( String [ ] args ) throws Exception < nFile . write ( "Хокку \nПодобен лучу самурайский клинок \nИ тот затупился \nПроклятая килька в томате!!" ) ;

Каждый раз, когда мы хотели, чтобы программа переходила на новую строку, мы ставили " \n ":

Теперь вы знаете, как вывести числа с новой строки:

public static void main ( String [ ] args ) throws Exception < public static void newFile ( int k1 , int k2 ) throws Exception <

3. Закрываем поток

После того, как Вы записали все необходимое, нужно не забыть закрыть поток. Это мы делали в каждом из приведенных примеров:

FileReader

Теперь, рассмотрим пошагово работу с FileReader.

1. Объявление

Сначала FileReader, как и FileWriter, нужно объявить . Не забудьте про библиотеку и " волшебную фразу ":

public static void main ( String [ ] args ) throws Exception <

2. FileReader + Scanner

Мы объявили не только FileReader, но и Scanner. Почему?

В отличии от FileWriter, FileReader не используется один:

2_shake
2_reader

Не вдаваясь в подробности, запомните, что FileReader и Scanner идут вместе. Но не забывайте их "связать" - для этого напишите название вашего объекта FileReader вместо "System.in" при объявлении Scanner:

3. Методы

Тут уже больше методов. Рассмотрим методы .nextLine() и .hasNextLine().

  • .nextLine() - это метод, который считывает строку (до ENTER), и возвращает это значение
  • .hasNextLine() - метод, который возвращает boolean - true или false, показывая, есть ли следующая строка.
public static void main ( String [ ] args ) throws Exception <

Должен быть такой результат:

Обратите внимание: мы используем .hasNextLine() для того, чтобы избежать ошибки, и не заставлять .nextLine() считывать строку, которой не существует:

snimok-ekrana-2016-11-22-v-19-11-15

snimok-ekrana-2016-11-22-v-19-11-15

4. Закрываем поток.

snimok-ekrana-2016-11-22-v-19-16-10

Готово. Теперь Вы знаете, как работать с FileWriter и FileReader.

Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Обучаем с нуля. Детальную информацию Вы можете найти у нас на сайте.

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