Разное

Файловый ввод вывод java: Java – Потоки ввода/вывода, файлы и каталоги

Содержание

Java. Система ввода/вывода

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

Класс File
Поток
Класс OutputStream
Исключения ввода/вывода

Java имеет в своём составе множество классов, связанных с вводом/выводом данных. Рассмотрим некоторые из них.

Класс File

В отличие от большинства классов ввода/вывода, класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов.

Подробнее о классе java.io.File

Поток

При работе с данными ввода/вывода вам будет часто попадаться термин Поток (Stream). Поток — это абстрактное значение источника или приёмника данных, которые способны обрабатывать информацию. Вы в реальности не видите, как действительно идёт обработка данных в устройствах ввода/вывода, так как это сложно и вам это не нужно. Это как с телевизором — вы не знаете, как сигнал из кабеля превращается в картинку на экране, но вполне можете переключаться между каналами через пульт.

Есть два типа потоков: байтовые и символьные. В некоторых ситуациях символьные потоки более эффективны, чем байтовые.

За ввод и вывод отвечают разные классы Java. Классы, производные от базовых классов InputStream или Reader, имеют методы с именами read() для чтения отдельных байтов или массива байтов (отвечают за ввод данных). Классы, производные от классов OutputStream или Write, имеют методы с именами write() для записи одиночных байтов или массива байтов (отвечают за вывод данных).

Подробнее о классе InputStream

Класс OutputStream

Класс OutputStream — это абстрактный класс, определяющий потоковый байтовый вывод.

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

BufferedOutputStream
Буферизированный выходной поток
ByteArrayOutputStream
Создает буфер в памяти. Все данные, посылаемые в этот поток, размещаются в созданном буфере
DataOutputStream
Выходной поток, включающий методы для записи стандартных типов данных Java
FileOutputStream
Отправка данных в файл на диске. Реализация класса OutputStream
ObjectOutputStream
Выходной поток для объектов
PipedOutputStream
Реализует понятие выходного канала.
FilterOutputStream
Абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства.

Методы класса:

  • int close() — закрывает выходной поток. Следующие попытки записи передадут исключение IOException
  • void flush() — финализирует выходное состояние, очищая все буферы вывода
  • abstract void write (int oneByte) — записывает единственный байт в выходной поток
  • void write (byte[] buffer) — записывает полный массив байтов в выходной поток
  • void write (byte[] buffer, int offset, int count) — записывает диапазон из count байт из массива, начиная с смещения offset

BufferedOutputStream

Класс BufferedOutputStream не сильно отличается от класса OutputStream, за исключением дополнительного метода flush(), используемого для обеспечения записи данных в буферизируемый поток. Буферы вывода нужно для повышения производительности.

ByteArrayOutputStream

Класс ByteArrayOutputStream использует байтовый массив в выходном потоке. Метод close() можно не вызывать.

DataOutputStream

Класс DataOutputStream позволяет писать элементарные данные в поток через интерфейс DataOutput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных.

Класс DataOutputStream расширяет класс FilterOutputStream, который в свою очередь, расширяет класс OutputStream.

Методы интерфейса DataOutput:

  • writeDouble(double value)
  • writeBoolean(boolean value)
  • writeInt(int value)

FileOutputStream

Класс FileOutputStream создаёт объект класса OutputStream, который можно использовать для записи байтов в файл. Создание нового объекта не зависит от того, существует ли заданный файл, так как он создаёт его перед открытием. В случае попытки открытия файла, доступного только для чтения, будет передано исключение.

Классы символьных потоков

Символьные потоки имеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode.

Reader

Методы класса Reader:

  • abstract void close() — закрывает входной поток. Последующие попытки чтения передадут исключение IOException
  • void mark(int readLimit) — помещает метку в текущую позицию во входном потоке
  • boolean markSupported() — возвращает true, если поток поддерживает методы mark() и reset()
  • int read() — возвращает целочисленное представление следующего доступного символа вызывающего входного потока. При достижении конца файла возвращает значение -1. Есть и другие перегруженные версии метода
  • boolean ready() — возвращает значение true, если следующий запрос не будет ожидать.
  • void reset() — сбрасывает указатель ввода в ранее установленную позицию метки
  • logn skip(long charCount) — пропускает указанное число символов ввода, возвращая количество действительно пропущенных символов
BufferedReader
Буферизированный входной символьный поток
CharArrayReader
Входной поток, который читает из символьного массива
FileReader
Входной поток, читающий файл
FilterReader
Фильтрующий читатель
InputStreamReader
Входной поток, транслирующий байты в символы
LineNumberReader
Входной поток, подсчитывающий строки
PipedReader
Входной канал
PushbackReader
Входной поток, позволяющий возвращать символы обратно в поток
Reader
Абстрактный класс, описывающий символьный ввод
StringReader
Входной поток, читающий из строки

Класс BufferedReader

Класс BufferedReader увеличивает производительность за счёт буферизации ввода.

Класс CharArrayReader

Класс CharArrayReader использует символьный массив в качестве источника.

Класс FileReader

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

Writer

Класс Writer — абстрактный класс, определяющий символьный потоковый вывод. В случае ошибок все методы класса передают исключение IOException.

Методы класса:

  • Writer append(char c) — добавляет символ в конец вызывающего выходного потока. Возвращает ссылку на вызывающий поток
  • Writer append(CharSequence csq) — добавляет символы в конец вызывающего выходного потока. Возвращает ссылку на вызывающий поток
  • Writer append(CharSequence csq, int start, int end) — добавляет диапазон символов в конец вызывающего выходного потока. Возвращает ссылку на вызывающий поток
  • abstract void close() — закрывает вызывающий поток
  • abstract void flush() — финализирует выходное состояние так, что все буферы очищаются
  • void write(int oneChar) — записывает единственный символ в вызывающий выходной поток.
    Есть и другие перегруженные версии метода
BufferedWriter
Буферизированный выходной символьный поток
CharArrayWriter
Выходной поток, который пишет в символьный массив
FileWriter
Выходной поток, пишущий в файл
FilterWriter
Фильтрующий писатель
OutputStreamWriter
Выходной поток, транслирующий байты в символы
PipedWriter
Выходной канал
PrintWriter
Выходной поток, включающий методы print() и println()
StringWriter
Выходной поток, пишущий в строку
Writer
Абстрактный класс, описывающий символьный вывод

Класс BufferedWriter

Класс BufferedWriter — это класс, производный от класса Writer,который буферизует вывод. С его помощью можно повысить производительность за счёт снижения количества операций физической записи в выходное устройство.

Класс CharArrayWriter

Класс CharArrayWriter использует массив для выходного потока.

Класс FileWriter

Класс FileWriter создаёт объект класса, производного от класса Writer, который вы можете применять для записи файла. Есть конструкторы, которые позволяют добавить вывод в конец файла. Создание объекта не зависит от наличия файла, он будет создан в случае необходимости. Если файл существует и он доступен только для чтения, то передаётся исключение IOException.

Чтение и запись файлов

Существует множество классов и методов для чтения и записи файлов. Наиболее распространённые из них — классы FileInputStream

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

FileInputStream(String filename) throws FileNotFoundException
FileOutputStream(String filename) throws FileNotFoundException

В filename нужно указать имя файла, который вы хотите открыть. Если при создании входного потока файл не существует, передаётся исключение FileNotFoundException. Аналогично для выходных потоков, если файл не может быть открыт или создан, также передаётся исключение. Сам класс исключения происходит от класса IOException. Когда выходной файл открыт, любой ранее существовавший файл с тем же именем уничтожается.

После завершения работы с файлом, его необходимо закрыть с помощью метода close()

для освобождения системных ресурсов. Незакрытый файл приводит к утечке памяти.

В JDK 7 метод close() определяется интерфейсом AutoCloseable и можно явно не закрывать файл, а использовать новый оператор try-с-ресурсами, что для Android пока не слишком актуально.

Чтобы читать файл, нужно вызвать метод read(). Когда вызывается этот метод, он читает единственный байт из файла и возвращает его как целое число. Когда будет достигнут конец файла, то метод вернёт значение -1. Примеры использования методов есть в различных статьях на сайте.

Иногда используют вариант, когда метод close() помещается в блок finally. При таком подходе все методы, которые получают доступ к файлу, содержатся в пределах блока try, а блок finally используется для закрытия файла. Таким образом, независимо от того, как закончится блок try, файл будет закрыт.

Так как исключение FileNotFoundException является подклассом IOException, то не обязательно обрабатывать два исключения отдельно, а оставить только IOException, если вам не нужно отдельно обрабатывать разные причины неудачного открытия файла. Например, если пользователь вводит вручную имя файла, то более конкретное исключение будет к месту.

Для записи в файл используется метод write().

void write(int value) throws IOException

Метод пишет в файл байт, переданный параметром value. Хотя параметр объявлена как целочисленный, в файл записываются только младшие восемь бит. При ошибке записи передаётся исключение.

В JDK 7 есть способ автоматического управления ресурсами:

try (спецификация_ресурса) {
    // использование ресурса
}

Когда в Android будет полноценная поддержка JDK 7, то дополним материал.

Буферизированное чтение из файла — BufferedReader

Чтобы открыть файл для посимвольного чтения, используется класс FileInputReader; имя файла задаётся в виде строки (String) или объекта File. Ускорить процесс чтения помогает буферизация ввода, для этого полученная ссылка передаётся в конструктор класса BufferedReader. Так как в интерфейсе класса имеется метод readLine(), все необходимое для чтения имеется в вашем распоряжении. При достижении конца файла метод readLine() возвращает ссылку null.

Вывод в файл — FileWriter

Объект FileWriter записывает данные в файл. При вводе/выводе практически всегда применяется буферизация, поэтому используется BufferedWriter.

Когда данные входного потока исчерпываются, метод readLine() возвращает null. Для потока явно вызывается метод close(); если не вызвать его для всех выходных файловых потоков, в буферах могут остаться данные, и файл получится неполным.

Сохранение и восстановление данных — PrintWriter

PrintWriter форматирует данные так, чтобы их мог прочитать человек. Однако для вывода информации, предназначенной для другого потока, следует использовать классы DataOutputStream для записи данных и DataInputStream для чтения данных.

Единственным надежным способом записать в поток DataOutputStream строку так, чтобы ее можно было потом правильно считать потоком DataInputStream, является кодирование UTF-8, реализуемое методами readUTF() и writeUTF(). Эти методы позволяют смешивать строки и другие типы данных, записываемые потоком DataOutputStream, так как вы знаете, что строки будут правильно сохранены в Юникоде и их будет просто воспроизвести потоком DataInputStream.

Метод writeDouble() записывает число double в поток, а соответствующий ему метод readDouble() затем восстанавливает его (для других типов также существуют подобные методы).

RandomAccessFile — Чтение/запись файлов с произвольным доступом

Работа с классом RandomAccessFile напоминает использование совмещенных в одном классе потоков DataInputStream и DataOutputStream (они реализуют те же интерфейсы DataInput и DataOutput). Кроме того, метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение.

При использовании RandomAccessFile необходимо знать структуру файла. Класс RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8.

RandomAccessFile может открываться в режиме чтения («r») или чтения/записи («rw»). Также есть режим «rws», когда файл открывается для операций чтения-записи и каждое изменение данных файла немедленно записывается на физическое устройство.

Исключения ввода/вывода

В большинстве случаев у классов ввода/вывода используется исключение IOException. Второе исключение FileNotFoundException передаётся в тех случаях, когад файл не может быть открыт. Данное исключение происходит от IOException, поэтому оба исключения можно обрабатывать в одном блоке catch, если у вас нет нужды обрабатывать их по отдельности.

Дополнительное чтение

Используем AsyncTask для загрузки текстового файла из сети — используются BufferedReader, InputStreamReader, InputStream.

Реклама

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

Последнее обновление: 25.04.2018

Отличительной чертой многих языков программирования является работа с файлами и потоками. В Java основной функционал работы с потоками сосредоточен в классах из пакета java.io.

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

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

Объект, из которого можно считать данные, называется потоком ввода, а объект, в который можно записывать данные, — потоком вывода. Например, если надо считать содержание файла, то применяется поток ввода, а если надо записать в файл — то поток вывода.

В основе всех классов, управляющих потоками байтов, находятся два абстрактных класса: InputStream (представляющий потоки ввода) и OutputStream (представляющий потоки вывода)

Но поскольку работать с байтами не очень удобно, то для работы с потоками символов были добавлены абстрактные классы Reader (для чтения потоков символов) и Writer (для записи потоков символов).

Все остальные классы, работающие с потоками, являются наследниками этих абстрактных классов. Основные классы потоков:

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

Класс InputStream

Класс InputStream является базовым для всех классов, управляющих байтовыми потоками ввода. Рассмотрим его основные методы:

  • int available(): возвращает количество байтов, доступных для чтения в потоке

  • void close(): закрывает поток

  • int read(): возвращает целочисленное представление следующего байта в потоке. Когда в потоке не останется доступных для чтения байтов, данный метод возвратит число -1

  • int read(byte[] buffer): считывает байты из потока в массив buffer. После чтения возвращает число считанных байтов. Если ни одного байта не было считано, то возвращается число -1

  • int read(byte[] buffer, int offset, int length): считывает некоторое количество байтов, равное length, из потока в массив buffer. При этом считанные байты помещаются в массиве, начиная со смещения offset, то есть с элемента buffer[offset]. Метод возвращает число успешно прочитанных байтов.

  • long skip(long number): пропускает в потоке при чтении некоторое количество байт, которое равно number

Класс OutputStream

Класс OutputStream является базовым классом для всех классов, которые работают с бинарными потоками записи. Свою функциональность он реализует через следующие методы:

  • void close(): закрывает поток

  • void flush(): очищает буфер вывода, записывая все его содержимое

  • void write(int b): записывает в выходной поток один байт, который представлен целочисленным параметром b

  • void write(byte[] buffer): записывает в выходной поток массив байтов buffer.

  • void write(byte[] buffer, int offset, int length): записывает в выходной поток некоторое число байтов, равное length, из массива buffer, начиная со смещения offset, то есть с элемента buffer[offset].

Абстрактные классы Reader и Writer

Абстрактный класс Reader предоставляет функционал для чтения текстовой информации. Рассмотрим его основные методы:

  • absract void close(): закрывает поток ввода

  • int read(): возвращает целочисленное представление следующего символа в потоке. Если таких символов нет, и достигнут конец файла, то возвращается число -1

  • int read(char[] buffer): считывает в массив buffer из потока символы, количество которых равно длине массива buffer. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1

  • int read(CharBuffer buffer): считывает в объект CharBuffer из потока символы. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1

  • absract int read(char[] buffer, int offset, int count): считывает в массив buffer, начиная со смещения offset, из потока символы, количество которых равно count

  • long skip(long count): пропускает количество символов, равное count. Возвращает число успешно пропущенных символов

Класс Writer определяет функционал для всех символьных потоков вывода. Его основные методы:

  • Writer append(char c): добавляет в конец выходного потока символ c. Возвращает объект Writer

  • Writer append(CharSequence chars): добавляет в конец выходного потока набор символов chars. Возвращает объект Writer

  • abstract void close(): закрывает поток

  • abstract void flush(): очищает буферы потока

  • void write(int c): записывает в поток один символ, который имеет целочисленное представление

  • void write(char[] buffer): записывает в поток массив символов

  • absract void write(char[] buffer, int off, int len) : записывает в поток только несколько символов из массива buffer. Причем количество символов равно len, а отбор символов из массива начинается с индекса off

  • void write(String str): записывает в поток строку

  • void write(String str, int off, int len): записывает в поток из строки некоторое количество символов, которое равно len, причем отбор символов из строки начинается с индекса off

Функционал, описанный классами Reader и Writer, наследуется непосредственно классами символьных потоков, в частности классами FileReader и FileWriter соответственно, предназначенными для работы с текстовыми файлами.

Теперь рассмотрим конкретные классы потоков.

НазадСодержаниеВперед

Как создать файл java

Руководство по Java Core. Файлы и работа с ними.

При разработке программного обеспечения мы сталкиваемся с приложениями, в которых необходимо передавать или принимать файлы. Практически все классы, необходимые для этой задачи находтся в паке java.io. В работе с файлами испольщуется такое понятие, как поток (stream), который принимает входной файл и перемещает его в место назначения.

В языке программирования Java поддерживаются потоки для различных типов данных. Давайте рассмотрим их.

Потоки (Streams)

Мы можем сказать ,что поток – это последовательность данных. Существует два вида потоков:

  • Входящий поток
    В Java для чтения файлов используется InputStream .
  • Исходящий поток
    В Java используется OutputStream для записи данных в файл.

Схематично это можно изобразить так:

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

Байты

Чаще всего, для работы с байтами используются FileInputStream и FileOutputStream. Давайте рассмотрим как это работает на примере простого приложения.

Создайте в корневой папке проекта папку resources. В это йпапке создайте два файла: inputFile.txt и outputFile.txt.

Файл inputFile.txt:

Оставьте файл outputFile.txt пустым.

В результате работы программы мы получим следуюющий результат:

После запуска приложения смотрим файл outputFile.txt

Копирование успешно выполнено.

Символы

Байтовые потоки в Java используются для ввода и вывода 8-битных элементов. Символьные потоки используюстся для работы с 16-битной кодировкой Unicode.

Для работы с символами, чаще всего используют FileReader и FileWriter. FileReader читает одновременно по 2 байта, а FileWriter, в своб очередь, записывает по 2 байта за раз.

Для понимания того, как жто работает на практике рассмотирм пример простого приложения.

Создайте в корневой папке проекта папку resources. В это йпапке создайте два файла: inputFile.txt и outputFile.txt.

Файл inputFile.txt:

Оставьте файл outputFile.txt пустым.

В результате работы программы мы получим следуюющий результат:

После запуска приложения смотрим файл outputFile.txt

Копирование успешно выполнено.

Стандартные потоки

Как и во многих других языках программирования, в Java обеспечивается ввод информации в программу во время её выполнения. Для этих целей в Java существует три стандартных потока:

  • Стандратный ввод
    Используется для ввода пользователем информаци (обычно – клавиатура) и представлен элементом System. in.
  • Стандартный вывод
    Используется для вывода данных пользователю (обычно – экран монитора) и представлен элементом System.out.
  • Стандартная ошибка
    Используется для вывода ошибок произошедших при работе программы (обычно – на экран монитора) и представлен элементом System.err.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

Запускаем программу и начинаем вводить символы. Если нам необходимо выйти – вводим символ ‘Q’.

В результате работы рпограммы мы получим, примерно, следующий результат:

Чтение и запись файлов

Теперь рассмотрим чтение и запись файлов более подробно.

Рассмотренные ранее InputStream и OutputSream используются для чтения и записи данных из файлов записи их в файлы.

Давайте посмотрим а иерархию этих двух классов:

Далее мы рассмотрим FileInputStream и FileOutputStream.

FileInputStream

Этот элемент используется для чтения данных из файлов.

FileInputStream имеет следующие методы:

  • public void close() throws IOException
    Этот метод закрывает поток и освобождает любый ресурсы системы, которые связаны с этим файлом. В случае ошибки “бросает” IOException.
  • public void finalize() throws IOException
    Этот метод “чистит” соединение с файлом. И проверяет, что метод close() был вызван. В случае ошибки “бросает” IOException.
  • public int read(int r) throws IOException
    Этот метод читает определённые байты данных из входящего файла .Возвращает int. Если весь файл прочитан – будет возвращено занчение -1. В случае ошибки “бросает” IOException.
  • public int read(byte[] r) throws IOException
    Этот метод читает количество байтов, равное длине массива (r.length). Если весь файл прочитан – будет возвращено занчение -1. В случае ошибки “бросает” IOException.
  • public int available() throws IOException
    Этот метода возвращает количество байтов, которое может быть прочитано из заданного входного файла. Возвращаетint.

Рассмотрим два ключевых входных потока:


FileOutputStream

Этот поток используется для создания файлов и записи в них данных. Если файл, в который мы хотим записать данные ещё не существует, то FileOutputStream создаст его автоматически.

Исходящий поток имеет следующие методы:

  • public void close() throws IOException
    Этот метод закрывает исходящий поток и освобождает все ресурсы системы, который связаны с ним. В случае ошибки “бросает” IOException.
  • protected void finalize() throws IOException
    Этот метод “чистит” соединение с файлом. Проверяет был ли вызван метод close(). В случае ошибки “бросает” IOException.
  • public void write(int w) throws IOException
    Этот метод записывает опредлённые байты в указанный файл. В случае ошибки “бросает” IOException.
  • public void write(byte[] w) throws IOException
    Этот метод записывает количество байтов, равное длине заданного массива (w.length) в указанный файл. В случае ошибки “бросает” IOException.

Рассмотрим два ключевых исходящих потока:



Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

В результате работы программы мы получим, следующий результат:

Навигация файлов и I/O

Рассмотрим другие ключевые классы, которые мы модем использовать при работе с файлами и I/O:

Директории в Java

Директория (грубо говоря – папка) – это экземпляр класса File, который содержит список других файлов.

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

  • mkdir()
    Этот метод создаёт директорию и возвращает логическое значение true, если создание прошло успешно, и false – если нет. Ошибка может быть вызвана либо тем, что данная директория уже существует, либо тем, что вводнй путь директории ещё не создан.
  • mkdirs()
    Этот метод метод создаёт и саму директорию и путь (родительские папки) к этой директории.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

В результате работы программы будет создана директория (папка) с названием testDir по указанному пути. Вы олжны вставить свой желаемый путь создаваемой директории.

Кроме того, мы также можем получить список файлов и директорий, которые находятся в интересующей нас папке с помощью метода list().

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

В результате работы программы мы получим, примерно, следующий результат:

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

В следующем уроке мы изучим такую важную составляющую языка программирования Java, как исключения (Exceptions).

Как создать файл и записать его на Java?

каков самый простой способ создания и записи в (текстовый) файл на Java?

30 ответов

обратите внимание, что каждый из приведенных ниже примеров кода может бросить IOException . Блоки Try/catch / finally были опущены для краткости. См.в этом уроке для получения информации об обработке исключений.

создание текстового файла (обратите внимание, что это перезапишет файл, если он уже существует):

создание двоичного файла (это также перезапишет файл):

Java 7+ пользователи могут использовать Files класс для записи в файлы:

создание текстового файла:

создание двоичного файла:

в Java 7 и выше:

есть полезные утилиты для этого, хотя:

  • пакета fileutils. writeStringtoFile(..) из commons-io
  • файлы.писать.(.) из гуавы

обратите внимание также, что вы can использовать FileWriter , но он использует кодировку по умолчанию, что часто является плохой идеей — лучше указать кодировку явно.

ниже оригинал, до Java 7 ответ

Если у вас уже есть содержимое, которое вы хотите записать в файл (и не генерируется на лету), java.nio.file.Files добавление в Java 7 как часть собственного ввода-вывода обеспечивает самый простой и эффективный способ достижения ваших целей.

в основном создание и запись в файл-это только одна строка, более того один простой вызов метода!

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

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

используя try() автоматически закрыть поток. Эта версия является короткой, быстрой (буферизованной) и позволяет выбрать кодировку.

эта функция была введена в Java 7.

очень простой способ создания и записи в файл на Java:

здесь мы вводим строку в текстовый файл:

мы можем легко создать новый файл и добавить содержимое в него.

Если вы хотите иметь относительно безболезненный опыт, вы также можете взглянуть на Apache Commons IO пакет, точнее FileUtils класс.

никогда не забывайте проверять сторонние библиотеки. Joda Времени на сегодняшний день манипуляций, Apache Commons Lang StringUtils для общих строковых операций и таких может сделать ваш код более читаемым.

Java-отличный язык, но стандартная библиотека иногда немного низкоуровневый. Мощный, но все же низкий уровень.

поскольку автор не указал, требуется ли им решение для версий Java, которые были Eold (как Sun, так и IBM, и это технически самые распространенные JVMs), и из-за того, что большинство людей, похоже, ответили на вопрос автора, Прежде чем было указано, что это текст (не бинарные) файл, я решил предоставить свой ответ.

прежде всего, Java 6, как правило, достиг конца жизни, и так как автор не сделал укажите, что ему нужна устаревшая совместимость, я думаю, это автоматически означает Java 7 или выше (Java 7 еще не Eol’D IBM). Итак, мы можем посмотреть прямо на файл I/O учебник:https://docs.oracle.com/javase/tutorial/essential/io/legacy.html

  • многие методы не создавали исключений, когда они терпели неудачу, поэтому это было невозможно получить сообщение об ошибке. Например, если файл ошибка удаления, программа получит «удалить сбой», но не знал бы, если бы это было потому, что файл не существовал, пользователь не есть разрешения, или была какая-то другая проблема.
  • метод rename не работал последовательно на разных платформах.
  • не было никакой реальной поддержки для символических ссылок.
  • больше поддержка метаданных, например, файл разрешения, владелец файла и другие атрибуты безопасности. Подключение метаданные файлов неэффективны.
  • многие методы файлов не масштабируются. Запрос большого списка каталогов через сервер может привести к висеть. Большие каталоги также могут вызвать проблемы с ресурсами памяти , что приводит к отказу в обслуживании.
  • невозможно было написать надежный код, который может рекурсивно ходить по дереву файлов и отвечать соответственно, если бы были круговые символы связи.

Ну, это исключает java.Ио.Файл. Если файл не может быть записан / добавлен, вы можете даже не знать, почему.

вот пример (упрощенный):

другой пример (добавление):

упрощенный пример (Java 8 или выше):

другой пример (добавление):

эти методы требуют минимальных усилий со стороны автора и должны быть предпочтительнее всех других при записи в [текстовые] файлы.

Если вы по какой-то причине хотите отделить акт создания и записи, эквивалент Java touch is

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

Я думаю, что это самый короткий путь:

создать файл без перезаписи существующего файла:

только одна линия ! path и line строки

самый простой способ, который я могу найти:

Это, вероятно, работать только для 1.7+.

если мы используем Java 7 и выше, а также знаем содержимое, которое будет добавлено (добавлено) в файл, мы можем использовать newBufferedWriter метод в пакете NIO.

есть несколько моментов, чтобы отметить:

  1. это всегда хорошая привычка, чтобы указать кодировку кодировки и для этого у нас есть константа в классе StandardCharsets .
  2. код использует try-with-resource инструкция, в которой ресурсы автоматически закрываются после пытаться.

хотя OP не спрашивал, но на всякий случай мы хотим искать строки с определенным ключевым словом, например confidential мы можем использовать API потока в Java:

чтение и запись файлов с помощью input и outputstream:

просто включите этот пакет:

и затем вы можете использовать этот код для записи в файл:

стоит попробовать для Java 7+:

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

он отлично работает.

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

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

Использование FileWriter

Использование PrintWriter

Использование OutputStreamWriter

для дальнейшего проверить этот учебник о том, как чтение и запись файлов на Java .

есть несколько простых способов, как:

вы даже можете создать временный файл с помощью системное свойство, который будет независимо от того, какую ОС вы используете.

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

в примере создается новый fruits.txt файл в корневом каталоге проекта.

чтение коллекции с клиентами и сохранение в файл, с JFilechooser.

лучший способ — использовать Java7: Java 7 представляет новый способ работы с файловой системой, а также новый служебный класс-файлы. Используя класс Files, мы также можем создавать, перемещать, копировать, удалять файлы и каталоги; он также может использоваться для чтения и записи в файл.

запись с помощью FileChannel Если вы имеете дело с большими файлами, FileChannel может быть быстрее, чем стандартный IO. Следующая строка записи кода в файл с помощью FileChannel:

запись с помощью DataOutputStream

запись с помощью FileOutputStream

Давайте теперь посмотрим, как мы можем использовать FileOutputStream для записи двоичных данных в файл. Следующий код преобразует строку int bytes и записывает байты в файл с помощью FileOutputStream:

пишите с помощью PrintWriter мы можем использовать PrintWriter для записи форматированного текста в файл:

написать с BufferedWriter: используйте BufferedWriter для записи строки в новый файл:

Как создать файл java

Основные навыки и понятия

  • Представление о потоках ввода-вывода
  • Отличия байтовых и символьных потоков
  • Классы для поддержки байтовых потоков
  • Классы для поддержки символьных потоков
  • Представление о встроенных потоках
  • Применение байтовых потоков
  • Использование байтовых потоков для файлового ввода-вывода
  • Автоматическое закрытие файлов с помощью оператора try с ресурсами
  • Чтение и запись двоичных данных
  • Манипулирование файлами с произвольным доступом
  • Применение символьных потоков
  • Использование символьных потоков для файлового ввода-вывода
  • Применение оболочек типов Java для преобразования символьных строк в числа

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

Приступая к изучению системы ввода вырода Java, приготовьтесь к длительной и кропотливой работе. Система ввода-вывода в Java довольно обширна и содержит немало классов, интерфейсов и методов. Объясняется это, в частности, тем, что в Java, по существу, определены две полноценные системы ввода-вывода: одна — для обмена байтами, другая — для обмена символами. Здесь нет возможности рассмотреть все аспекты ввода-вывода в Java, ведь для этого бы потребовалась отдельная книга. Поэтому в данной главе будут рассмотрены лишь наиболее важные и часто используемые языковые средства ввода-вывода. Правда, элементы системы ввода-вывода в Java тесно взаимосвязаны, и поэтому, уяснив основы, вы легко освоите все остальные свойства этой системы.

Прежде чем приступать к рассмотрению системы ввода-вывода, необходимо сделать следующее замечание. Классы, описанные в этой главе, предназначены для консольного и файлового ввода-вывода. Они не применяются для создания графических пользовательских интерфейсов. Поэтому ими не имеет смысла пользоваться при создании оконных приложений. Для графических интерфейсов предусмотрены другие языковые средства. Они будут представлены в главе 14 при рассмотрении апплетов, а также в главе 15, служащей введением в библиотеку Swing. (Swing — это современный набор инструментальных средств, ориентированных на создание графических пользовательских интерфейсов приложений.)

Организация системы ввода-вывода в Java на потоках

Ввод-вывод в программах на Java осуществляется посредством потоков. Поток — это некая абстракция производства или потребления информации. С физическим устройством поток связывает система ввода-вывода. Все потоки действуют одинаково — даже если они связаны с разными физическими устройствами. Поэтому классы и методы ввода-вывода могут применяться к самым разным типам устройств. Например, методами вывода на консоль можно пользоваться и для вывода в файл на диске. Для реализации потоков используется иерархия классов, содержащихся в пакете java.io.

Байтовые и символьные потоки

В современных версиях Java определены два типа потоков: байтовые и символьные. (В первоначальных версиях Java были доступны только байтовые потоки, тогда как символьные потоки были реализованы в дальнейшем.) Байтовые потоки предоставляют удобные средства для ввода и вывода байтов. Они используются, например, при чтении и записи двоичных данных. В особенности они полезны для обращения с файлами. А символьные потоки ориентированы на обмен символьными данными. В них применяется кодировка в уникоде (Unicode), а следовательно, программы, в которых используются символьные потоки, легко поддаются локализации на разные языки мира. В некоторых случаях символьные потоки обеспечивают более высокую эффективность по сравнению с байтовыми.

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

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

Классы байтовых потоков

Для определения байтовых потоков служат две иерархии классов. На их вершине находятся два абстрактных класса: InputStream и OutputStream. В классе InputStream определены свойства, общие для байтовых потоков ввода, а в классе OutputStream — свойства, общие для байтовых потоков вывода.

Производными от классов InputStream и OutputStream являются конкретные подклассы, реализующие различные функциональные возможности и учитывающие особенности обмена данными с разными устройствами, например ввода-вывода в файлы на диске. Классы байтовых потоков приведены в табл. 10.1. Не следует пугаться большого количества этих классов: изучив один из них, легко освоить остальные.

Таблица 10.1. Классы байтовых потоков

Класс байтового потокаОписание
BufferedlnputStreamБуферизованный поток ввода
BufferedOutputStreamБуферизованный поток вывода
ByteArrayInputStreamПоток ввода для чтения из байтового массива
ByteArrayOutputStreamПоток вывода для записи в байтовый массив
DatalnputStreamПоток ввода с методами для чтения стандартных типов данных Java
DataOutputStreamПоток вывода с методами для записи стандартных типов данных Java
FileInputStreamПоток ввода для чтения из файла
FileOutputStreamПоток вывода для записи в файл
FilterlnputStreamПодкласс, производный от класса InputStream
FilterOutputStreamПодкласс, производный от класса OutputStream
InputStreamАбстрактный класс, описывающий потоковый ввод
ObjectInputStreamПоток для ввода объектов
ObjectOutputStreamПоток для вывода объектов
OutputStreamАбстрактный класс, описывающий потоковый вывод
PipedlnputStreamПоток конвейерного ввода
PipedOutputStreamПоток конвейерного вывода
PrintStreamПоток вывода с методами print() и println()
PushbacklnputStreamПоток ввода с возвратом прочитанных байтов в поток
RandomAccessFileКласс, поддерживающий файловый ввод-вывод с произвольным доступом
SequenceInputStreamПоток ввода, сочетающий в себе несколько потоков ввода для поочередного чтения данных из них

Классы символьных потоков

Для определения символьных потоков служат две иерархические структуры классов, на вершине которых находятся абстрактные классы Reader и Writer соответственно. Класс Reader и его подклассы используются для чтения, а класс Writer и его подклассы — для записи данных. Конкретные классы, производные от классов Reader и Writer, оперируют символами в уникоде.

Классы, производные от классов Reader и Writer, предназначены для выполнения различных операций ввода-вывода символов. Символьные классы присутствуют в Java параллельно с байтовыми классами. Классы символьных потоков приведены в табл. 10.2. Таблица 10.2. Классы символьных потоков

Класс символьного потокаОписание
BufferedReaderБуферизованный поток ввода символов
BufferedWriterБуферизованный поток вывода символов
CharArrayReaderПоток ввода для чтения из символьного массива
CharArrayWriterПоток вывода для записи в символьный массив
FileReaderПоток ввода для чтения символов из файла
FileWriterПоток вывода для записи символов в файл
FilterReaderКласс для чтения символов с фильтрацией
FilterWriterКласс для записи символов с фильтрацией
InputStreamReaderПоток ввода с преобразованием байтов в символы
LineNumberReaderПоток ввода с подсчетом символьных строк
OutputStreamWriterПоток вывода с преобразованием символов в байты
PipedReaderПоток конвейерного ввода
PipedWriterПоток конвейерного вывода
PrintWriterПоток вывода с методами print() и println()
PushbackReaderПоток ввода с возвратом прочитанных символов в поток
ReaderАбстрактный класс, описывающий потоковый ввод символов
StringReaderПоток ввода для чтения из символьной строки
StringWriterПоток вывода для записи в символьную строку
WriterАбстрактный класс, описывающий потоковый вывод символов

Как вам должно быть уже известно, во все программы на Java автоматически импортируется пакет java. lang. В этом пакете определен класс System, инкапсулирующий некоторые элементы среды выполнения программ. Помимо прочего, в нем содержатся предопределенные переменные in, out и err, представляющие стандартные потоки ввода-вывода. Эти поля объявлены как public, final и static. А это означает, что ими можно пользоваться в любой другой части программы, не ссылаясь на конкретный объект типа System.

Переменная System.out ссылается на поток стандартного вывода. По умолчанию этот поток связан с консолью. А переменная System, in ссылается на поток стандартного ввода (по умолчанию с клавиатуры). И наконец, переменная System.err ссылается на поток стандартных сообщений об ошибках, которые по умолчанию выводятся на консоль. По мере необходимости все эти потоки могут быть перенаправлены на другие совместимые устройства ввода-вывода.

Поток System.in представляет собой объект типа InputStream, а потоки System.out и System.err — объекты типа PrintStream. Хотя эти потоки обычно используются для чтения и записи символов, они на самом деле являются байтовыми потоками. Дело в том, что эти потоки были определены в первоначальной спецификации Java, где символьные потоки вообще не были предусмотрены. Как станет ясно в дальнейшем, для этих потоков можно по необходимости создать оболочки, превратив их в символьные потоки.

Применение байтовых потоков

Начнем рассмотрение системы ввода-вывода в Java с байтовых потоков. Как пояснялось ранее, на вершине иерархии байтовых потоков находятся классы InputStream и OutputStream. Методы из класса InputStream приведены в табл. 10.3, а методы из класса OutputStream — в табл. 10.4. При возникновении ошибок в процессе выполнения методы из классов InputStream и OutputStream могут генерировать исключения типа IOException. Методы, определенные в этих двух абстрактных классах, доступны во всех подклассах. Таким образом, они формируют минимальный набор функций ввода-вывода, общих для всех байтовых потоков.

Таблица 10.3. Методы, определенные в классе InputStream

МетодОписание
int available()Возвращает количество байтов, доступных для чтения
void close()Закрывает поток ввода. При последующей попытке чтения из потока генерируется исключение IOException
void mark(int numBytes)Ставит отметку на текущей позиции в потоке. Отметка доступна до тех пор, пока на будет прочитано количество байтов, определяемое параметром numBytes
boolean markSupported()Возвращает логическое значение true, если методы mark() и reset() поддерживаются в вызывающем потоке
int read()Возвращает целочисленное представление следующего байта в потоке. Если достигнут конец потока, возвращается значение -1
int read(byte buffer[])Предпринимает попытку прочитать количество байтов, определяемое выражением buffer, length, в массив buffer и возвращает фактическое количество успешно прочитанных байтов. Если достигнут конец потока, возвращается значение -1
int read(byte buffer[], int offset, int numBytes)Предпринимает попытку прочитать количество байтов, определяемое параметром numBytes, в массив buffer, начиная с элемента buffer[offset]. Если достигнут конец потока, возвращается значение -1
void reset()Устанавливает указатель ввода на помеченной ранее позиции
long skip (long numBytes)Пропускает количество байтов, определяемое параметром numBytes, в потоке ввода. Возвращает фактическое количество пропущенных байтов

Таблица 10.4. Методы, определенные в классе OutputStream

МетодОписание
void close()Закрывает выходной поток. При последующей попытке записи в поток генерируется исключение IOExceptionВыводит содержимое выходного буфера вывода в
void flush()Выводит содержимое выходного буфера вывода в целевой поток. По завершении этой операции выходной буфер очищается
void write(int b)Записывает один байт в поток вывода. Параметр b относится к типу int, что позволяет вызывать данный метод в выражениях, не приводя результат их вычисления к типу byte
void write(byte buffer[])Записывает массив в поток вывода
void write(byte buffer[], int offset, int numBytes)Записывает в поток вывода часть массива buffer длиной numBytes байтов, начиная с элемента buffer[offset]

Первоначально единственный способ реализовать консольный ввод в Java состоял в использовании байтовых потоков, и во многих программах на Java до сих пор используются исключительно потоки данного типа. В настоящее время для разработки прикладных программ доступны как байтовые, так и символьные потоки. В коммерческих приложениях для чтения данных с консоли в основном используются символьные потоки. Такой подход упрощает локализацию программ и их сопровождение. Ведь намного удобнее оперировать непосредственно символами и не тратить время и труд на преобразование символов в байты, а байтов — в символы. Но в простых служебных и прикладных программах, где данные, введенные с клавиатуры, обрабатываются непосредственно, удобно пользоваться байтовыми потоками. Именно поэтому они здесь и рассматриваются.

Поток System, in является экземпляром класса InputStream, и благодаря этому обеспечивается автоматический доступ к методам, определенным в классе InputStream. К сожалению, в классе InputStream определен только один метод ввода, read(), предназначенный для чтения байтов. Ниже приведены разные формы объявления этого метода.

В главе 3 было показано, как пользоваться первой формой метода read() для ввода отдельных символов с клавиатуры (а по существу, из потока стандартного ввода System, in). Достигнув конца потока, этот метод возвращает значение -1. Вторая форма метода read() предназначена для чтения данных из потока ввода в массив data. Чтение завершается по достижении конца потока, па заполнении массива или при возникновении ошибки. Метод возвращает количество прочитанных байтов или значение -1, если достигнут конец потока. И третья форма данного метода позволяет разместить прочитанные данные в массиве data, начиная с элемента, обозначаемого индексом start. Максимальное количество байтов, которые могут быть введены в массив, определяется параметром max. Метод возвращает число прочитанных байтов или значение -1, если достигнут конец потока. При возникновении ошибки в каждой из этих форм метода read() генерируется исключение IOException. Условие конца потока ввода System, in устанавливается при нажатии клавиши .

Ниже приведен краткий пример программы, демонстрирующий чтение байтов из потока ввода System, in в массив. Следует иметь в виду, что исключения, которые могут быть сгенерированы при выполнении данной программы, обрабатываются за пределами метода main(). Такой подход часто используется при чтении данных с консоли. По мере необходимости вы сможете самостоятельно организовать обработку ошибок.

Выполнение этой программы дает например, следующий результат:

Вывод на консоль

Как и для консольного ввода, в Java для консольного вывода первоначально были предусмотрены только байтовые потоки. Но уже в версии Java 1.1 были реализованы символьные потоки. Именно их и рекомендуется применять в прикладных программах, особенно в тех случаях, когда необходимо добиться переносимости кода. Но поскольку System, out является байтовым потоком вывода, он по-прежнему широко используется для побайтового вывода данных на консоль. Именно такой подход до сих пор применялся в примерах, представленных в этой книге. Поэтому он здесь и рассматривается.

Вывести данные на консоль проще всего с помощью уже знакомых вам методов print() и println(). Эти методы определены в классе PrintStream (на объект данного типа ссылается переменная потока стандартного вывода System. out). Несмотря на то что System, out является байтовым потоком вывода, пользоваться им вполне допустимо для организации элементарного вывода данных на консоль.

Класс PrintStream представляет собой выходной поток, производный от класса OutputStream, и поэтому в нем также реализуется метод write() низкоуровневого вывода. Следовательно, этот метод может быть использован для вывода данных на консоль. Самая простая форма метода write(), определенного в PrintStream, имеет следующий вид:

Этот метод записывает в поток байтовое значение, указываемое в качестве параметра byteval. Несмотря на то что этот параметр объявлен как int, учитываются только 8 младших битов его значения. Ниже приведен простой пример программы, где метод write() используется для вывода символов S и новой строки на консоль.

На практике для вывода на консоль метод write.() применяется достаточно редко. Для этой цели намного удобнее пользоваться методами print() и println(). В классе PrintStream реализованы два дополнительных метода, printf() и format(), которые позволяют управлять форматом выводимых данных. Например, при выводе можно указать количество десятичных цифр, минимальную ширину поля или способ представления отрицательных числовых значений. И хотя эти методы не используются в примерах, представленных в данной книге, вам стоит обратить на них пристальное внимание, поскольку они могут оказаться очень полезными при написании прикладных программ.

Чтение и запись в файлы из байтовых потоков

В Java предоставляется большое количество классов и методов, позволяющих читать и записывать данные в файлы. Разумеется, чаще всего приходится обращаться к файлам, хранящимся на дисках. В Java все файлы имеют байтовую организацию, и поэтому для побайтового чтения и записи данных в такие файлы предоставляются соответствующие методы. Следовательно, организовывать чтение и запись данных в файлы из байтовых потоков приходится довольно часто. Кроме того, для байтовых потоков ввода-вывода в файлы в Java разрешено создавать специальные оболочки в виде символьных объектов. Такие оболочки будут рассмотрены далее в этой главе.

Для того чтобы создать байтовый поток и связать его с файлом, следует воспользоваться классом FilelnputStream или FileOutputStream. А для открытия файла достаточно создать объект одного из этих классов, передав имя файла конструктору в качестве параметра. В открытый файл можно записывать данные или читать их из него.

Ввод данных из файла

Файл открывается для ввода созданием объекта типа FilelnputStream. Для этой цели чаще всего используется приведенная ниже форма объявления конструктора данного класса. FilelnputStream(String имя_файла) throws FileNotFoundException

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

Для чтения данных из файла служит метод read(). Ниже приведена форма объявления этого метода, которой мы будем пользоваться в дальнейшем,

При каждом вызове метод read() читает байт из файла и возвращает его как целочисленное значение. По достижении конца файла этот метод возвращает значение -1. При возникновении ошибки метод генерирует исключение IOException. Как видите, в этой форме метод read() выполняет те же самые действия, что и одноименный метод для ввода данных с консоли.

Завершив операции с файлом, следует закрыть его с помощью метода close(), общая форма объявления которого выглядит следующим образом:

При закрытии файла освобождаются связанные с ним системные ресурсы, чтобы использовать их для работы с другим файлом. Если же файл не будет закрыт, могут произойти “утечки памяти” из-за того, что часть памяти остается выделенной для неиспользуемых ресурсов. Ниже приведен пример программы, где метод read() используется для ввода содержимого текстового файла. Имя файла задается с помощью параметра в командной строке при запуске программы на выполнение. Полученные данные выводятся на экран. Обратите внимание на то, что ошибки ввода-вывода обрабатываются с помощью блока try/catch.

В приведенном выше примере поток ввода из файла закрывается после того, как чтение данных из файла завершается в блоке try. Такой способ оказывается удобным не всегда, и поэтому в Java предоставляется более совершенный и чаще употребляемый способ. А состоит он в вызове метода close() в блоке finally. В этом случае все методы, получающие доступ к файлу, помещаются в блок try, а для закрытия файла используется блок finally. Благодаря этому файл закрывается независимого от того, как завершится блок try. Если продолжить предыдущий пример, то блок try, в котором выполняется чтение из файла, можно переписать следующим образом:

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

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

Обратите внимание на то, что переменная fin инициализируется пустым значением null. А в блоке finally файл закрывается только в том случае, если значение переменной fin не является пустым. Такой способ оказывается вполне работоспособным, поскольку переменная fin не будет содержать пустое значение лишь в том случае, если файл был успешно открыт. Следовательно, метод close() не будет вызываться, если во время открытия файла возникнет исключение.

В приведенном выше примере блок try/catch можно сделать более компактным. Ведь исключение FileNotFoundException является подклассом исключения IOException, и поэтому его не нужно перехватывать отдельно. В качестве примера ниже приведен блок оператора catch, которым можно воспользоваться для перехвата обоих этих исключений, не прибегая к перехвату исключения FileNotFoundException в отдельности. В данном случае выводится стандартное сообщение о возникшем исключении с описанием характера ошибки.

FileOutputStream(String имя_файла) throws FileNotFoundException FileOutputStream(String имя_файлаг boolean append) throws FileNotFoundException

void write(int byteval) throws IOException

void close() throws IOException

/* Копирование текстового файла. При вызове этой программы следует указать имя исходного и целевого файлов. Например, для копирования файла FIRST.TXT в файл SECOND.TXT в командной строке нужно указать следующее: java CopyFile FIRST.TXT SECOND.TXT / import java.io.; class CopyFile

/* В этой версии программы ShowFile оператор try с ресурсами применяется для автоматического закрытия файла, когда он уже больше не нужен. Примечание: для компиляции этого кода требуется JDK 7 или более поздняя версия данного комплекта. / import java.io.; class ShowFile

try(FilelnputStream fin = new FilelnputStream(args[0]))

/* В этой версии программы CopyFile используется оператор try с ресурсами. В ней демонстрируется управление двумя ресурсами (в данном случае — файлами) с помощью единственного оператора try.

> > Обратите внимание на то, каким образом входной и выходной файлы открываются в операторе try с ресурсами, как показано ниже.

По завершении этого блока try оба файла, на которые ссылаются переменные fin и fout, закрываются автоматически. Если сравнить эту версию программы с предыдущей, то можно заметить, что ее исходный код намного компактнее. Возможность писать более компактный код является еще одним, дополнительным преимуществом оператора try с ресурсами.

Следует также упомянуть о еще одной особенности оператора try с ресурсами. Вообще говоря, когда выполняется блок try, в нем может возникнуть одно исключение, приводящее к другому исключению при закрытии ресурса в блоке finally. И если это блок обычного оператора try, то исходное исключение теряется, прерываясь вторым исключением. А в блоке оператора try с ресурсами второе исключение подавляется. Но оно не теряется, а добавляется в список подавленных исключений, связанных с первым исключением. Этот список можно получить, вызвав метод get Suppressed(), определенный в классе Throwable.

В силу упомянутых выше преимуществ, присущих оператору try с ресурсами, можно ожидать, что он найдет широкое применение в программировании на Java. Поэтому именно он и будет использоваться в остальных примерах программ, представленных далее в этой главе. Но не менее важным остается и умение пользоваться рассмотренным ранее традиционным способом освобождения ресурсов с помощью вызываемого явным образом оператора close(). И на то имеется ряд веских оснований. Во-первых, уже существует немало написанных и повсеместно эксплуатируемых программ на Java, в которых применяется традиционный способ управления ресурсами. Поэтому все программирующие на Java должны как следует усвоить и уметь пользоваться этим традиционным способом для сопровождения устаревшего кода. Во-вторых, переход на JDK 7 может произойти не сразу, а следовательно, придется работать с предыдущей версией данного комплекта. В этом случае воспользоваться преимуществами оператора try с ресурсами не удастся и придется применять традиционный способ управления ресурсами. И наконец, в некоторых классах закрытие ресурса явным образом может оказаться более пригодным, чем его автоматическое освобождение. Но, несмотря на все сказанное выше, новый способ автоматического управления ресурсами считается более предпочтительным при переходе к JDK 7 или более поздней версии данного комплекта, поскольку он рациональнее и надежнее традиционного способа.

Чтение и запись двоичных данных

В приведенных до сих пор примерах программ читались и записывались байтовые значения, содержащие символы в коде ASCII. Но аналогичным образом можно также организовать чтение и запись любых типов данных. Допустим, требуется создать файл, содержащий значения типа int, double или short. Для чтения и записи простых типов данных в Java предусмотрены классы DatalnputStream и DataOutputStream.

Класс DataOutputStream реализует интерфейс DataOutput, в котором определены методы, позволяющие записывать в файл значения любых простых типов. Следует, однако, иметь в виду, что данные записываются во внутреннем двоичном формате, а не в виде последовательности символов. Методы, наиболее часто применяемые для записи простых типов данных в Java, приведены в табл. 10.5. Каждый из них генерирует исключение IOException при возникновении ошибки ввода-вывода.

Таблица 10.5. Наиболее часто употребляемые методы вывода данных, определенные в классе DataOutputStream

Метод вывода данныхОписание
void writeBoolean (boolean val)Записывает логическое значение, определяемое параметром val
void writeByte (int,val)Записывает младший байт целочисленного значения, определяемого параметром val
void writeChar (int,val)Записывает значение, определяемое параметром val, интерпретируя его как символ
void writeDouble (double val)Записывает значение типа double, определяемое параметром val
void writeFloat (float val)Записывает значение типа float, определяемое параметром val
void writelnt(int val)Записывает значение типа int, определяемое параметром val
void writeLong (long val)Записывает значение типа long, определяемое параметром val
void writeShort (int val)Записывает целочисленное значение, определяемое параметром val, преобразуя его в тип short

Ниже приведен конструктор класса DataOutputStream. Обратите внимание на то, что при вызове ему передается экземпляр класса OutputStream.

где OutputStream — это поток вывода, в который записываются данные. Для того чтобы организовать запись данных в файл, следует передать конструктору в качестве параметра OutputStream объект типа FileOutputStream.

Класс DatalnputStream реализует интерфейс Datalnput, в котором объявлены методы для чтения всех простых типов данных в Java (табл. 10.6). В каждом из этих методов может быть сгенерировано исключение IOException при возникновении ошибки ввода-вывода. В качестве своего основания класс DatalnputStream использует экземпляр класса InputStream, перекрывая его методами для чтения различных типов данных в Java. Однако в потоке типа DatalnputStream данные читаются в двоичном виде, а не в удобной для чтения форме. Ниже приведен конструктор класса DatalnputStream.

где inputStream — это поток, связанный с создаваемым экземпляром класса DatalnputStream. Для того чтобы организовать чтение данных из файла, следует передать конструктору в качестве параметра inputStream объект типа FilelnputStream.

Таблица 10.6. Наиболее часто употребляемые методы ввода данных, определенные в классе DatalnputStream

Метод ввода данныхОписание
boolean readBoolean()Читает значение типа boolean
byte readByte()Читает значение типа byte
char readChar()Читает значение типа char
double readDouble()Читает значение типа double
float readFloat()Читает значение типа float
int readlnt()Читает значение типа int
long readLong()Читает значение типа long
short readShort()Читает значение типа short

Ниже приведен пример программы, демонстрирующий применение классов DataOutputStream и DatalnputStream. В этой программе данные разных типов сначала записываются в файл, а затем читаются из файла.

Выполнение этой программы дает следующий результат:

Пример для опробования 10. 1. Утилита сравнения файлов

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

  1. Создайте файл CompFiles.java.
  2. Введите в файл CompFiles.java приведенный ниже исходный код.
  1. Для опробования программы скопируйте сначала файл CompFiles. java во временный файл temp, а затем введите в командной строке следующее:
  1. Программа сообщит, что файлы одинаковы. Далее сравните файл CompFiles.java с рассмотренным ранее файлом CopyFile. j ava, введя в командной строке следующее:
  1. Эти файлы содержат разные данные, о чем и сообщит программа CompFiles.
  2. Попробуйте самостоятельно внедрить в программу CompFiles ряд дополнительных возможностей. В частности, введите в нее возможность выполнять сравнение без учета регистра символов. Программу CompFiles можно также доработать таким образом, чтобы она выводила место, где обнаружено первое отличие сравниваемых файлов.

Файлы с произвольным доступом

До сих пор нам приходилось иметь дело с последовательными файлами, содержимое которых вводилось и выводилось побайтно, т.е. строго по порядку. Но в Java предоставляется также возможность обращаться к хранящимся в файле данным в произвольном порядке. Для этой цели предусмотрен класс RandomAccessFile, инкапсулирующий файл с произвольным доступом. Класс RandomAccessFile не является производным от класса InputStream или OutputStream. Вместо этого он реализует интерфейсы Datalnput и DataOutput, в которых объявлены основные методы ввода-вывода. В нем поддерживаются также запросы позиционирования, т.е. возможность задавать положение указателя файла произвольным образом. Ниже приведен конструктор класса RandomAccessFile, которым мы будем пользоваться далее.

Здесь конкретный файл указывается с помощью параметра имя_файла, а параметр доступ определяет, какой именно тип доступа будет использоваться для обращения к файлу. Если параметр доступ принимает значение «г», то данные могут читаться из файла, но не записываться в него. Если же указан тип доступа «rw», то файл открывается как для чтения, так и для записи.

Метод seek(), общая форма объявления которого приведена ниже, служит для установки текущего положения указателя файла,

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

В классе RandomAccessFile определены методы read() и write(). Этот класс также реализует интерфейсы Datalnput и DataOuput, т.е. в нем доступны методы чтения и записи простых типов, например readlnt() и writeDouble().

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

Результат выполнения данной программы выглядит следующим образом:

Обратите внимание на расположение каждого числового значения. Ведь значение типа double занимает 8 байтов, и поэтому каждое последующее число начинается на 8-байтовой границе предыдущего числа. Иными словами, первое числовое значение начинается на позиции нулевого байта, второе — на позиции 8-го байта, третье — на позиции 16-го байта и т.д. Поэтому для чтения четвертого числового значения нужно установить указатель файла на позиции 24-го байта при вызове метода seek().

Применение символьных потоков в Java

Как следует из предыдущих разделов этой главы, байтовые потоки в Java довольно эффективны и удобны в употреблении. Но что касается ввода-вывода символов, то байтовые потоки далеки от идеала. Поэтому для этих целей в Java определены классы символьных потоков. На вершине иерархии классов, поддерживающих символьные потоки, находятся абстрактные классы Reader и Writer. Методы класса Reader приведены в табл. 10.7, а методы класса Writer — в табл. 10.8. В большинстве этих методов может быть сгенерировано исключение IOException. Методы, определенные в указанных абстрактных классах Reader и Writer, доступны во всех их подклассах. Таким образом, они образуют минимальный набор функций ввода-вывода, необходимых для всех символьных потоков.

Таблица 10.7. Методы, определенные в классе Reader

МетодОписание
abstract void close()Закрывает поток ввода данных. При последующей попытке чтения генерируется исключение IOException
void mark (int numChars)Ставит отметку на текущей позиции в потоке. Отметка доступна до тех пор, пока на будет прочитано количество символов, определяемое параметром numChars
boolean markSupported()Возвращает логическое значение true, если поток поддерживает методы mark() и reset()
int read()Возвращает целочисленное представление очередного символа из потока ввода. Если достигнут конец потока, возвращается значение -1
int read(char buffer[])Предпринимает попытку прочитать количество байтов, определяемое выражением buffer, length, в массив buffer и возвращает фактическое количество успешно прочитанных символов. Если достигнут конец потока, возвращается значение -1
abstract int read(char buffer[], int offset, int numChars)Предпринимает попытку прочитать количество символов, определяемое параметром numChars, в массив buffer, начиная с элемента buffer [ offset]. Если достигнут конец потока, возвращается значение -1
int read(CharBuffer buffer)Предпринимает попытку заполнить буфер, определяемый параметром buffer, символами, прочитанными из входного потока. Если достигнут конец потока, возвращается значение -1. CharBuffer — это класс, представляющий последовательность символов, например строку
boolean ready()Возвращает логическое значение true, если следующий запрос на получение символа может быть выполнен немедленно. В противном случае возвращается логическое значение false
void reset()Устанавливает указатель ввода на помеченной ранее позиции
long skip(long numChars)Пропускает количество символов, определяемое параметром numChars, в потоке ввода. Возвращает фактическое количество пропущенных символов

Таблица 10.8. Методы, определенные в классе Writer

МетодОписание
Writer append(char ch)Записывает символ ch в конец текущего потока. Возвращает ссылку на поток
Writer append(CharSequence chars)Записывает символы chars в конец текущего потока. Возвращает ссылку на поток. CharSequence — это интерфейс, в котором описаны только операции чтения последовательности символов
Writer append(CharSequence chars, int begin, int end)Записывает символы chars в конец текущего потока, начинаяс позиции, определяемой параметром begin, и кончая позицией, определяемой параметром end. Возвращает ссылку на поток. CharSequence — это интерфейс, в котором описаны только операции чтения последовательности символов
abstract void close()Закрывает поток вывода. При последующей попытке записи в поток генерируется исключение IOException
abstract void flush()Выводит текущее содержимое буфера на устройство. В результате выполнения данной операции буфер очищается
void write(int ch)Записывает в вызывающий поток вывода один символ. Параметр ch относится к типу int, что позволяет вызывать данный метод в выражениях, не приводя результат их вычисления к типу char
void write(char buffer[])Записывает в вызывающий поток вывода массив символов buffer
abstract void write(char buffer[], int offset, int numChars)Записывает в вызывающий поток вывода количество символов, определяемое параметром numChars, из массива buffer, начиная с элемента buffer[ offset ]
void write(String str)Записывает в вызывающий поток вывода символьную строку str
void write(String str, int offset, int numChars)Записывает в вызывающий поток вывода часть numChars символов из строки str, начиная с позиции, обозначаемой параметром offset

Консольный ввод из символьных потоков

Если программа подлежит локализации, то при организации ввода с консоли символьным потокам следует отдать предпочтение перед байтовыми. А поскольку System.in — это байтовый поток, то для него придется построить оболочку в виде класса, производного от класса Reader. Наиболее подходящим для ввода с консоли является класс Buf feredReader, поддерживающий буферизованный поток ввода. Но объект типа Buf feredReader нельзя построить непосредственно из потока стандартного ввода System, in. Сначала нужно преобразовать байтовый поток в символьный. И для этой цели служит класс InputStreamReader, преобразующий байты в символы. Для того чтобы получить объект типа InputStreamReader, связанный с потоком стандартного ввода System, in, нужно воспользоваться следующим конструктором:

Поток ввода System.in является экземпляром класса InputStream, и поэтому его можно указать в качестве параметра inputStream данного конструктора.

Затем на основании объекта типа InputStreamReader можно создать объект типа BufferedReader, используя следующий конструктор:

где inputReader — это поток, который связывается с создаваемым экземпляром класса Buf feredReader. Объединяя обращения к указанным выше конструкторам в одну операцию, мы получаем приведенную ниже строку кода. В ней создается объект типа BufferedReader, связанный с клавиатурой.

После выполнения этого оператора присваивания переменная br будет содержать ссылку на символьный поток, связанный с консолью через поток ввода System.in.

Прочитать символы из потока ввода System, in можно с помощью метода read(), определенного в классе Buf f eredReader. Чтение символов мало чем отличается от чтения данных из байтовых потоков. Ниже приведены общие формы объявления трех вариантов метода read(), предусмотренных в классе Buf f eredReader.

В первом варианте метод read() читает один символ в уникоде. По достижении конца потока этот метод возвращает значение -1. Во втором варианте метод read() читает данные из потока ввода и помещает их в массив. Чтение оканчивается по достижении конца потока, по заполнении массива data символами или при возникновении ошибки. В этом случае метод возвращает число прочитанных символов, а если достигнут конец потока, — значение -1. В третьем варианте метод read() помещает прочитанные символы в массив data, начиная с элемента, определяемого индексом start. Максимальное число символов, которые могут быть записаны в массив, определяется параметром max. В данном случае метод возвращает число прочитанных символов или значение -1, если достигнут конец потока. При возникновении ошибки в каждом из перечисленных выше вариантов метода read() генерируется исключение IOException. При чтении данных из потока ввода System, in конец потока устанавливается нажатием клавиши < Enter>.

Ниже приведен пример программы, демонстрирующий применение метода read() для чтения символов с консоли. Символы читаются до тех пор, пока пользователь не введет точку. Следует иметь в виду, что исключения, которые могут быть сгенерированы при выполнении данной программы, обрабатываются за пределами метода main(). Как пояснялось выше, подобный подход характерен для обработки ошибок при чтении данных с консоли. По желанию вы можете употребить другой механизм обработки ошибок.

Результат выполнения данной программы выглядит следующим образом:

Чтение символьных строк

Для ввода символьной строки с клавиатуры следует воспользоваться методом readLine() из класса Buf feredReader. Ниже приведена общая форма объявления этого метода.

Этот метод возвращает объект типа String, содержащий прочитанные символы. При попытке прочитать символьную строку по окончании потока метод возвращает пустое знчение null.

Ниже приведен пример программы, демонстрирующий применение класса BufferedReader и метода readLine(). В этой программе текстовые строки читаются и отображаются до тех пор, пока не будет введено слово «stop».

Консольный вывод в символьные потоки

Несмотря на то что поток стандартного вывода System, out вполне может использоваться для вывода на консоль, такой подход скорее пригоден для целей отладки или при создании очень простых программ, подобных тем, которые приводятся в качестве примеров в этой книге. Для реальных прикладных программ на Java вывод на консоль обычно организуется через поток PrintWriter, относящийся к одному из классов, представляющих символьные потоки. Как упоминалось ранее, применение символьных потоков упрощает локализацию прикладных программ.

В классе PrintWriter определен ряд конструкторов. Далее будет использоваться следующий конструктор:

где в качестве первого параметра OutputStream конструктору передается объект типа OutputStream, а второй параметр f lushOnNewline указывает, должен ли производиться вывод данных из буфера в поток вывода при каждом вызове метода println(). Если параметр f lushOnNewline принимает логическое значение true, данные выводятся из буфера автоматически.

В классе PrintWriter поддерживаются методы print() и println() для всех типов, включая Object. Следовательно, методы print() и println() можно использовать точно так же, как и вместе с потоком вывода System, out. Если значение аргумента не относится к простому типу, то методы из класса PrintWriter вызывают метод toString() для объекта, указываемого в качестве параметра, а затем выводят результат.

Для вывода данных на консоль через поток типа PrintWriter следует указать System. out B качестве потока вывода и обеспечить вывод данных из буфера после каждого вызова метода println(). Например, при выполнении следующей строки кода создается объект типа PrintWriter, связанный с консолью:

Ниже приведен пример прикладной программы, демонстрирующий применение класса PrintWriter для организации вывода на консоль.

Выполнение этой программы дает следующий результат:

Несмотря на все удобство символьных потоков, не следует забывать, что для изучения языка Java или отладки программ можно вполне пользоваться и потоком вывода System, out. Но если в программе применяется поток PrintWriter, то ее проще локализировать. Для кратких примеров программ, представленных в этой книге, применение потока PrintWriter не имеет существенных преимуществ перед потоком System, out, поэтому в и последующих примерах для вывода на консоль будет использоваться поток System.out.

Ввод-вывод в файлы через символьные потоки

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

Применение класса FileWriter

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

Здесь имя файла обозначает полный путь к файлу. Если параметр append принимает логическое значение true, данные записываются в конец файла, а иначе они перезаписывают прежние данные на том же месте в файле. При возникновении ошибки в каждом из указанных выше конструкторов генерируется исключение IOException. Класс FileWriter является производным от классов OutputStreamWriter и Writer. Следовательно, в нем доступны методы, объявленные в его суперклассах.

Ниже приведен краткий пример программы, демонстрирующий ввод текстовых строк с клавиатуры и последующий их вывод в файл test. txt. Набираемый текст читается до тех пор, пока пользователь не введет слово «stop». Для вывода текстовых строк в файл используется класс FileWriter.

Применение класса FileReader

В классе FileReader создается объект типа Reader, который можно использовать для чтения содержимого файла. Чаще всего употребляется такой конструктор этого класса:

где имя файла обозначает полный путь к файлу. Если указанный файл не существует, генерируется исключение FileNotFoundException. Класс FileReader является производным от классов InputStreamReader и Reader. Следовательно, в нем доступны методы, объявленные в его суперклассах.

Приведенный ниже пример демонстрирует простую утилиту для отображения на экране содержимого текстового файла test. txt. Она является своего рода дополнением к утилите, рассмотренной в предыдущем разделе.

Обратите внимание на то, что для потока типа FileReader создана оболочка в классе BufferedReader. Благодаря этому появляется возможность обращаться к методу readLine(). Кроме того, закрытие потока типа Buf feredReader, на который в данном примере ссылается переменная br, автоматически приводит к закрытию файла.

Применение оболочек типов для преобразования символьных строк в числа

Прежде чем завершить обсуждение средств ввода-вывода, необходимо рассмотреть еще один способ, помогающий читать числовые строки. Как известно, метод println() предоставляет удобные средства для вывода на консоль различных типов данных, в том числе целых чисел и чисел с плавающей точкой. Он автоматически преобразует числовые значения в удобную для чтения форму. Но в Java отсутствует метод, который читал бы числовые строки и преобразовывал бы их во внутреннюю двоичную форму. Например, не существует варианта метода read(), который читал бы числовую строку «100» и автоматически преобразовывал ее в целое число, пригодное для хранения в переменной типа int. Но для этой цели в Java имеются другие средства. И проще всего подобное преобразование осуществляется с помощью так называемых оболочек типов.

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

Оболочками типов являются классы Double, Float, Long, Integer, Short, Byte, Character и Boolean. Эти классы предоставляют обширный ряд методов, позволяющих полностью интегрировать простые типы в иерархию объектов Java. Кроме того, в классах-оболочках числовых типов содержатся методы, предназначенные для преобразования числовых строк в соответствующие двоичные эквиваленты. Эти методы приведены ниже. Каждый из них возвращает двоичное значение, соответствующее числовой строке.

Оболочка типаМетод преобразования
Doublestatic double parseDouble(String str) throws NumberFormatException
Floatstatic float parseFloat(String str) throws NumberFormatException
Longstatic long parseLong(String str) throws NumberFormatException
Integerstatic int parselnt(String str) throws NumberFormatException
Shortstatic short parseShort(String str) throws NumberFormatException
Bytestatic byte parseByte(String str) throws NumberFormatException

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

Методы синтаксического анализа позволяют без труда преобразовать во внутренний формат числовые значения, введенные в виде символьных строк с клавиатуры или из текстового файла. Ниже приведен пример программы, демонстрирующий применение для этих целей методов parselnt() и parseDouble(). В этой программе находится среднее арифметическое ряда чисел, введенных пользователем с клавиатуры. Сначала пользователю прелагается указать количество числовых значений для обработки, а затем программа вводит числа с клавиатуры, используя метод readLine(), а с помощью метода parselnt() преобразует символьную строку в целочисленное значение. Далее осуществляется ввод числовых значений и последующее их преобразование в тип double с помощью метода parseDouble().

Выполнение этой программы может дать, например, следующий результат:

Пример для опробования 10.2. Создание справочной системы, находящейся на диске

В примере для опробования 4.1 был создан класс Help, позволяющий отображать сведения об операторах Java. Справочная информация хранилась в самом классе, а пользователь выбирал требуемые сведения из меню. И хотя такая справочная система выполняет свои функции, подход к ее разработке был выбран далеко не самый лучший. Так, если требуется добавить или изменить какие-нибудь сведения в подобной справочной системе, придется внести изменения в исходный код программы, которая ее реализует. Кроме того, выбирать пункт меню по его номеру не очень удобно, а если количество пунктов велико, то такой способ оказывается вообще непригодным. В этом проекте предстоит устранить недостатки, имеющиеся в справочной системе, разместив справочную информацию на диске.

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

  1. Создайте файл, в котором будет храниться справочная информация и который будет использоваться в справочной системе. Это должен быть обычный текстовый файл, организованный следующим образом:
  1. Название каждой темы располагается в отдельной строке и предваряется символом #. Наличие специального символа в строке (в данном случае — #) позволяет программе быстро найти начало раздела. Под названием темы может располагаться любая справочная информация. После окончания одного раздела и перед началом другого должна быть введена пустая строка. Кроме того, в конце строк не должно быть лишних пробелов.
  2. Ниже приведен пример простого файла со справочной информацией, который можно использовать вместе с новой версией справочной системы. В нем хранятся сведения об операторах Java.
  1. Присвойте этому файлу имя helpfile.txt.
  2. Создайте файл FileHelp.java.
  3. Начните создание новой версии класса Help со следующих строк кода:
  1. Имя файла со справочной информацией передается конструктору класса Help и запоминается в переменной экземпляра helpfile. А поскольку каждый экземпляр класса Help содержит отдельную копию переменной helpf ile, то каждый из них может взаимодействовать с отдельным файлом. Это дает возможность создавать отельные наборы справочных файлов на разные темы.
  2. Добавьте в класс Help метод helpon(), код которого приведен ниже. Этот метод извлекает справочную информацию по заданной теме.
  1. Прежде всего обратите внимание на то, что в методе helpon() обрабатываются все исключения, связанные с вводом-выводом, поэтому в заголовке метода не указано ключевое слово throws. Благодаря такому подходу упрощается разработка методов, в которых используется метод helpon(). В вызывающем методе достаточно обратиться к методу helpon(), не заключая его вызов в блок try/catch.
  2. Для открытия файла со справочной информацией служит класс FileReader, оболочкой которого является класс Buf feredReader. В справочном файле содержится текст, и поэтому справочную систему удобнее локализовать через символьные потоки ввода-вывода.
  3. Метод helpon (\ действует следующим образом. Символьная строка, содержащая название темы, передается этому методу в качестве параметра. Метод открывает сначала файл со справочной информацией. Затем в файле производится поиск, т.е. проверяется совпадение содержимого переменной what и названия темы. Напомним, что в файле заголовок темы предваряется символом #, поэтому метод сначала ищет данный символ. Если символ найден, производится сравнение следующего за ним названия темы с содержимым переменной what. Если сравниваемые строки совпадают, то отображается справочная информация по данной теме. И если заголовок темы найден, то метод helpon() возвращает логическое значение true, иначе — логическое значение false.
  4. В классе Help содержится также метод getSelectionO, который предлагает задать тему и возвращает строку, введенную пользователем.
  1. В теле этого метода сначала создается объект типа Buf feredReader, который связывается с потоком вывода System, in. Затем в нем запрашивается название темы, которое принимается и далее возвращается вызывающей части программы.
  2. Ниже приведен весь исходный код программы, реализующей справочную систему, находящуюся на диске.

Упражнение для самопроверки

по материалу главы 10

  1. Для чего в Java определены как байтовые, так и символьные потоки?
  2. Как известно, ввод-вывод данных на консоль осуществляется в текстовом виде. Почему же в Java для этой цели используются байтовые потоки?
  3. Как открыть файл для чтения байтов?
  4. Как открыть файл для чтения символов?
  5. Как открыть файл для ввода-вывода с произвольным доступом?
  6. Как преобразовать числовую строку «123.23» в двоичный эквивалент?
  7. Напишите программу, которая будет копировать текстовые файлы. Видоизмените ее таким образом, чтобы все пробелы заменялись дефисами. Используйте при написании программы классы, представляющие байтовые потоки, а также традиционный способ закрытия файла явным вызовом метода close().
  8. Перепишите программу, созданную в ответ на предыдущий вопрос, таким образом, чтобы в ней использовались классы, представляющие символьные потоки. На этот раз воспользуйтесь оператором try с ресурсами для автоматического закрытия файла.
  9. К какому типу относится поток System. in?
  10. Что возвращает метод read() из класса InputStream по достижении конца потока?
  11. Поток какого типа используется для чтения двоичных данных?
  12. Классы Reader и Writer находятся на вершине иерархии классов _______ .
  13. Оператор try без ресурсов служит для ______ .
  14. Если для закрытия файла используется традиционный способ, то это лучше всего делать в блоке finally. Верно или неверно?

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.

Какой класс пакета java io позволяет создать поток ввода текстовых данных с учетом кодировки

Система ввода/вывода

Java имеет в своём составе множество классов, связанных с вводом/выводом данных. Рассмотрим некоторые из них.

Класс File

В отличие от большинства классов ввода/вывода, класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов.

Подробнее о классе java.io.File

Поток

При работе с данными ввода/вывода вам будет часто попадаться термин Поток (Stream). Поток — это абстрактное значение источника или приёмника данных, которые способны обрабатывать информацию. Вы в реальности не видите, как действительно идёт обработка данных в устройствах ввода/вывода, так как это сложно и вам это не нужно. Это как с телевизором — вы не знаете, как сигнал из кабеля превращается в картинку на экране, но вполне можете переключаться между каналами через пульт.

Есть два типа потоков: байтовые и символьные. В некоторых ситуациях символьные потоки более эффективны, чем байтовые.

За ввод и вывод отвечают разные классы Java. Классы, производные от базовых классов InputStream или Reader, имеют методы с именами read() для чтения отдельных байтов или массива байтов (отвечают за ввод данных). Классы, производные от классов OutputStream или Write, имеют методы с именами write() для записи одиночных байтов или массива байтов (отвечают за вывод данных).

Подробнее о классе InputStream

Класс OutputStream

Класс OutputStream — это абстрактный класс, определяющий потоковый байтовый вывод.

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

BufferedOutputStream Буферизированный выходной поток ByteArrayOutputStream Создает буфер в памяти. Все данные, посылаемые в этот поток, размещаются в созданном буфере DataOutputStream Выходной поток, включающий методы для записи стандартных типов данных Java FileOutputStream Отправка данных в файл на диске. Реализация класса OutputStream ObjectOutputStream Выходной поток для объектов PipedOutputStream Реализует понятие выходного канала. FilterOutputStream Абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства.

  • int close() — закрывает выходной поток. Следующие попытки записи передадут исключение IOException
  • void flush() — финализирует выходное состояние, очищая все буферы вывода
  • abstract void write (int oneByte) — записывает единственный байт в выходной поток
  • void write (byte[] buffer) — записывает полный массив байтов в выходной поток
  • void write (byte[] buffer, int offset, int count) — записывает диапазон из count байт из массива, начиная с смещения offset
BufferedOutputStream

Класс BufferedOutputStream не сильно отличается от класса OutputStream, за исключением дополнительного метода flush(), используемого для обеспечения записи данных в буферизируемый поток. Буферы вывода нужно для повышения производительности.

ByteArrayOutputStream

Класс ByteArrayOutputStream использует байтовый массив в выходном потоке. Метод close() можно не вызывать.

DataOutputStream

Класс DataOutputStream позволяет писать элементарные данные в поток через интерфейс DataOutput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных.

Класс DataOutputStream расширяет класс FilterOutputStream, который в свою очередь, расширяет класс OutputStream.

Методы интерфейса DataOutput:

  • writeDouble(double value)
  • writeBoolean(boolean value)
  • writeInt(int value)
FileOutputStream

Класс FileOutputStream создаёт объект класса OutputStream, который можно использовать для записи байтов в файл. Создание нового объекта не зависит от того, существует ли заданный файл, так как он создаёт его перед открытием. В случае попытки открытия файла, доступного только для чтения, будет передано исключение.

Классы символьных потоков

Символьные потоки имеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode.

Reader

Методы класса Reader:

  • abstract void close() — закрывает входной поток. Последующие попытки чтения передадут исключение IOException
  • void mark(int readLimit) — помещает метку в текущую позицию во входном потоке
  • boolean markSupported() — возвращает true, если поток поддерживает методы mark() и reset()
  • int read() — возвращает целочисленное представление следующего доступного символа вызывающего входного потока. При достижении конца файла возвращает значение -1. Есть и другие перегруженные версии метода
  • boolean ready() — возвращает значение true, если следующий запрос не будет ожидать.
  • void reset() — сбрасывает указатель ввода в ранее установленную позицию метки
  • logn skip(long charCount) — пропускает указанное число символов ввода, возвращая количество действительно пропущенных символов
Класс BufferedReader

Класс BufferedReader увеличивает производительность за счёт буферизации ввода.

Класс CharArrayReader

Класс CharArrayReader использует символьный массив в качестве источника.

Класс FileReader

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

Writer

Класс Writer — абстрактный класс, определяющий символьный потоковый вывод. В случае ошибок все методы класса передают исключение IOException.

  • Writer append(char c) — добавляет символ в конец вызывающего выходного потока. Возвращает ссылку на вызывающий поток
  • Writer append(CharSequence csq) — добавляет символы в конец вызывающего выходного потока. Возвращает ссылку на вызывающий поток
  • Writer append(CharSequence csq, int start, int end) — добавляет диапазон символов в конец вызывающего выходного потока. Возвращает ссылку на вызывающий поток
  • abstract void close() — закрывает вызывающий поток
  • abstract void flush() — финализирует выходное состояние так, что все буферы очищаются
  • void write(int oneChar) — записывает единственный символ в вызывающий выходной поток. Есть и другие перегруженные версии метода
Класс BufferedWriter

Класс BufferedWriter — это класс, производный от класса Writer,который буферизует вывод. С его помощью можно повысить производительность за счёт снижения количества операций физической записи в выходное устройство.

Класс CharArrayWriter

Класс CharArrayWriter использует массив для выходного потока.

Класс FileWriter

Класс FileWriter создаёт объект класса, производного от класса Writer, который вы можете применять для записи файла. Есть конструкторы, которые позволяют добавить вывод в конец файла. Создание объекта не зависит от наличия файла, он будет создан в случае необходимости. Если файл существует и он доступен только для чтения, то передаётся исключение IOException.

Чтение и запись файлов

Существует множество классов и методов для чтения и записи файлов. Наиболее распространённые из них — классы FileInputStream и FileOutputStream, которые создают байтовые потоки, связанные с файлами. Чтобы открыть файл, нужно создать объект одного из этих файлов, указав имя файла в качестве аргумента конструктора.

В filename нужно указать имя файла, который вы хотите открыть. Если при создании входного потока файл не существует, передаётся исключение FileNotFoundException. Аналогично для выходных потоков, если файл не может быть открыт или создан, также передаётся исключение. Сам класс исключения происходит от класса IOException. Когда выходной файл открыт, любой ранее существовавший файл с тем же именем уничтожается.

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

В JDK 7 метод close() определяется интерфейсом AutoCloseable и можно явно не закрывать файл, а использовать новый оператор try-с-ресурсами, что для Android пока не слишком актуально.

Чтобы читать файл, нужно вызвать метод read(). Когда вызывается этот метод, он читает единственный байт из файла и возвращает его как целое число. Когда будет достигнут конец файла, то метод вернёт значение -1. Примеры использования методов есть в различных статьях на сайте.

Иногда используют вариант, когда метод close() помещается в блок finally. При таком подходе все методы, которые получают доступ к файлу, содержатся в пределах блока try, а блок finally используется для закрытия файла. Таким образом, независимо от того, как закончится блок try, файл будет закрыт.

Так как исключение FileNotFoundException является подклассом IOException, то не обязательно обрабатывать два исключения отдельно, а оставить только IOException, если вам не нужно отдельно обрабатывать разные причины неудачного открытия файла. Например, если пользователь вводит вручную имя файла, то более конкретное исключение будет к месту.

Для записи в файл используется метод write().

Метод пишет в файл байт, переданный параметром value. Хотя параметр объявлена как целочисленный, в файл записываются только младшие восемь бит. При ошибке записи передаётся исключение.

В JDK 7 есть способ автоматического управления ресурсами:

Когда в Android будет полноценная поддержка JDK 7, то дополним материал.

Буферизированное чтение из файла — BufferedReader

Чтобы открыть файл для посимвольного чтения, используется класс FileInputReader; имя файла задаётся в виде строки (String) или объекта File. Ускорить процесс чтения помогает буферизация ввода, для этого полученная ссылка передаётся в конструктор класса BufferedReader. Так как в интерфейсе класса имеется метод readLine(), все необходимое для чтения имеется в вашем распоряжении. При достижении конца файла метод readLine() возвращает ссылку null.

Вывод в файл — FileWriter

Объект FileWriter записывает данные в файл. При вводе/выводе практически всегда применяется буферизация, поэтому используется BufferedWriter.

Когда данные входного потока исчерпываются, метод readLine() возвращает null. Для потока явно вызывается метод close(); если не вызвать его для всех выходных файловых потоков, в буферах могут остаться данные, и файл получится неполным.

Сохранение и восстановление данных — PrintWriter

PrintWriter форматирует данные так, чтобы их мог прочитать человек. Однако для вывода информации, предназначенной для другого потока, следует использовать классы DataOutputStream для записи данных и DataInputStream для чтения данных.

Единственным надежным способом записать в поток DataOutputStream строку так, чтобы ее можно было потом правильно считать потоком DataInputStream, является кодирование UTF-8, реализуемое методами readUTF() и writeUTF(). Эти методы позволяют смешивать строки и другие типы данных, записываемые потоком DataOutputStream, так как вы знаете, что строки будут правильно сохранены в Юникоде и их будет просто воспроизвести потоком DataInputStream.

Метод writeDouble() записывает число double в поток, а соответствующий ему метод readDouble() затем восстанавливает его (для других типов также существуют подобные методы).

RandomAccessFile — Чтение/запись файлов с произвольным доступом

Работа с классом RandomAccessFile напоминает использование совмещенных в одном классе потоков DataInputStream и DataOutputStream (они реализуют те же интерфейсы DataInput и DataOutput). Кроме того, метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение.

При использовании RandomAccessFile необходимо знать структуру файла. Класс RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8.

RandomAccessFile может открываться в режиме чтения («r») или чтения/записи («rw»). Также есть режим «rws», когда файл открывается для операций чтения-записи и каждое изменение данных файла немедленно записывается на физическое устройство.

Исключения ввода/вывода

В большинстве случаев у классов ввода/вывода используется исключение IOException. Второе исключение FileNotFoundException передаётся в тех случаях, когад файл не может быть открыт. Данное исключение происходит от IOException, поэтому оба исключения можно обрабатывать в одном блоке catch, если у вас нет нужды обрабатывать их по отдельности.

Дополнительное чтение

Используем AsyncTask для загрузки текстового файла из сети — используются BufferedReader, InputStreamReader, InputStream.

19.1. Java — Потоки ввода/вывода и работа с файлами и каталогами

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

Содержание

Потоки

Потоки в Java определяются в качестве последовательности данных. Существует два типа потоков:

  • InPutStream – поток ввода используется для считывания данных с источника.
  • OutPutStream – поток вывода используется для записи данных по месту назначения.

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

Байтовый поток

Потоки байтов в Java используются для осуществления ввода и вывода 8-битных байтов. Не смотря на множество классов, связанных с потоками байтов, наиболее распространено использование следующих классов: FileInputStream и FileOutputStream. Ниже рассмотрен пример, иллюстрирующий использование данных двух классов для копирования из одного файла в другой.

Примечание по примеру: чтобы скопировать файл, необходимо в папке проекта создать файл file.txt с любым или пустым содержимым.

Пример

Теперь рассмотрим файл file.txt со следующим содержимым:

В качестве следующего шага необходимо скомпилировать java-программу и выполнить ее, что позволит создать файл copied_file. txt с тем же содержимым, что имеется в file.txt. Таким образом, разместим обозначенный код в файле FileCopy.java и выполним следующее действие:

Символьные потоки

Потоки байтов в Java позволяют произвести ввод и вывод 8-битных байтов, в то время как потоки символов используются для ввода и вывода 16-битного юникода. Не смотря на множество классов, связанных с потоками символов, наиболее распространено использование следующих классов: FileReader и FileWriter. Не смотря на тот факт, что внутренний FileReader использует FileInputStream, и FileWriter использует FileOutputStream, основное различие состоит в том, что FileReader производит считывание двух байтов в конкретный момент времени, в то время как FileWriter производит запись двух байтов за то же время.

Мы можем переформулировать представленный выше пример, в котором два данных класса используются для копирования файла ввода (с символами юникода) в файл вывода.

Примечание по примеру: чтобы скопировать файл, необходимо в папке проекта создать файл file. txt с любым или пустым содержимым.

Пример

Теперь рассмотрим файл file.txt со следующим содержимым:

В качестве следующего шага необходимо скомпилировать программу и выполнить ее, что позволит создать файл copied_file.txt с тем же содержимым, что имеется в file.txt. Таким образом, разместим обозначенный код в файле FileCopy.java и выполним следующее действие:

Стандартные потоки

Все языки программирования обеспечивают поддержку стандартного ввода/вывода, где программа пользователя может произвести ввод посредством клавиатуры и осуществить вывод на экран компьютера. Если вы знакомы с языками программирования C либо C++, вам должны быть известны три стандартных устройства STDIN, STDOUT и STDERR. Аналогичным образом, Java предоставляет следующие три стандартных потока:

  • Стандартный ввод – используется для перевода данных в программу пользователя, клавиатура обычно используется в качестве стандартного потока ввода, представленного в виде System.in.
  • Стандартный вывод – производится для вывода данных, полученных в программе пользователя, и обычно экран компьютера используется в качестве стандартного потока вывода, представленного в виде System. out.
  • Стандартная ошибка – используется для вывода данных об ошибке, полученной в программе пользователя, чаще всего экран компьютера служит в качестве стандартного потока сообщений об ошибках, представленного в виде System.err.

Ниже представлена простая программа, которая создает InputStreamReader для чтения стандартного потока ввода, до введения пользователем «q»:

Пример

Разместим представленный выше код в файле ReadConsole.java и попробуем скомпилировать и выполнить его согласно тому, как это представлено в следующей программе. Данная программа продолжает чтение и вывод одного и того же символа до нажатия ‘q’:

Чтение и запись файла

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

Ниже представлена иерархия классов для управления потоками Ввода и Вывода.

В данном уроке нам предстоит рассмотреть два важных потока: FileInputStream и FileOutputStream.

Поток FileInputStream – чтение из файла

Поток FileInputStream – это поток, который используется в Java для чтения данных из файла. Объекты могут быть созданы при использовании ключевого слова new, доступны несколько типов конструкторов.

Представленный конструктор использует имя файла в качестве потока с целью создания объекта входного потока для считывания файла:

Представленный ниже конструктор использует объектный файл с целью создания объекта входного потока для чтения файла. Сперва мы создаем объектный файл при использовании метода File() следующим образом:

Теперь, получив объект InputStream, следует ознакомиться со следующим перечнем вспомогательных методов, которые могут быть использованы для считывания потока либо выполнения иных операций в потоке.

Метод и описание
1public void close() throws IOException
Данный метод в Java закрывает выходной файловый поток. Освобождает какие-либо системные ресурсы, связанные с файлом. Выдает IOException.
2protected void finalize()throws IOException
Данный метод выполняет очистку соединения с файлом. Позволяет удостовериться в вызове закрытого метода данного выходного файлового потока при отсутствии каких-либо ссылок на данный поток. Выдает IOException.
3public int read(int r)throws IOException
Данный метод осуществляет в Java считывание заданных байтов данных из InputStream. Возврат данных типа int. Возврат следующего байта данных, в конце файла будет произведен возврат к -1.
4public int read(byte[] r) throws IOException
Данный метод производит считывание байтов r.length из входного потока в массив. Возврат общего числа считанных байтов. В конце файла будет произведен возврат к -1.
5public int available() throws IOException
Выдает число байтов, которые могут быть считаны из входного файлового потока. Возврат данных типа int.

Существуют также другие доступные входные потоки, более детальные сведения о которых представлены по следующим ссылкам:

Поток FileOutputStream – создание и запись файла

Поток FileOutputStream – это поток, который используется в Java для создания файла и последующей записи в него. Поток создаст файл в случае его отсутствия перед его открытием для вывода.

Далее представлены два конструктора, которые могут быть задействованы при создании объекта FileOutputStream.

Представленный конструктор использует имя файла в качестве строки с целью создания объекта входного потока для записи файла в Java:

Представленный ниже конструктор использует объектный файл с целью создания объекта выходного потока для записи файла. Сперва мы создаем объектный файл при использовании метода File() следующим образом:

Теперь, получив объект OutputStream, следует ознакомиться со следующим перечнем вспомогательных методов, которые могут быть использованы для записи потока либо выполнения иных операций в потоке.

Метод и описание
1public void close() throws IOException
Данный метод в Java закрывает выходной файловый поток. Освобождает какие-либо системные ресурсы, связанные с файлом. Выдает IOException.
2protected void finalize()throws IOException
Данный метод выполняет очистку соединения с файлом. Позволяет удостовериться в вызове закрытого метода данного выходного файлового потока при отсутствии каких-либо ссылок на данный поток. Выдает IOException.
3public void write(int w)throws IOException
Данный метод осуществляет запись заданного байта в выходной поток.
4public 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/:

Package java.io

Report a bug or suggest an enhancement
For further API reference and developer documentation see the Java SE Documentation, which contains more detailed, developer-targeted descriptions with conceptual overviews, definitions of terms, workarounds, and working code examples.
Java is a trademark or registered trademark of Oracle and/or its affiliates in the US and other countries.
Copyright © 1993, 2017, Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
All rights reserved. Use is subject to license terms and the documentation redistribution policy.

Читать «Java: руководство для начинающих (ЛП)» — Шилдт Герберт — Страница 73

Таблица 10.1. Классы байтовых потоковКласс байтового потокаОписаниеBufferedlnputStreamБуферизованный поток вводаBufferedOutputStreamБуферизованный поток выводаByteArrayInputStreamПоток ввода для чтения из байтового массиваByteArrayOutputStreamПоток вывода для записи в байтовый массивDatalnputStreamПоток ввода с методами для чтения стандартных типов данных JavaDataOutputStreamПоток вывода с методами для записи стандартных типов данных JavaFileInputStreamПоток ввода для чтения из файлаFileOutputStreamПоток вывода для записи в файлFilterlnputStreamПодкласс, производный от класса InputStreamFilterOutputStreamПодкласс, производный от класса OutputStreamInputStreamАбстрактный класс, описывающий потоковый вводObjectInputStreamПоток для ввода объектовObjectOutputStreamПоток для вывода объектовOutputStreamАбстрактный класс, описывающий потоковый выводPipedlnputStreamПоток конвейерного вводаPipedOutputStreamПоток конвейерного выводаPrintStreamПоток вывода с методами print () и println ()PushbacklnputStreamПоток ввода с возвратом прочитанных байтов в потокRandomAccessFileКласс, поддерживающий файловый ввод-вывод с произвольным доступомSequenceInputStreamПоток ввода, сочетающий в себе несколько потоков ввода для поочередного чтения данных из нихКлассы символьных потоков

Для определения символьных потоков служат две иерархические структуры классов, на вершине которых находятся абстрактные классы Reader и Writer соответственно. Класс Reader и его подклассы используются для чтения, а класс Writer и его подклассы — для записи данных. Конкретные классы, производные от классов Reader и Writer, оперируют символами в уникоде.

Классы, производные от классов Reader и Writer, предназначены для выполнения различных операций ввода-вывода символов. Символьные классы присутствуют в Java параллельно с байтовыми классами. Классы символьных потоков приведены в табл. 10.2.Таблица 10.2. Классы символьных потоковКласс символьного потокаОписаниеBufferedReaderБуферизованный поток ввода символовBufferedWriterБуферизованный поток вывода символовCharArrayReaderПоток ввода для чтения из символьного массиваCharArrayWriterПоток вывода для записи в символьный массивFileReaderПоток ввода для чтения символов из файлаFileWriterПоток вывода для записи символов в файлFilterReaderКласс для чтения символов с фильтрациейFilterWriterКласс для записи символов с фильтрациейInputStreamReaderПоток ввода с преобразованием байтов в символыLineNumberReaderПоток ввода с подсчетом символьных строкOutputStreamWriterПоток вывода с преобразованием символов в байтыPipedReaderПоток конвейерного вводаPipedWriterПоток конвейерного выводаPrintWriterПоток вывода с методами print () и println ()PushbackReaderПоток ввода с возвратом прочитанных символов в потокReaderАбстрактный класс, описывающий потоковый ввод символовStringReaderПоток ввода для чтения из символьной строкиStringWriterПоток вывода для записи в символьную строкуWriterАбстрактный класс, описывающий потоковый вывод символовВстроенные потоки

Как вам должно быть уже известно, во все программы на Java автоматически импортируется пакет java. lang. В этом пакете определен класс System, инкапсулирующий некоторые элементы среды выполнения программ. Помимо прочего, в нем содержатся предопределенные переменные in, out и err, представляющие стандартные потоки ввода-вывода. Эти поля объявлены как public, final и static. А это означает, что ими можно пользоваться в любой другой части программы, не ссылаясь на конкретный объект типа System.

Переменная System.out ссылается на поток стандартного вывода. По умолчанию этот поток связан с консолью. А переменная System, in ссылается на поток стандартного ввода (по умолчанию с клавиатуры). И наконец, переменная System.err ссылается на поток стандартных сообщений об ошибках, которые по умолчанию выводятся на консоль. По мере необходимости все эти потоки могут быть перенаправлены на другие совместимые устройства ввода-вывода.

Поток System.in представляет собой объект типа InputStream, а потоки System.out и System.err — объекты типа PrintStream. Хотя эти потоки обычно используются для чтения и записи символов, они на самом деле являются байтовыми потоками. Дело в том, что эти потоки были определены в первоначальной спецификации Java, где символьные потоки вообще не были предусмотрены. Как станет ясно в дальнейшем, для этих потоков можно по необходимости создать оболочки, превратив их в символьные потоки.Применение байтовых потоков

Начнем рассмотрение системы ввода-вывода в Java с байтовых потоков. Как пояснялось ранее, на вершине иерархии байтовых потоков находятся классы InputStream и OutputStream. Методы из класса InputStream приведены в табл. 10.3, а методы из класса OutputStream — в табл. 10.4. При возникновении ошибок в процессе выполнения методы из классов InputStream и OutputStream могут генерировать исключения типа IOException. Методы, определенные в этих двух абстрактных классах, доступны во всех подклассах. Таким образом, они формируют минимальный набор функций ввода-вывода, общих для всех байтовых потоков.

Таблица 10.3. Методы, определенные в классе InputStreamМетодОписаниеint available()Возвращает количество байтов, доступных для чтенияvoid close ()Закрывает поток ввода. При последующей попытке чтения из потока генерируется исключение IOExceptionvoid mark(int numBytes)Ставит отметку на текущей позиции в потоке. Отметка доступна до тех пор, пока на будет прочитано количество байтов, определяемое параметром numBytesboolean markSupported()Возвращает логическое значение true, если методы mark() и reset () поддерживаются в вызывающем потокеint read()Возвращает целочисленное представление следующего байта в потоке. Если достигнут конец потока, возвращается значение -1int read(byte buffer[])Предпринимает попытку прочитать количество байтов, определяемое выражением buffer, length, в массив buffer и возвращает фактическое количество успешно прочитанных байтов. Если достигнут конец потока, возвращается значение -1int read(byte buffer[], int offset, int numBytes)Предпринимает попытку прочитать количество байтов, определяемое параметром numBytes, в массив buffer, начиная с элемента buffer[offset]. Если достигнут конец потока, возвращается значение -1void reset()Устанавливает указатель ввода на помеченной ранее позицииlong skip (long numBytes)Пропускает количество байтов, определяемое параметром numBytes, в потоке ввода. Возвращает фактическое количество пропущенных байтов

Таблица 10.4. Методы, определенные в классе OutputStreamМетодОписаниеvoid close()Закрывает выходной поток. При последующей попытке записи в поток генерируется исключение IOExceptionВыводит содержимое выходного буфера вывода вvoid flush()Выводит содержимое выходного буфера вывода в целевой поток. По завершении этой операции выходной буфер очищаетсяvoid write(int b)Записывает один байт в поток вывода. Параметр b относится к типу int, что позволяет вызывать данный метод в выражениях, не приводя результат их вычисления к типу bytevoid write(byte buffer[])Записывает массив в поток выводаvoid write(byte buffer[], int offset, int numBytes)Записывает в поток вывода часть массива buffer длиной numBytes байтов, начиная с элемента buffer[offset]Консольный ввод

Первоначально единственный способ реализовать консольный ввод в Java состоял в использовании байтовых потоков, и во многих программах на Java до сих пор используются исключительно потоки данного типа. В настоящее время для разработки прикладных программ доступны как байтовые, так и символьные потоки. В коммерческих приложениях для чтения данных с консоли в основном используются символьные потоки. Такой подход упрощает локализацию программ и их сопровождение. Ведь намного удобнее оперировать непосредственно символами и не тратить время и труд на преобразование символов в байты, а байтов — в символы. Но в простых служебных и прикладных программах, где данные, введенные с клавиатуры, обрабатываются непосредственно, удобно пользоваться байтовыми потоками. Именно поэтому они здесь и рассматриваются.

Текстовый ввод-вывод — тест 8

Главная / Программирование / Текстовый ввод-вывод / Тест 8

Упражнение 1:


Номер 1

Что такое файловый потоковый ввод-вывод?

Ответ:

&nbsp(1) потоковый вывод на консоль, перенаправленный в файл&nbsp

&nbsp(2) потоковый ввод с консоли, перенаправленный на чтение из файла&nbsp

&nbsp(3) файловый ввод вывод средствами операционной системы&nbsp

&nbsp(4) динамическое связывание и синхронизация буфера в операционной системе и дескриптора файла, позволяющее работать с файлами способом, аналогично работе с устройствами&nbsp

&nbsp(5) файловый ввод-вывод средствами библиотек и API&nbsp



Номер 2

Что такое стандартный поток ошибок?

Ответ:

&nbsp(1) поток для вывода любого текста на консоль&nbsp

&nbsp(2) синоним стандартного потокового вывода&nbsp

&nbsp(3) поток для вывода диагностических сообщений на консоль, отдельно от стандартного потока вывода&nbsp



Номер 3

Как обозначается стандартный поток ошибок на языке Си?

Ответ:

&nbsp(1) cout&nbsp

&nbsp(2) stdout&nbsp

&nbsp(3) stderr&nbsp

&nbsp(4) stdprn&nbsp

&nbsp(5) cerr&nbsp



Упражнение 2:


Номер 1

Что такое стандартный поток печати?

Ответ:

&nbsp(1) потоковый вывод на консоль, перенаправленный на принтер&nbsp

&nbsp(2) вывод вывод средствами операционной системы&nbsp

&nbsp(3) динамическое связывание и синхронизация буфера в операционной системе и драйвера принтера, позволяющие осуществлять вывод на принтер потоковыми функциями&nbsp

&nbsp(4) вывод на принтер средствами библиотек и API&nbsp



Номер 2

Как обозначается стандартный поток ошибок на языке С++?

Ответ:

&nbsp(1) cout&nbsp

&nbsp(2) stdout&nbsp

&nbsp(3) stderr&nbsp

&nbsp(4) stdprn&nbsp

&nbsp(5) cerr&nbsp



Номер 3

Как обозначается стандартный поток печати на языке Си?

Ответ:

&nbsp(1) cout&nbsp

&nbsp(2) stdout&nbsp

&nbsp(3) stderr&nbsp

&nbsp(4) stdprn&nbsp

&nbsp(5) cerr&nbsp



Упражнение 3:


Номер 1

Как обозначается стандартный поток печати на языке С++?

Ответ:

&nbsp(1) cout&nbsp

&nbsp(2) stdout&nbsp

&nbsp(3) stderr&nbsp

&nbsp(4) stdprn&nbsp

&nbsp(5) cerr&nbsp



Номер 2

Какая функция используется для файлового форматированного ввода данных средствами языка Си?

Ответ:

&nbsp(1) fscanf&nbsp

&nbsp(2) scanf&nbsp

&nbsp(3) fgets&nbsp

&nbsp(4) gets&nbsp



Номер 3

Какая функция используется для файлового неформатированного ввода данных средствами языка Си?

Ответ:

&nbsp(1) fscanf&nbsp

&nbsp(2) scanf&nbsp

&nbsp(3) fgets&nbsp

&nbsp(4) gets&nbsp



Упражнение 4:


Номер 1

Какой функцией языка Quick Basic можно осуществить вывод текстовых данных в стандартный поток ошибок?

Ответ:

&nbsp(1) PRINT&nbsp

&nbsp(2) LPRINT&nbsp

&nbsp(3) PRINT USING&nbsp

&nbsp(4) LPRINT USING&nbsp

&nbsp(5) EPRINT&nbsp

&nbsp(6) никакой из вышеперечисленных&nbsp



Номер 2

Каким из нижеперечисленных способов можно осуществить вывод в стандартный поток ошибок на языке Perl?

Ответ:

&nbsp(1) print&nbsp

&nbsp(2) print SDERR&nbsp

&nbsp(3) warn&nbsp

&nbsp(4) die&nbsp

&nbsp(5) никакими из вышеперечисленных&nbsp



Номер 3

Какие функции языка Си используются для открытия потока файлов и связывания его с файлом?

Ответ:

&nbsp(1) fopen&nbsp

&nbsp(2) fclose&nbsp

&nbsp(3) fcloseall&nbsp

&nbsp(4) feof&nbsp

&nbsp(5) ferror&nbsp

&nbsp(6) fseek&nbsp

&nbsp(7) ftell&nbsp

&nbsp(8) ни один из названных&nbsp



Упражнение 5:


Номер 1

Какие функции языка Си используются для закрытия потоков данных, ассоциированных с файлами?

Ответ:

&nbsp(1) fopen&nbsp

&nbsp(2) fclose&nbsp

&nbsp(3) fcloseall&nbsp

&nbsp(4) feof&nbsp

&nbsp(5) ferror&nbsp

&nbsp(6) fseek&nbsp

&nbsp(7) ftell&nbsp

&nbsp(8) ни один из названных&nbsp



Номер 2

Какие функции языка C++ используются для открытия потока файлов и связывания его с файлом?

Ответ:

&nbsp(1) Конструктор создания потока&nbsp

&nbsp(2) метод open&nbsp

&nbsp(3) метод close&nbsp

&nbsp(4) метод tellg&nbsp

&nbsp(5) метод tellp&nbsp

&nbsp(6) метод seekg&nbsp

&nbsp(7) метод seekp&nbsp

&nbsp(8) ни один из названных&nbsp



Номер 3

Какие функции языка C++ используются для закрытия потока файлов и ассоциированного с ним файла?

Ответ:

&nbsp(1) Конструктор создания потока&nbsp

&nbsp(2) метод open&nbsp

&nbsp(3) метод close&nbsp

&nbsp(4) метод tellg&nbsp

&nbsp(5) метод tellp&nbsp

&nbsp(6) метод seekg&nbsp

&nbsp(7) метод seekp&nbsp

&nbsp(8) ни один из названных&nbsp



Упражнение 6:


Номер 1

Какой тип языка Java может быть ассоциированным с файлом для записи?

Ответ:

&nbsp(1) SavitchIn&nbsp

&nbsp(2) PrintWriter&nbsp

&nbsp(3) BufferedReader&nbsp



Номер 2

Какой тип языка Java может быть ассоциированным с файлом для чтения?

Ответ:

&nbsp(1) SavitchIn&nbsp

&nbsp(2) PrintWriter&nbsp

&nbsp(3) BufferedReader&nbsp



Номер 3

Какие функции языка Turbo Prolog используются для чтения всего файла в текстовую переменную?

Ответ:

&nbsp(1) openread&nbsp

&nbsp(2) openwrite&nbsp

&nbsp(3) readdevice&nbsp

&nbsp(4) writedevice&nbsp

&nbsp(5) closefile&nbsp

&nbsp(6) filepos&nbsp

&nbsp(7) file_str&nbsp



Главная / Программирование / Текстовый ввод-вывод / Тест 8

Учебное пособие по вводу-выводу Java с примерами

Учебник ввода-вывода Java с примерами


Это полное актуальное руководство по работе с файлами в Java. Исходный код этого руководства хорошо протестирован в нашей локальной среде разработки, а код анализируется с помощью инструментов статического анализа кода SonatLint, PMD и т. д.

Исходный код из этого руководства не содержит ошибок и использует JDK 8 для компиляции и выполнения исходного кода.

Основы ввода-вывода Java

  • Обзор ввода-вывода Java. В этой статье мы изучим основы ввода-вывода Java, обзор различных потоков ввода-вывода из пакета java.io, обзор классов в пакет Java IO (java.io) и Java IO Purposes and Features.
  • Потоки байтов ввода-вывода Java. В этом посте мы узнаем, как разрабатывать программы, которые используют потоки байтов для ввода и вывода 8-битных байтов.
  • Символьные потоки ввода-вывода Java. В этом посте мы обсудим классы ввода-вывода символьного потока с примерами.
  • Буферизированные потоки ввода-вывода Java. В этой статье мы обсудим четыре класса буферизованных потоков, используемых для переноса небуферизованных потоков с примерами.
  • Потоки объектов ввода-вывода Java. Мы рассмотрим классы потоков объектов: ObjectInputStream и ObjectOutputStream . Эти классы реализуют ObjectInput и ObjectOutput, которые являются подинтерфейсами DataInput и DataOutput.
  • Потоки данных ввода-вывода Java. В этой статье мы обсудим классы потока данных DataInputStream и DataOutputStream с примерами.

    Классы ввода-вывода Java

    • Класс FileOutputStream в Java. В этой статье мы обсудим конструкторы класса FileOutputStream, методы и API с примерами.
    • Класс FileInputStream в Java. В этой статье мы обсудим конструкторы класса FileInputStream, методы/API с примерами.
    • Класс ByteArrayOutputStream в Java. В этой статье мы обсудим конструкторы класса ByteArrayOutputStream, методы и API с примерами.
    • Класс ByteArrayInputStream в Java. В этой статье мы обсудим конструкторы класса ByteArrayInputStream, методы и API с примерами.
    • Класс BufferedWriter в Java. В этой статье мы обсудим конструкторы класса BufferedWriter, методы/API с примерами.
    • Класс BufferedReader в Java. В этой статье мы обсудим конструкторы класса BufferedReader, методы/API с примерами.
    • Класс BufferedOutputStream в Java. В этой статье мы обсудим конструкторы класса BufferedOutputStream, методы и API с примерами.
    • Класс BufferedInputStream в Java. В этой статье мы обсудим конструкторы класса BufferedInputStream, методы/API с примерами.
    • Класс FileWriter в Java. В этой статье мы обсудим конструкторы класса FileWriter, методы/API с примерами.
    • Класс FileReader в Java. В этой статье мы обсудим конструкторы класса FileReader, методы/API с примерами.
    • Класс DataOutStream в Java. В этой статье мы обсудим конструкторы класса DataOutStream, методы/API с примерами.
    • Класс DataInputStream в Java. В этой статье мы обсудим конструкторы класса DataInputStream, методы и API с примерами.
    • Класс ObjectOutputStream в Java. В этой статье мы обсудим конструкторы класса ObjectOutputStream, методы и API с примерами.
    • Класс ObjectInputStream в Java. В этой статье мы обсудим конструкторы класса ObjectInputStream, методы и API с примерами.

    Примеры обработки файлов

    • Как создать новый файл в Java. В этой статье мы узнаем, как создать файл с помощью программы Java.
    • Как записать файл на Java. В этом примере мы будем использовать класс BufferedWriter для записи файла. Существуют и другие классы Stream Output для записи файла, но в этом примере мы сосредоточимся на часто используемом BufferedWriter.
    • Как удалить файл в Java. Удалить файл из определенного каталога очень просто. Класс Java File предоставляет метод delete(), который можно использовать для удаления файлов или пустого каталога/папки в java.
    • Как скопировать файл в Java. В этом примере показано, как скопировать файл с помощью программы Java.
    • Как переместить файл в Java. В этом примере показано, как переместить файл с помощью программы Java.
    • Как переименовать файл в Java — в этом примере мы будем renameTo() метод для переименования файла.
    • Как добавить файл в Java – в этом примере показано, как добавить файл с помощью программы Java.
    • Чтение файла с помощью BufferReader. В этом примере мы будем использовать класс BufferedReader для чтения файла с именем «sample.txt». Класс BufferedReader используется для чтения текста из символьного потока ввода. Его можно использовать для чтения данных построчно методом readLine() . Это делает производительность быстрой.
    • Чтение файла с помощью BufferInputStream. В этом примере мы будем использовать класс BufferedInputStream для чтения файла. Класс BufferedInputStream используется для чтения информации из потока. Он внутренне использует буферный механизм для повышения производительности.
    • Чтение файла с помощью DataInputStream. В этом примере мы будем использовать класс DataInputStream для чтения файла. Поток ввода данных позволяет приложению считывать примитивные типы данных Java из базового потока ввода машинно-независимым способом. Приложение использует поток вывода данных для записи данных, которые впоследствии могут быть прочитаны потоком ввода данных.
    • Получить размер файла в байтах КБ МБ ГБ ТБ – в этом примере мы напишем универсальный метод для получения размера файла в байтах, килобайтах, мегабайтах, ГБ, ТБ.

      Примеры сериализации файлов

      • Как записать объект в файл на Java. В этом примере мы будем использовать класс ObjectOutputStream для записи объекта сотрудника в файл.
      • Как прочитать объект из файла. В этом примере мы будем использовать класс ObjectInputStream для чтения объекта сотрудника в файл.

        Примеры сжатия файлов

        • Сжатие файлов в формате ZIP на Java. В этой статье мы покажем вам, как сжать один файл в формат zip и несколько файлов в формат zip. В примере из этой статьи используется оператор try-with-resources для автоматического закрытия ресурсов, а также компиляции и выполнения в JDK 8 и более поздних версиях.
        • Распаковка файлов из ZIP-файла в Java. В этой статье мы покажем вам, как его распаковать. В примере из этой статьи используется оператор try-with-resources для автоматического закрытия ресурсов, а также компиляции и выполнения в JDK 8 и более поздних версиях.

          Примеры обработки каталогов

          • Как получить текущий рабочий каталог в Java. Текущий рабочий каталог означает корневую папку вашего текущего проекта Java. Его можно получить с помощью следующей функции системных свойств.
          • Создать каталог. В этом примере мы создадим программу Java для создания каталога в файловой системе.
          • Удалить каталог. В этом примере мы удалим каталог с помощью программы Java.
          • Копировать каталог. Мы напишем программу на Java для копирования каталога.
          • Обход/список структуры каталогов — мы перечислим количество файлов в каталоге с помощью программы Java.
          • Проверить, пуст ли каталог – Java-программа для проверки того, пуст ли каталог.

          File Utilities (Development)

          • Java File Utility Class. В этой статье мы покажем вам список часто используемых методов файловых утилит. Этот класс файловой утилиты содержит более 20 методов файловой утилиты, и все они являются широко используемыми методами. Надеюсь, этот класс FileUtils. java поможет.
          • Класс утилиты Java Zip. В этой статье мы обсудим несколько часто используемых методов утилиты Java Zip. Мы также можем показать вам примеры тестов JUnit для методов утилиты zip. ZipUtils содержит следующие общие методы.
          • Лучшие методы работы с файлами. В этой статье мы обсудим 20 полезных часто используемых методов работы с файлами. Вы можете использовать эти методы файловых утилит в своей повседневной работе над проектом. Я нашел эти служебные методы полезными и решил поделиться ими со всеми вами.

          Справочник по вводу-выводу Java

          • https://docs.oracle.com/javase/tutorial/essential/io/index.html
          • https://docs.oracle.com/javase/8/docs/api/java/io/package-tree.html

            Репозиторий GitHub

            • https://github.com/RameshMF/java-io-guide

              Посмотрите этот курс на YouTube по адресу Spring Boot Tutorial | Стоимость 10 часов полного курса

              Поток ввода файлов Java в Ubuntu 20.04

              «В этой статье мы обсудим различные способы чтения данных из файлов в массив байтов с использованием класса потока ввода Java. Этот класс представляет отсортированный поток байтов из файла. В классе Java Input Stream есть несколько широко используемых функций, которые будут обсуждаться в этой статье, например, методы read(), available(), skip() и close(). Эти методы используются для чтения файлов с различными расширениями, таких как файлы bin или txt, и могут быть изменены для получения информации из любой точки файла. В этой статье мы реализуем эти методы в среде Ubuntu 20.04.

              Существует множество других методов класса File Input Stream, которые также очень полезны при получении данных из файла; некоторые из них имеют тип int read(byte[] b), эта функция считывает данные из входного потока длиной до b. length байт. Файловый канал получает канал(): с его помощью возвращается конкретный объект файлового канала, подключенный к входному потоку файла. Finalize() используется для обеспечения того, чтобы функция close() вызывалась, когда больше нет ссылки на входной поток файла».

              Пример 01. Чтение одного байта из текстового файла с использованием методов read() и close() класса потока ввода

              В этом примере поток ввода файла используется для чтения одного символа и вывода содержимого. Предположим, у нас есть файл с именем «file.txt» с показанным ниже содержимым:

              Предположим, у нас есть файл с именем «file.txt» с содержимым, показанным выше. Давайте теперь попробуем прочитать и напечатать первый символ файла.

              Сначала мы должны импортировать java.io. Пакет File Input Stream для создания потока ввода файла. Затем мы создадим новый объект File Input Stream, который будет связан с указанным файлом (file.txt) в переменной «f».

              В этом примере мы будем использовать метод «int read()» класса Java File Input Stream, который используется для чтения одного байта из файла и сохранения его в переменной «I». Затем «System.out.print(char(i))» отображает символ, соответствующий этому байту.

              Метод f.close() закрывает файл и поток. Мы получим следующий вывод после создания и запуска вышеупомянутого скрипта, поскольку мы видим, что печатается только начальная буква текста «L».

              Пример 02. Чтение всего содержимого текстового файла с использованием методов read() и close() класса входного потока

              В этом примере мы будем читать и отображать все содержимое текстового файла; как показано ниже:

              И снова мы будем импортировать java.io. Пакет File Input Stream для создания потока ввода файла.

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

              После компиляции и выполнения приведенного выше кода мы получим следующие результаты. Как видим, в терминале отображается весь текст файла «Lorep Ipsum».

              Пример 03. Определение количества доступных байтов в текстовом файле с помощью метода available() класса входного потока

              определить количество существующих байтов во входном потоке файла.

              Сначала мы сгенерировали объект класса файлового входного потока с именем «a» со следующим кодом. В строке 5 мы использовали метод «доступный ()», чтобы определить и отобразить общее количество доступных байтов в файле. Затем, начиная со строки 6 и заканчивая строкой 8, мы трижды использовали функцию «read()». Теперь в строке 9 мы снова использовали метод «доступный ()», чтобы проверить и отобразить оставшиеся байты.

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

              Пример 04. Пропуск байтов текстового файла для чтения данных из определенной точки с использованием метода skip() класса входного потока

              В этом примере мы будем использовать метод «skip(x)». входного потока файлов, который используется для игнорирования и игнорирования заданного количества байтов данных из входного потока.

              В приведенном ниже коде мы сначала создали входной поток файла и сохранили его в переменной «a». Затем мы использовали метод «a.skip(5)», который пропускает первые 5 байтов файла. Затем мы напечатали оставшиеся символы файла, используя метод «read()» внутри цикла while. Наконец, мы закрыли входной поток файла методом close().

              Ниже скриншот терминала после компиляции и запуска кода. Как мы видим, отображается только «Ipsum», так как мы пропустили первые 5 байтов с помощью метода «skip()».

              Заключение                            

              В этой статье мы обсудили использование класса File Input Stream и его различных методов; read(), available(), skip() и close(). Мы использовали эти методы для чтения первого элемента файла с помощью методов read() и close(). Затем мы читаем весь файл с помощью итеративного подхода и с использованием тех же методов. Затем мы использовали метод available() для определения количества байтов в начале и в конце файла. После этого мы использовали метод skip() для пропуска нескольких байтов перед чтением файла, что позволило нам получить именно те данные, которые нам были нужны.

              Обзор ввода-вывода Java

              В этом тексте я попытаюсь дать вам обзор классов в пакете Java IO ( java.io ). В частности, я попытаюсь сгруппировать классы по их назначению. Эта группировка должна сделать вам будет проще в будущем, определить цель занятия, или найти нужный вам класс для конкретной цели.

              Ввод и вывод – источник и назначение

              Термины «вход» и «выход» иногда могут немного сбивать с толку. Ввод одной части приложения часто является результатом другого. OutputStream поток, в который записывается вывод, или вывод выходит из (вам читать)? В конце концов, InputStream выводит свои данные в программа для чтения, не так ли? Лично меня это немного сбивало с толку в тот день, когда я впервые начал изучать Java IO.

              Пытаясь устранить эту возможную путаницу, я попытался ввести несколько разных имен для входных и выходных данных. попытаться концептуально связать их с тем, откуда поступает вход и куда идет вывод.

              Пакет ввода-вывода Java в основном занимается чтением необработанных данных из источника и записью необработанных данных в пункт назначения. Наиболее типичными источниками и получателями данных являются следующие:

              • Файлы
              • Трубы
              • Сетевые подключения
              • Буферы в памяти (например, массивы)
              • System. in, System.out, System.error

              На приведенной ниже диаграмме показан принцип чтения программой данных из источника и их записи. в какой-то пункт назначения:

              SourceProgramDestination

              Потоки

              Потоки ввода-вывода — это основная концепция ввода-вывода в Java. Поток — это концептуально бесконечный поток данных. Вы можете либо читать из потока, либо записывать в поток. Поток подключается к источнику данных или месту назначения данных. Потоки в Java IO может быть либо на основе байтов (чтение и запись байтов), либо на основе символов (чтение и запись символов).

              Поток ввода, поток вывода, чтение и запись

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

              SourceInputStream/ReaderProgramProgramOutputStream/WriterDestination

              InputStream или Reader связаны с источником данных. Выходной поток или Устройство записи связано с местом назначения данных.

              Назначение и функции ввода-вывода Java

              Java IO содержит множество подклассов InputStream , OutputStream , Reader и Writer классов. Причина в том, что все эти подклассы предназначены для разных целей. Вот почему так много разных классов. Решаемые цели резюмируются ниже:

              • Доступ к файлам
              • Доступ к сети
              • Доступ к буферу внутренней памяти
              • Межпоточная связь (каналы)
              • Буферизация
              • Фильтрация
              • Разбор
              • Чтение и запись текста (читатели/писатели)
              • Чтение и запись примитивных данных (long, int и т. д.)
              • Чтение и запись объектов

              Об этих целях полезно знать при чтении классов Java IO. Они сделать несколько проще понять, на что нацелены классы.

              Обзор класса ввода-вывода Java Таблица

              Обсудив источники, пункты назначения, ввод, вывод и различные целевые цели ввода-вывода по классам Java IO, вот таблица, в которой перечислены большинство (если не все) Классы ввода-вывода Java, разделенные на ввод, вывод, основанные на байтах или символах, и любая более конкретная цель, к которой они могут обращаться, например буферизация, синтаксический анализ и т. д.

                Байт на основе На основе символов
                Вход Выход Вход Выход
              Базовый Входной поток Выходной поток Читатель
              InputStreamReader
              Устройство записи
              Устройство записи выходного потока
              Массивы ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
              Файлы FileInputStream
              RandomAccessFile
              FileOutputStream
              RandomAccessFile
              FileReader FileWriter
              Трубы PipedInputStream PipedOutputStream PipedReader PipedWriter
              Буферизация BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
              Фильтрация Фильтринпутпоток ФильтрВыходнойПоток Устройство чтения фильтров Писатель-фильтр
              Разбор PushbackInputStream
              StreamTokenizer
                PushbackReader
              LineNumberReader
               
              Струны     Устройство чтения строк StringWriter
              Данные DataInputStream DataOutputStream  
              Данные — отформатированные   PrintStream   Принтрайтер
              Объекты ObjectInputStream ObjectOutputStream    
              Коммунальные услуги секвенсеинпутпоток
                   

              Примеры ввода/вывода Java

              1. Что такое ввод-вывод Java?
                Ввод/вывод Java означает ввод/вывод Java. Он предоставляется java.io упаковка. Этот пакет имеет InputStream и OutputStream. Java InputStream — это определено для чтения потока, потока байтов и массива потока байтов.
              2. Классы и интерфейсы потоков ввода-вывода
                , следующий за списком классов, предоставленным java.io пакет, показанный в данной таблице.
                 
              3. Чтение текста из стандартный ввод
                Java предоставляет стандартные средства ввода/вывода для чтения текста через либо из файла, либо с клавиатуры в командной строке. Эта программа иллюстрирует, как использовать стандартный ввод для чтения пользовательского ввода.
              4. Работа с Файлы
                Класс Файл занимается машинно-зависимые файлы машинно-независимым способом, т.е. легче писать независимый от платформы код, который проверяет файлы и манипулирует ими с помощью Файл учебный класс. Этот класс доступен в java.lang . упаковка.
                • Создать файл
                • Создание пути имени файла
                • Читать файл
                • Запись в файл
                • Добавление к Файл
                • Получение размер файла
                • Количество строк определенного файла
                • Переименование Файл или каталог
              5. Копирование файла в другой Файл
              6. Копирование нескольких файлов
              7. Перемещение Файл или каталог в другой каталог
              8. Удаление файл или каталог
              9. Изменить временную метку файла
              10. Создать временный файл
              11. Удалить временный файл
              12. Получение абсолютного пути и родители имени файла

              Видео: Изучение пакетов ввода-вывода Java

              1. Работа с Каталог
                В разделе вы узнаете как создается каталог. Помимо этого, вы также будете знать от некоторых манипуляций, которые выполняются 
                в каталоге.
                • Создание каталога
                • Копирование каталога или файла
              2. Обход файлов и каталогов
              3. Получение текущего рабочего каталога
              4. Получение времени модификации файла или каталога
              5. Список файлов или
              6. Подкаталоги
              7. Удаление файла

              8. Фильтровать потоки ввода-вывода
                Аналогично потокам ввода-вывода, Фильтровать потоки также используются для манипулировать чтением данных из основного потока. . Кроме этого, это позволяет пользователю создать цепочку, используя несколько входных потоков, так что операции, которые должны быть применены в этой цепочке, может создавать комбинированные эффекты на несколько фильтров.
              • Введение
              • Написать файл
              • Прочитать файл
              • Другой Потоки
            • Обзор потоков данных ввода-вывода
              Потоки данных — это отфильтрованные потоки, выполняющие двоичные Операция ввода-вывода со значениями примитивного типа данных (boolean, char, byte, short, int, long и т. д.), а также для строковых значений. Если вам нужно работать с данными, которые не представлены в виде байтов или символов, тогда вы можете использовать потоки данных.
              • Работа с PrintStream

            • с использованием произвольного доступа Файл
              В этом разделе вы узнаете о файле произвольного доступа учебный класс предоставлено java. пакет ио . Это класс, который позволяет вам читать и записывать произвольные байты, текст и примитивные типы данных Java из или в любое указанное место в файле.
            • Преобразование Имя файла Путь к URL-адресу
              В этом разделе вы узнаете, как имя файла путь преобразуется в URL и наоборот. URL означает униформа Локатор ресурсов.
                  
            • Создание токенов исходного кода Java
              В Java класс StreamTokenizer используется для простого разбор исходного файла Java на токены. Этот класс принимает ввод поток, разбивает текст ASCII в файле и разбирает его на «жетоны». Это позволяет считывать токены по одному.
            • Введение в кодирование
              Программы Java используют внутри текст Unicode. Он поддерживает стандартный UTF-8 при чтении и записи строк. через InputStreamReader и OutputStreamWriter .
              • Чтение в кодировке UTF-8 Данные
              • Запись в кодировке UTF-8 Данные
              • Чтение ISO Latin-1 Закодированные данные
              • Запись ISO Данные в кодировке Latin-1
            • Сериализация Объект
              Сериализация
              — это процесс сохранения объекта в хранилище носитель (такой как файл или буфер памяти) или передать его через сетевое соединение в бинарном виде.
                
            • Десериализация Объект
              Противоположная операция сериализации называется десериализация т.е. извлечение данных из последовательности байтов известно как десериализация
            • Удалить файл или каталог
              В этом примере мы обсуждаем удаление файл или каталог с помощью программы Java. Мы передаем имя файла или имя каталога, в который мы хотим удалить.
            • Загрузка и просмотр исходного HTML-кода страницы, т. е. работающей на сервер
              В этом разделе показана процедура просмотра полный html-код страницы, т.е. работающий на сервере.
            • URL-файл Загрузите и сохраните в локальном каталоге
              Этот программный файл загрузите с URL-адреса и сохраните этот указанный каталог. Эта программа указывает путь к каталогу, в котором файлы для храниться как первый аргумент командной строки и второй аргумент командной строки указывает файл URL, который необходимо сохранить.
            • Создание XML-файла из плоского файла и вставка данных в базу данных
              В этом разделе мы разработали приложение для создать XML-файл из плоского файла и вставить данные в базу данных на Java.
            • Разное

              • Сжатие потоков

              • Почтовый файл

              • Папка на молнии

              • Распаковать файл

              • Код для сбора мусора

            • Пример удаления файла
              В этом разделе вы узнаете, как удалить файл.
            • Буферный считыватель
              В этом разделе вы узнаете, как построчно читать данные из файла. с помощью BufferedReader.
            • Поток ввода файлов
              Java имеет два типа потоков: байты и символы.
            • Поток вывода файла
              Как мы обсуждали ранее, в java есть два типа потоков: байтовые и потоки. Персонажи.
            • Дата последнего изменения
              Этот раздел содержит подробную информацию о том, как получить последнюю модификацию дата файла.
            • Обработка файлов Java
              Для обработки файлов в Java используется пакет, известный как java.io . доступный.
            • Сравнение файлов
              В этом разделе мы обсудим, как сравнить путь к двум файлам для равенство их пути.
            • Пример буферизованного записывающего устройства чтения файла
              В этом разделе вы узнаете, как писать в файл с помощью BufferedWriter.
            • Пример копирования файла
              В этом разделе вы узнаете, как скопировать содержимое одного файла в другой файл.
            • Обработка файлов в Java
              В этом разделе мы обсудим, как файлы могут обрабатываться в Java.
            • Байтовые потоки ввода/вывода Java
              В этом разделе мы обсудим потоки байтов ввода/вывода.
            • Потоки символов ввода/вывода Java
              В этом разделе мы обсудим потоки символов ввода/вывода.
            • Буферизованные потоки ввода-вывода Java
              В этом разделе мы обсудим буферизованные потоки ввода-вывода.
            • Потоки данных ввода/вывода Java
              В этом руководстве мы обсудим потоки данных ввода-вывода Java.
            • Потоки объектов ввода/вывода Java
              В этом разделе мы обсудим потоки объектов ввода-вывода Java.
            • Сканирование и форматирование в Java
              В этом мы обсудим сканирование ввода-вывода Java и форматирование.
            • Ввод/вывод Java из командной строки
              В этом разделе мы узнаем о вводе-выводе из командной строки в Ява.
            • Путь ввода-вывода Java
              В этом разделе мы обсудим путь ввода-вывода Java.
            • Класс пути Java
              В этом разделе мы обсудим все аспекты класса Path в Java.
            • Пример ввода/вывода ввода-вывода Java
              В этом разделе мы обсудим InputStream в Java.
            • Пример потоков байтов Java
              В этом разделе мы обсудим, как читать по одному байту за раз из входной поток.
            • Java IO SequenceInputStream Пример
              В этом уроке мы узнаем о классе SequenceInputStream.
            • Java FileInputStream
              В этом разделе мы обсудим Java IO FileInputStream.
            • Java PipedInputStream
              В этом примере мы обсудим Java PipedInputStream.
            • Java ObjectInputStream
              В этом примере мы обсудим класс Java ObjectInputStream.
            • Пример Java FilterInputStream
              В этом руководстве мы обсудим класс FilterInputStream в Java.
            • Выходной поток ввода-вывода Java
              В этом разделе мы прочитаем о классе OutputStream пакета java.io.
            • Пример Java FileOutputStream
              В этом разделе мы обсудим Java IO FileOutputStream.
            • Java ByteArrayOutputStream Пример
              В этом разделе мы обсудим байтовые потоки Java IO ByteArrayOutputStream. учебный класс.
            • Java PipedOutputStream
              В этом руководстве мы обсудим Java PipedOutputStream.
            • Java PipedInputStream и PipedOutputStream
              В этом разделе мы обсудим PipedInputStream и PipedOutputStream в Java.
            • Java ObjectOutputStream
              В этом руководстве мы обсудим класс Java ObjectOutputStream.
            • Java ObjectOutputStream ObjectInputStream
              В этом разделе мы обсудим ObjectOutputStream и ObjectInputStream в Java.
            • Пример Java FilterOutputStream
              В этом разделе мы обсудим класс FilterOutputStream в Java.
            • Устройство чтения ввода/вывода Java
              В этом разделе мы обсудим класс Reader в Java.
            • Устройство чтения файлов ввода/вывода Java
              В этом уроке мы узнаем о классе FileReader в Java.
            • Буферизованный считыватель ввода-вывода Java
              В этом разделе мы обсудим класс BufferedReader в Java.
            • Java IO CharArrayReader
              В этом уроке мы узнаем о классе CharArrayReader в Java.
            • Java IO FilterReader
              В этом разделе мы узнаем о классе FilterReader в Java.
            • Java IO StringReader
              В этом разделе мы обсудим класс StringReader в Java.
            • Java IO InputStreamReader
              В этом разделе мы обсудим InputStreamReader в Java.
            • Java IO PipedReader
              В этом разделе мы обсудим PipedReader в Java.
            • Java IO LineNumberReader
              В этом руководстве мы узнаем о LineNumberReader в Java.
            • Java PushbackReader
              В этом разделе мы обсудим класс PushbackReader в Java.
            • Java IO Writer
              В этом разделе мы обсудим класс Writer в Java.
            • Java IO BufferedWriter
              В этом разделе мы обсудим класс BufferedWriter в Java.
            • Java IO CharArrayWriter
              В этом руководстве мы узнаем о CharArrayWriter в Java.
            • Java IO FilterWriter
              В этом примере мы обсудим FilterWriter в Java.
            • Java IO OutputStreamWriter
              В этом разделе мы узнаем о Java OutputStreamWriter.
            • Java IO PipedWriter
              В этом руководстве мы узнаем о PipedWriter в Java.
            • Java IO PrintWriter
              В этом уроке мы узнаем о классе PrintWriter в Java.
            • Java IO StringWriter
              В этом разделе мы обсудим StringWriter в Java.
            • Стандартный ввод командной строки в Java
              В этом разделе мы обсудим стандартный ввод ввода-вывода Java через командную строку.
            • Стандартный вывод командной строки в Java
              В этом разделе мы обсудим стандартный вывод командной строки Java IO.
            • Стандартная ошибка командной строки в Java
              В этом разделе мы обсудим стандартную ошибку командной строки Java IO.
            • Как прочитать строку из командной строки в Java
              В этом разделе мы обсудим, как можно прочитать строку через командную строку.
            • Как читать целое число из командной строки в Java
              В этом разделе мы обсудим, как можно прочитать целое число через командную строку.
            • Файл ввода-вывода Java
              В этом разделе мы обсудим класс File в Java.
            • Как создать новый файл
              В этом разделе мы обсудим, как создать новый файл в Java.
            • Как читать файл в Java
              В этом разделе мы обсудим, как данные файла могут быть прочитаны в Java.
            • Путь к файлу конструкции Java
              В этом разделе мы обсудим, как создать путь к файлу в Java.
            • 43 основных вопроса интервью с вводом-выводом и файловой системой Java с ответами для опытных от 1 до 3 лет

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

              Одной из причин задержки было то, что я стремился создать действительно большой пост с более чем 100 вопросами и ответами в одном месте, как я делал это для Core Java Interview Questions ранее, но этого не произошло, и этот пост застрял.

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

              Если вам интересно, что такое Java IO или Java NIO, позвольте мне дать вам краткий обзор. Java IO — это не что иное, как набор классов, которые помогут вам справиться с чтением ввода и записью вывода, таких как File, Directory, InputStream, OutputStream, Reader, Writer, BufferedReader, BufferedWriter, Scanner и т. д.

              Они в основном из java .io, который является основным пакетом JDK, но не импортируется автоматически как java.lang. Этот пакет появился с самого начала JDK, а еще один пакет java.nio был введен для улучшения и ускорения операций ввода-вывода. Это называется New Input-Output или просто пакетом N-I-O. Он содержит такие классы, как Channel, ByteBuffer, FileChannel, Selector, которые поддерживают мультиплексирование и асинхронный ввод-вывод.

              Хорошее знание всех этих классов является обязательным для любого разработчика Java, и если вы чувствуете, что еще не касались их или не имеете достаточного опыта работы с ними, я предлагаю вам пройти всеобъемлющий курс Java, такой как The Complete Java Masterclass. Курс Тима Бучалаки на Udemy, чтобы изучить их глубже. Они не только помогут вам писать более качественные Java-приложения, но также очень помогут вам во время собеседований по Java и дадут вам преимущество перед другими кандидатами.

              В этой статье я поделюсь некоторыми из популярных вопросов для интервью на основе Java IO. Какие-то из них простые, какие-то сложные, какие-то сложные, а какие-то действительно сложные вопросы. Если вы работали Java-разработчиком в течение 2-3 лет, то, скорее всего, вы можете ответить на 60% этих вопросов, но если вы не можете, то это тоже хорошо, потому что многие Java-разработчики не работают с вводом-выводом, как в основном другие. старшие разработчики делают.

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

              В любом случае, не теряя вашего времени, вот мой список некоторых часто задаваемых вопросов на собеседовании по Java IO:

              1. Какой класс используется для создания каталога в Java? (ответ)
              Это сложно, потому что нет класса Directory, класс File используется для создания как файла, так и каталога в Java. Вы можете увидеть связанный ответ для более подробной информации.

              2. Как создать файл и каталог в Java? (ответ)

              3. В чем разница между InputStream и OutputStream в Java? (ответ)
              InputStream используется для чтения данных из таких источников, как File, Socket или Console, а OutputStream используется для записи данных в место назначения, например File, Socket или Console.

              4. Можно ли создать символическую ссылку из программы Java на поддерживаемых платформах, таких как UNIX? (ответ)

              5. В чем разница между FileInputStream и FileReader в Java IO? (ответ)

              6. В чем разница между BufferedReader и FileReader в Java? (ответ)
              BufferedReader — это декоратор, который обеспечивает буферизацию для более быстрого ввода-вывода, а FileReader используется для чтения данных из файла.

              7. В чем разница между BufferedReader и Scanner в Java? (ответ)

              8. В чем разница между Scanner и FileReader в Java? (ответ)

              9. Каково использование класса PrintStream в Java IO? (ответ)
              PrintStream используется для записи данных в консоль, например, System.out.println(), здесь out является объектом класса PrintStream, и мы вызываем метод println() из этого класса.

              10. Как правильно закрывать потоки в Java? (ответ)
              Дважды проверьте, не забыли ли вы обработать исключение при закрытии потока. Смотрите связанный ответ для подробного объяснения.

              11. Зачем нужно закрывать потоки в блоке finally? (ответ)
              Это связано с предыдущим вопросом, и мы делаем это, потому что блок finally всегда выполняется независимо от исключения в блоке try или нет.

              12. Зачем нужен отдельный блок try-catch внутри, чтобы окончательно закрыть потоки ввода и вывода? (ответ)

              13. Что такое файловый дескриптор? (ответ)

              14. Можем ли мы контролировать каталог для добавления новых файлов в Java? (ответ)

              15. Как вы обрабатываете большой файл в Java? (ответ)

              16. Что такое оператор try-with-resource в Java? (ответ)

              17. Как преобразовать файл в строку в Java? (ответ)

              18. Как скопировать файл в Java? (ответ)

              19. Как проверить права доступа к файлу или каталогу в Java? (ответ)

              20. Как изменить разрешение файла в Java? (ответ)

              21. Можете ли вы открыть ZIP-файл в Java? Как? (ответ)

              22. В чем разница между ZipFile и ZipInputStream? (ответ)

              23. Когда приходит java.io.FileNotFoundException: (Доступ запрещен)? Как это исправить? (ответ)

              24. Как добавить текст в существующий файл в Java? (ответ)

              25. Как вы получаете кодировку символов по умолчанию в Java? (ответ)

              26. Можно ли удалить каталог с файлами в Java? Как? (ответ)

              27. Что такое отображаемый в память файл в Java? (ответ)


              28. Как читать файл построчно в Java? (ответ)

              29. Как проверить, скрыт ли файл в Java? (ответ)

              30. В чем разница между getPath(), getCanonicalPath() и getAbsolutePath() в Java? (ответ)

              31. Как преобразовать InputStream в String в Java? (ответ)

              32. Можем ли мы загрузить ресурс из ClassPath в Java? (ответ)

              33. Как вы читаете файл XML в Java как строку? (ответ)

              34. Можем ли мы прочитать файл Microsoft Excel (XLS и XLSX) на Java? Как? (ответ)

              35. Как загрузить файл CSV в Java? (ответ)

              36. Как вы читаете файл свойств в Java? (ответ)

              37. Как сериализовать объект в Java? (ответ)
              подсказка: с помощью классов ObjectInputStream и ObjectOutputStream

              38. В чем разница между FileInputStream и ObjectInputStream в Java? (ответ)

              39. Как вы читаете/пишете текстовый файл в Java? (ответ)

              40. Как загрузить файл на веб-сервер в Java? (ответ)

              41. Как прочитать файл построчно в Java 8? (ответ)

              42. Что такое RandomAccessFile? В чем преимущество использования RandomAccessFile? (ответ)

              43. Как преобразовать InputStream в ByteArray в Java? (ответ)
              Существует конструктор InputStream, который принимает массив байтов, таким образом, вы можете преобразовать массив байтов в InputStream в Java. Точно так же вы можете считывать данные из InputStream в массив байтов.

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


              Другое Java Вопросы для собеседования Темы , которые вы можете изучить:

              • 101 Проблемы кодирования для собеседования и некоторые советы (вопросы)
              • 50+ вопросов для собеседования по Java для начинающих (вопросы)
              • Топ-10 вопросов интервью Spring Framework с ответами (см. здесь)
              • 10 XML-вопросов для интервью с Java-программистами (читать здесь)
              • 20 вопросов по шаблонам проектирования Java, задаваемых на собеседованиях (см. здесь)
              • 10 популярных вопросов Struts Interview для разработчиков Java (список)
              • 10 часто задаваемых вопросов об интервью с сервлетами с ответами (см. здесь)
              • 10 вопросов для интервью по Hibernate для разработчиков Java EE (см. здесь)
              • 10 вопросов интервью JDBC для Java-программистов (вопросы)
              • 20 вопросов на собеседовании по jQuery для веб-разработчиков Java (список)
              • 10 вопросов Oracle Interview для разработчиков Java (см. здесь)
              • 10 главных вопросов JSP из интервью J2EE (читать здесь)
              • 12 вопросов по веб-сервисам RESTful из интервью (читайте здесь)
              • 10 лучших вопросов и ответов для интервью по сериям JMS и MQ (список)
              • 15 вопросов для собеседования по Java NIO и сети с ответами (см. здесь)
              • Топ-10 XSLT-вопросов с ответами (подробнее)
              • 15 вопросов по структуре данных и алгоритму из интервью по Java (читать здесь)
              • 10 лучших вопросов и ответов на собеседовании по Trick Java (см. здесь)
              • Топ-40 основных вопросов телефонного интервью по Java с ответами (список)

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

              P. S. — Если вы только начинаете знакомиться с Java и ищете бесплатные курсы для изучения Java с нуля, я предлагаю вам ознакомиться с этим Учебник по Java для начинающих (БЕСПЛАТНО) курс на Udemy, чтобы дать толчок вашему путешествию. Это совершенно бесплатно, и более 1,2 миллиона человек присоединились к этому курсу для изучения Java.

              Java IO | Выполнение операций ввода-вывода с помощью классов ввода-вывода Java

              Ввод-вывод Java означает ввод и вывод Java. Другими словами, мы можем сказать, что Java получает входные данные от пользователя, а затем выполняет соответствующие действия для создания выходных данных. т.е. Ввод-вывод Java просто обрабатывает ввод и генерирует вывод. Чтобы ускорить операции ввода-вывода, в Java используется концепция потока; этот поток в пакете java.io поддерживает все классы, необходимые для выполнения операций ввода и вывода. Поток, используемый при вводе-выводе, представляет собой последовательность данных, разделенную на две части — InputStream и OutputStream, где InputStream используется для чтения данных из источника, а OutputStream — для записи данных в место назначения.

              Классы ввода-вывода Java

              Ниже приведен список классов, которые используются для выполнения операций ввода-вывода:

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

              2. FileOutputStream: В Java класс FileOutputStream работает противоположно классу FileInputStream; он записывает такие данные, как аудио, видео, изображения и т. д., в байтовом и символьном формате. то есть этот класс записывает данные в файл.

              3. DataInputStream: Этот класс позволяет приложению считывать примитивные данные из входного потока машинно-независимым способом.

              4. DataOutputStream: Этот класс позволяет приложению записывать примитивные данные в выходной поток машинно-независимым способом.

              5. BufferedReader: Этот класс позволяет читать текст из символьного потока ввода в построчном формате, наследуя класс читателя.

              6. BufferedWriter: В java этот метод обеспечивает буферизацию для записи экземпляров путем наследования класса записи.

              7. BufferedInputStream: Этот класс используется для чтения данных из входного потока. Массив внутренних буферов инициализируется автоматически после создания BufferedInputStream. Когда байты из потока считываются, внутренний буфер автоматически пополняется из исходного входного потока.

              8. BufferedOutputStream: Этот класс используется для буферизации выходного потока. Для хранения данных этот класс использует внутренний буфер. то есть этот класс добавляет буфер в OutputStream.

              9. FilePermission: Этот класс используется для предоставления соответствующего разрешения файлу или каталогу; эти разрешения связаны с путем к файлу. Путь к файлу может быть двух типов:

              10. D:\\IO\\: Этот путь указывает, что разрешение связано со всеми подфайлами и каталогами соответственно.

              11. D:\\IO\\*: Этот путь указывает, что разрешение связано со всеми файлами и каталогами в указанном каталоге, кроме подкаталогов.

              12. Консоль: Этот класс внутренне подключен к системной консоли и используется для получения ввода с консоли с помощью различных методов. Консольный класс может читать как текст, так и пароль, при этом текст будет отображаться пользователю, а пароль не будет отображаться (может отображаться в формате звездочки).

              13. Сканер: Этот встроенный класс находится в пакете java.util. Этот класс используется для чтения данных с клавиатуры и получения ввода пользователя в примитивных типах данных (int, float, long, double, string и т. д.). Чтобы класс сканера считывал ввод от пользователя, нам нужно передать входной поток, т.е. System.in.

              14. FilterInputStream: Этот класс реализует InputStream и использует различные подклассы, такие как BufferedInputStream и DataInputStream, для обеспечения дополнительных функций. Он просто переопределяет все методы InputStream.

              15. FilterOutputStream: Этот класс работает напротив FilterInputStream. Он реализует OutputStream и использует различные подклассы, такие как BufferedOutputStream и DataOutputStream, для обеспечения дополнительных функций. Он просто переопределяет все методы OutputStream.

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

              17. RandomAccessFile: Этот класс используется для доступа к произвольному файлу; этот файл произвольного доступа представляет собой большой массив байтов. Обычно используется для чтения и записи в случайный файл, операции чтения и записи выполняются с помощью курсора

              18. InputStreamReader: Этот класс действует как мост, соединяющий поток байтов с потоком символов. Сначала он считывает байт, а затем декодирует его в символ, используя указанную кодировку.

              19. OutputStreamWriter: Этот класс работает напротив InputStreamReader. Он преобразует поток символов в поток байтов. Сначала он считывает символ, а затем декодирует его в байты, используя указанный набор символов.

              20. StringReader: Этот класс представляет собой поток символов, который принимает входную строку и преобразует ее в поток символов с помощью класса чтения.

              21. StringWriter: Этот класс представляет собой поток символов, который принимает выходную строку, которую можно использовать для создания строки. Он наследует класс писателя.

              22. FileReader: FileReader — это символьный класс, используемый для чтения указанных данных файла и возврата данных в байтовом формате.

              23. FileWriter: FileWriter — это символьный класс, используемый для записи данных в указанный файл.

              24. ObjectStreamClass: : Этот класс действует как описание сериализации классов. Он хранит имя и идентификатор серийной версии класса.

              25. ObjectStreamField: В Java этот класс используется для инициализации сериализуемого поля класса.

              26. ByteArrayInputStream: Этот класс использует внутренний буфер для чтения массива байтов из входного потока.

              27. ByteArrayOutputStream: Этот класс используется для записи данных в массив байтов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *