Java чтение из файла. Запись в файл. Чтение содержимого файла FileInputStream

Класс File, определенный в пакете java.io, не работает напрямую с потоками. Его задачей является управление информацией о файлах и каталогах. Хотя на уровне операционной системы файлы и каталоги отличаются, но в Java они описываются одним классом File.

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

Кроме того, вы можете добавить комментарий, который появится в созданном файле в виде строки, начинающейся с #. Теперь мы можем показать вам, как читать этот файл. Затем сниппет выглядит следующим образом. Более сложное использование или, реализация зависит только от вас.

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

File(String путь_к_каталогу) File(String путь_к_каталогу, String имя_файла) File(File каталог, String имя_файла)

Например:

// создаем объект File для каталога File dir1 = new File("C://SomeDir"); // создаем объекты для файлов, которые находятся в каталоге File file1 = new File("C://SomeDir", "Hello.txt"); File file2 = new File(dir1, "Hello2.txt");

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

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

Двоичные файлы и текстовые файлы

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

    boolean createNewFile() : создает новый файл по пути, который передан в конструктор. В случае удачного создания возвращает true, иначе false

    boolean delete() : удаляет каталог или файл по пути, который передан в конструктор. При удачном удалении возвращает true.

    boolean exists() : проверяет, существует ли по указанному в конструкторе пути файл или каталог. И если файл или каталог существует, то возвращает true, иначе возвращает false

    Способ сохранения данных существенно влияет на размер файла. Написание того же номера, что и строка в текстовом файле, требует 7 байтов. Другими словами, двоичная запись в подавляющем большинстве случаев требует меньшего дискового пространства. К сожалению, это связано с некоторыми ограничениями. Теперь двоичные файлы не читаются для людей. Вы когда-нибудь открывали двоичный файл в записках? Затем вы увидите пресловутые «кусты», потому что ноутбук интерпретирует двоичные данные как текст.

    Файловая система организует данные на диске в иерархической структуре каталогов, в которых находятся файлы. Каждый файл или каталог имеет путь, который однозначно идентифицирует свое место в этой структуре. Здесь мы сталкиваемся с некоторыми различиями между различными операционными системами.

    String getAbsolutePath() : возвращает абсолютный путь для пути, переданного в конструктор объекта

    String getName() : возвращает краткое имя файла или каталога

    String getParent() : возвращает имя родительского каталога

    boolean isDirectory() : возвращает значение true, если по указанному пути располагается каталог

    boolean isFile() : возвращает значение true, если по указанному пути находится файл

    Это связано с тем, что символ \\ используется особым образом. Мы также можем говорить об относительном пути. Вы должны знать, что файл можно открыть «читать», «написать» или «в режиме вложения». Этот режим очень важен, открытие для записи файла, который уже существует и сохранение даже одного символа, стирает весь существующий контент. Аналогично, открытие файла, который еще не существует, создаст файл, который еще не существует.

    Классы для обработки файловых операций

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

    boolean isHidden() : возвращает значение true, если каталог или файл являются скрытыми

    long length() : возвращает размер файла в байтах

    long lastModified() : возвращает время последнего изменения файла или каталога. Значение представляет количество миллисекунд, прошедших с начала эпохи Unix

    String list() : возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге

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

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

    File listFiles() : возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге

    boolean mkdir() : создает новый каталог и при удачном создании возвращает значение true

    boolean renameTo(File dest) : переименовывает файл или каталог

Работа с каталогами

Если объект File представляет каталог, то его метод isDirectory() возвращает true . И поэтому мы можем получить его содержимое - вложенные подкаталоги и файлы с помощью методов list() и listFiles() . Получим все подкаталоги и файлы в определенном каталоге:

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

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

