Javarush читаем и пишем в файл javarush

Обновлено: 03.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, и, кроме того, код немного более удобен для обслуживания и чтения.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

package com.javarush.task.task20.task2001 ;
import java.io.* ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.List ;
/*
Читаем и пишем в файл: Human
Реализуй логику записи в файл и чтения из файла для класса Human.
Поле name в классе Human не может быть пустым.
Метод main реализован только для вас и не участвует в тестировании.
*/
public class Solution
public static void main ( String [] args )
// исправьте outputStream/inputStream в соответствии с путем к вашему реальному файлу
try
File your_file_name = new File ( " D: \\ 1.txt " );
OutputStream outputStream = new FileOutputStream (your_file_name);
InputStream inputStream = new FileInputStream (your_file_name);
Human ivanov = new Human ( " Ivanov " , new Asset ( " home " , 999_999.99 ), new Asset ( " car " , 2999.99 ));
ivanov . save(outputStream);
outputStream . flush();
Human somePerson = new Human ();
somePerson . load(inputStream);
inputStream . close();
// check here that ivanov equals to somePerson - проверьте тут, что ivanov и somePerson равны
if (somePerson . hashCode() == ivanov . hashCode());
> catch ( IOException e)
// e.printStackTrace();
System . out . println( " Oops, something wrong with my file " );
> catch ( Exception e)
// e.printStackTrace();
System . out . println( " Oops, something wrong with save/load method " );
>
>
public static class Human
public String name;
public List< Asset > assets = new ArrayList<> ();
public Human ()
>
public Human ( String name , Asset . assets )
this . name = name;
if (assets != null )
this . assets . addAll( Arrays . asList(assets));
>
>
@Override
public boolean equals ( Object o )
if ( this == o) return true ;
if (o == null || getClass() != o . getClass()) return false ;
Human human = ( Human ) o;
if (name != null ? ! name . equals(human . name) : human . name != null ) return false ;
return assets != null ? assets . equals(human . assets) : human . assets == null ;
>
@Override
public int hashCode ()
int result = name != null ? name . hashCode() : 0 ;
result = 31 * result + (assets != null ? assets . hashCode() : 0 );
return result;
>
public void save ( OutputStream outputStream ) throws Exception
// implement this method - реализуйте этот метод
PrintWriter saveWriter = new PrintWriter (outputStream);
saveWriter . println( this . name);
if (assets != null )
for ( Asset asset : assets)
saveWriter . println(asset . getName());
saveWriter . println(asset . getPrice());
>
>
saveWriter . close();
>
public void load ( InputStream inputStream ) throws Exception
// implement this method - реализуйте этот метод
BufferedReader loadReader = new BufferedReader ( new InputStreamReader (inputStream));
name = loadReader . readLine();
while (loadReader . ready())
assets . add( new Asset (loadReader . readLine(), Double . parseDouble(loadReader . readLine())));
>
loadReader . close();
>
>
>
/* Требования:
1. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если список assets пустой.
2. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если поле name и список assets не пустые.
3. Класс Solution.Human не должен поддерживать интерфейс Serializable.
4. Класс Solution.Human должен быть публичным.
5. Класс Solution.Human не должен поддерживать интерфейс Externalizable. */

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.


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

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

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

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

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


SkillFactory - это онлайн-школа, обучающая программированию, работе с данными, аналитике и машинному обучению. Особенности: современный образовательный подход, учеба на реальных проектах, практикующие эксперты.


Skillbox – это онлайн-университет с огромным выбором современных профессий в сфере информационных технологий и менеджмента. Особенности: учителя-эксперты, индивидуальные программы, стажировка и трудоустройство.


Нетология - это университет интернет-профессий, который обучает специалистов в области web-разработки, дизайна, проектирования интерфейсов, интернет-маркетинга и управления проектами. Особенности: максимальный акцент на реальные навыки, персональная HR‑консультация по трудоустройству после окончания, стажировка.

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


TopJava - это практические курсы программирования на Java. Особенности: стажировка, трудоустройство.

Java-Mentor - это онлайн-школа изучения языка программирования Java с личным ментором, которая задействует командную разработку. Особенности: работа над настоящим коммерческим проектом в команде.

Помогите другим пользователям с выбором. Будьте первым, кто поделится своим мнением. Поставить оценку >>


HTML Academy - это онлайн-академия, которая обучает основным аспектам верстки и создания сайта. Особенности: возможность трудоустройства, более 60 курсов.



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



ITVDN – образовательный online-ресурс для обучения востребованным профессиям в сфере IT-технологий. Видеокурсы учат языку программирования с нуля, а также «выращивают» настоящих профессионалов по разработке ПО, проектированию сложных программных систем и созданию mobile-приложений.



Айтигенио - это онлайн-школа программирования для детей.


Loftschool - это онлайн-школа обучения IT профессиям. Особенности: лидер рейтинга площадок дополнительного образования, топовые преподаватели, трудоустройство.

Progkids - онлайн школа программирования для детей проводит индивидуальные уроки. Уроки проходят через Skype в формате видеозвонка и длятся 55-60 минут. В школе доступны курсы для детей от 7 лет: Создание игр на Scratch Основы программирования в Snap на базе Minecraft.


Питонтьютор - это бесплатный курс по программированию на Python с нуля.


Coursera - это международная платформа онлайн-образования, которая предоставляет огромное количество курсов в различных направлениях. Особенности: бесплатные курсы, более 150 курсов, интерактив.


Udemy - это международная платформа, предоставляющая различные курсы в IT, интернет-маркетинге, языкам, психологии и многое другое. Особенности: более 60 000 курсов, бесплатное обучение.


Learn.Javascript - это современный онлайн-учебник JavaScript, где можно изучить язык, начиная с нуля и заканчивая продвинутыми концепциями.


FructCode - это интерактивные уроки и курсы программирования в игровой форме, что позволяет проще изучить основы языков программирования. Особенности: геймификация, уникальные курсы, интерактивность.


CheckiO - это иностранный сервис для изучения программирования в игровой форме.

Хекслет - это практические курсы по программированию, которые помогают новичкам стать профессиональными программистами, а опытным разработчикам получать новые знания и расти профессионально.


JBorn - это онлайн-курсы Java с индивидуальным наставником. Особенности: обучение с нуля за 6 месяцев.


MaximumTest - это образовательный центр подготовки к ЕГЭ и ОГЭ онлайн или в классе. Также школа поможет вам подобрать ВУЗ, определить будущую профессию и изучить азы предпринимательства. Особенности: возможность учиться онлайн или в классе с учениками, мастер-классы, большой выбор дисциплин.

Помогите другим пользователям с выбором. Будьте первым, кто поделится своим мнением. Поставить оценку >>


WayUp - это проект, который объединяет фрилансеров в единое сообщество и помогает обучиться web-дизайну и разработке, и дает гарантии заработка в процессе обучения.

Помогите другим пользователям с выбором. Будьте первым, кто поделится своим мнением. Поставить оценку >>

Онлайн-школа XYZ - это школа, обучающая всем аспектам создания игр: от концепт-арта и 3D-графики до геймдизайна и программирования. Инструкторы — действующие профессионалы индустрии: они работают в таких компаниях, как Blizzard, People Can Fly, CD Projekt Red и другие.

Помогите другим пользователям с выбором. Будьте первым, кто поделится своим мнением. Поставить оценку >>

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