Import java.io.File; public class FilesApp { public static void main(String args) { // определяем объект для каталога File dir = new File("C://SomeDir"); // если объект представляет каталог if(dir.isDirectory()) { // получаем все вложенные объекты в каталоге for(File item: dir.listFiles()){ if(item.isDirectory()){ System.out.println(item.getName() + " \tкаталог"); } else{ System.out.println(item.getName() + "\tфайл"); } } } } }

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

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

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

Import java.io.File; public class FilesApp { public static void main(String args) { // определяем объект для каталога File dir = new File("C://SomeDir//NewDir"); boolean created = dir.mkdir(); if(created) System.out.println("Каталог успешно создан"); // переименуем каталог File newDir = new File("C://SomeDir//NewDirRenamed"); dir.renameTo(newDir); // удалим каталог boolean deleted = newDir.delete(); if(deleted) System.out.println("Каталог удален"); } }

Работа с файлами

Работа с файлами аналогична работе с каталога. Например, получим данные по одному из файлов и создадим еще один файл:

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

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

Import java.io.File; import java.io.IOException; public class FilesApp { public static void main(String args) { // определяем объект для каталога File myFile = new File("C://SomeDir//somepicture.png"); System.out.println("Имя файла: " + myFile.getName()); System.out.println("Родительский каталог: " + myFile.getParent()); if(myFile.exists()) System.out.println("Файл существует"); else System.out.println("Файл еще не создан"); System.out.println("Размер файла: " + myFile.length()); if(myFile.canRead()) System.out.println("Файл доступен для чтения"); else System.out.println("Файл не доступен для чтения"); if(myFile.canWrite()) System.out.println("Файл доступен для записи"); else System.out.println("Файл не доступен для записи"); // создадим новый файл File newFile = new File("C://SomeDir//MyFile"); try { boolean created = newFile.createNewFile(); if(created) System.out.println("Файл создан"); } catch(IOException ex){ System.out.println(ex.getMessage()); } } }

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

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

При создании нового файла метод createNewFile() в случае неудачи выбрасывает исключение IOException , поэтому нам надо его отлавливать, например, в блоке try...catch, как делается в примере выше.

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

Итак, продолжайте и создайте файл. Он также возвращает логическое значение, поэтому мы знаем, был ли файл создан успешно или нет. Возможно, эта проблема будет решена позже. Использование вспомогательного метода выше. В этом примере будет подтвержден, существует ли ранее созданный файл.

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

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

Файлы

Создаем файл input.txt со следующим содержимым (те числа, что мы должны сложить):

8: Перемещение метода переименования файлов

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

10: Сделать файл доступным только для чтения

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

11: Создайте временный файл и установите его местоположение

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

И пустой файл output.txt .

Разместите их в папке вашего проекта:

Подготовка метода main

Чтобы нам не заморачиваться с обработкой исключений, то для метода main пропишем строчку throws IOException :


Через Alt + Enter подключим соответствующий import.


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

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

Чтение из файла

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

Это можно сделать следующим образом:

List lines = Files.readAllLines(Paths.get("input.txt"), Charset.defaultCharset());

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

16: добавление текста в конец файла

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

List < String > lines = Files . readAllLines (Paths . get ("input.txt" ) , Charset . defaultCharset () ) ;

Не забудьте через Alt + Enter все пакеты подключить.


Теперь в нашем массиве lines все строчки нашего файла. Теперь обрабатывайте их, как хотите. Например, можно пройтись по всем строчкам через цикл:

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

Есть много возможностей, поэтому доступные механизмы немного сложнее, чем мы ожидали раньше. Нет ни одного правильного ответа на вопрос «как читать текст из файла?» Но, конечно, вы можете дать некоторые предложения, в зависимости от потребностей и возможностей. Самый простой способ чтения текста из файла и отображения его содержимого будет выглядеть так. Прежде всего, обработка исключений отсутствует. Наш метод должен выглядеть так.

For (String x:lines) { //обработка всех строк как нам нужно }

for (String x : lines )

//обработка всех строк как нам нужно

Но в нашем случае мы заранее знаем, что там только две строчки с двумя числами и всё. Поэтому просто считываем две строчки из массива lines и переводим в числа их:

int a = Integer.parseInt(lines.get(0)); int b = Integer.parseInt(lines.get(1));


Запись в файл

Теперь мы должна записать результат в файл.

Вначале в текстовую переменную запишем то, что хотим сохранить:

String text = Integer.toString(c);

String text = Integer . toString (c ) ;

А теперь сохраним эту переменную в нужный нам файл:

PrintWriter out = new PrintWriter("output.txt"); out.println(text); out.close();

PrintWriter out = new PrintWriter ("output.txt" ) ;

out . println (text ) ;

out . close () ;

Итоговый текст программы:

package com.company; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class Main { public static void main(String args) throws IOException { List lines = Files.readAllLines(Paths.get("input.txt"), Charset.defaultCharset()); int a = Integer.parseInt(lines.get(0)); int b = Integer.parseInt(lines.get(1)); int c = a + b; String text = Integer.toString(c); PrintWriter out = new PrintWriter("output.txt"); out.println(text); out.close(); } }

package com . company ;

import java . io . IOException ;

import java . io . PrintWriter ;

import java . nio . charset . Charset ;

import java . nio . file . Files ;

import java . nio . file . Paths ;



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: