Добавление элементов структуры данных из файла java. Java: работа с файлами - запись, чтение, удаление. Какие проблемы мы будем решать в этом уроке

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

Запись файлов. Класс FileWriter

Класс FileWriter является производным от класса Writer. Он используется для записи текстовых файлов.

Правильный способ - использовать те классы, которые заставляют нас делать явное объявление кодировки символов, например. Сканер используется для чтения в каждой строке, а второй сканер используется для анализа каждой строки в простой паре имя-значение. Если вы выполните пример, будет получен.

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

Чтобы создать объект FileWriter, можно использовать один из следующих конструкторов:

FileWriter(File file) FileWriter(File file, boolean append) FileWriter(FileDescriptor fd) FileWriter(String fileName) FileWriter(String fileName, boolean append)

Так, в конструктор передается либо путь к файлу в виде строки, либо объект File, который ссылается на конкретный текстовый файл. Параметр append указывает, должны ли данные дозаписываться в конец файла (если параметр равен true), либо файл должен перезаписываться.

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

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

Запишем в файл какой-нибудь текст:

Import java.io.*; public class FilesApp { public static void main(String args) { try(FileWriter writer = new FileWriter("C:\\SomeDir\\notes3.txt", false)) { // запись всей строки String text = "Мама мыла раму, раму мыла мама"; writer.write(text); // запись по символам writer.append("\n"); writer.append("E"); writer.flush(); } catch(IOException ex){ System.out.println(ex.getMessage()); } } }

В конструкторе использовался параметр append со значением false - то есть файл будет перезаписываться. Затем с помощью методов, определенных в базовом классе Writer производится запись данных.

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

Создание файла для чтения и записи

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


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

Чтение файлов. Класс FileReader

Класс FileReader наследуется от абстрактного класса Reader и предоставляет функциональность для чтения текстовых файлов.

Для создания объекта FileReader мы можем использовать один из его конструкторов:

FileReader(String fileName) FileReader(File file) FileReader(FileDescriptor fd)

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

Архив после использования Проекта

Этот метод имеет функцию вставки новой строки символов в текстовый файл.


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





Мы начнем с показа, как читать символ по символу из файла. Затем мы увидим, как читать строки. И, наконец, мы рассмотрим, как читать любые байты в файле, будь то текст, видео, музыка или бинарный контент.

Import java.io.*; public class FilesApp { public static void main(String args) { try(FileReader reader = new FileReader("C:\\SomeDir\\notes3.txt")) { // читаем посимвольно int c; while((c=reader.read())!=-1){ System.out.print((char)c); } } catch(IOException ex){ System.out.println(ex.getMessage()); } } }

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

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

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

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

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

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

Примеры создания объектов File

// Создание File для каталога File dir = new File("C://dir_test"); // Создание File для файлов, которые находятся в каталоге File file1 = new File("C://dir_test", "Hello1.txt"); File file2 = new File(dir, "Hello2.txt");

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

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

Свойства и методы класса File

Для определения стандартных свойств файла в классе File имеются различные методы. Однако класс File несимметричен, т.е. методы определения свойств объекта существуют, но соответствующие функции для изменения этих свойств отсутствуют.

Функции Описание
String getName() Наименование файла или каталога.
String getParent() Наименование родительского каталога.
long length() Функция определения размера файла в байтах.
String getAbsolutePath() Функция определения абсолютного пути файла или каталога.
boolean delete() Удаления файла или каталога.
boolean exists() Проверка существования файла или каталога.
boolean isDirectory() Проверка, является ли данный объект каталогом.
boolean isFile() Проверка, является ли данный объект файлом.
long lastModified() Функция определения даты последней модификации файла.
boolean canRead() Проверка, можно ли читать данные из файла.
boolean canWrite() Проверка, можно ли записывать данные в файл.
boolean isHidden() Проверка, являются ли каталог или файл скрытыми.
String list() Чтение массива наименований файлов и подкаталогов.
File listFiles() Чтение массива файлов и подкаталогов.
boolean mkdir() Создание нового каталога.
boolean renameTo(File dest) Переименовывание файла или каталога.

В следующем примере открываем файл "d:/test/MyFile.txt" (Windows) и извлекаем его характеристики:

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

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

Import java.io.File; public class FileTest { public static void main(String args) { File fl = new File("d:\\test\\MyFile.txt"); System.out.println ("Имя файла: " + fl .getName()); System.out.println ("Путь: " + fl.getPath()); System.out.println ("Полный путь: " + fl.getAbsolutePath()); System.out.println ("Родительский каталог: " + fl.getParent()); System.out.println (fl.exists() ? "Файл существует" : "Файл не существует"); System.out.println (fl.canWrite() ? "Свойство - можно записывать" : "Свойство - нельзя записывать"); System.out.println (fl.canRead() ? "Свойство - можно читать" : "Свойство - нельзя читать"); System.out.println ("Это директория? " + (fl.isDirectory() ? "да": " нет")); System.out.println ("Это обычный файл? " + (fl.isFile() ? "да" : "нет")); System.out.println ("Последняя модификация файла: " + fl. lastModified()); System.out.println ("Размер файла: " + fl.length() + " bytes"); } }

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

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

В консоли будет отпечатана следующая информация:

Имя файла: MyFile.txt Путь: d:\test\MyFile.txt Полный путь: d:\test\MyFile.txt Родительский каталог: d:\test Файл существует Свойство - можно записывать Свойство - можно читать Это директория? нет Это обычный файл? да Последняя модификация файла: 1441710053162 Размер файла: 12 bytes

Интерфейс FileFilter

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

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

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

На следующем рисунке показан результат этого кода.


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

Public File listFiles(FileFilter filter)

В отличие от одноименного метода, но без параметра, данный метод отбирает только те файлы каталога, которые удовлетворяют определенному условию. Параметр filter предназначен для задания этого условия. При этом тип параметра FileFilter - это не класс, а интерфейс, который имеет всего один метод, возвращающий true, если файл удовлетворяет определенным условиям, и false в противном случае.

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

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

Public boolean accept(File pathname)

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

Для использования FileFilter необходимо создать объект и определить в нем соответствующий метод accept .

Class Filter implements FileFilter { String ext; Filter(String ext) { this.ext = ext.split(","); } private String getExtension(File pathname) { String filename = pathname.getPath(); int i = filename.lastIndexOf("."); if ((i > 0) && (i < filename.length()-1)) { return filename.substring(i+1).toLowerCase(); } return ""; } public boolean accept(File pathname) { if (!pathname.isFile()) return false; String extension = getExtension(pathname); for (String e: ext) { if (e.equalsIgnoreCase(extension)) return true; } return false; } }

На следующем рисунке показана диаграмма классов, схематизирующая их иерархию.


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

Теперь вот код, который позволяет протестировать время воспроизведения. И результат, видимый на следующем рисунке, снова блефует.

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

Пример использования фильтра FileFilter

Import java.io.File; import java.io.FileFilter; public class FileTest { public static void main(String args) { // Определение директории File dir = new File("."); // Чтение полного списка файлов каталога File lst1 = dir.listFiles(); // Чтение списка файлов каталога с расширениями "png" и "jpg" File lst2 = dir.listFiles(new Filter("png,jpg")); System.out.println ("lst1.length = " + lst1.length + ", lst2.length = " + lst2.length); } }

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

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

Вы должны знать, что когда вы хотите писать объекты в файлах, это называется «сериализация»: это имя действия для сохранения объектов! Настало время спасти ваши объекты от определенной смерти! Вот класс, с которым мы будем работать. Что это за интерфейс? Вы даже не внедрили метод!

Чтение содержимого файла FileInputStream

Для чтения содержимого файла можно использовать класс FileInputStream , который является наследником класса InputStream и реализует все его методы. Конструктор класса FileInputStream:

FileInputStream(String fileName) throws FileNotFoundException

Если файл не может быть открыт то генерируется исключение FileNotFoundException.

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

Import java.io.FileInputStream; public class FilesApp { public static void main(String args) { try { FileInputStream fis = new FileInputStream("C:\\test_dir\\test.txt"); System.out.println("Размер файла: " + fis.available() + " байт(а)"); int i = -1; while((i = fis.read()) != -1){ System.out.print((char)i); } fis.close(); } catch(IOException e){ System.out.println(e.getMessage()); } } }

Byte buffer = new byte; // чтение файла в буфер fis.read (buffer, 0, fis.available()); System.out.println ("Содержимое файла:"); for(int i = 0; i < buffer.length; i++){ System.out.print((char)buffer[i]); }

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

Пример использования FileInputStream для чтения файла свойств в кодировке UTF-8:

Файл свойств "data.properties" в кодировке UTF-8:

# # Параметры сервера SMTP # company=Рога и копыта manager=Остап Бендер

Листинг примера:

Import java.io.Reader; import java.io.IOException; import java.io.InputStream; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.Properties; public class Main { public static void main(String args) { try { InputStream is = new FileInputStream("data.properties"); if (is != null) { Reader reader = new InputStreamReader(is, "UTF-8"); Properties props = new Properties(); props.load(reader); System.out.println (props.getProperty ("company") + ", " props.getProperty ("manager")); is.close(); } } catch (IOException e) { e.printStackTrace(); } } }

Запись в файл FileOutputStream

Класс FileOutputStream , является производным от класса OutputStream , поэтому наследует всю его функциональность.

Пример записи строки в файл:

Import java.io.FileOutputStream; public class FilesApp { public static void main(String args) { String text = "Hello world!"; // строка для записи try { FileOutputStream fos = new FileOutputStream("C:\\test_dir\\test.txt"); // перевод строки в байты byte buffer = text.getBytes(); fos.write(buffer, 0, buffer.length); } catch(IOException e){ System.out.println(e.getMessage()); } } }

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

Fos.write(buffer); // запись только первого байта

Пример перезаписи содержимого из одного файла в другой:

Import java.io.FileInputStream; import java.io.FileOutputStream; public class FilesApp { public static void main(String args) { try { FileInputStream fis = new FileInputStream("C:\\test_dir\\test.txt"); FileOutputStream fos = new FileOutputStream("C:\\test_dir\\new.txt"); byte buffer = new byte; // считываем буфер fis.read(buffer, 0, buffer.length); // записываем из буфера в файл fos.write(buffer, 0, buffer.length); fis.close(); fos.close(); } catch(IOException e){ System.out.println(e.getMessage()); } } }

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



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

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

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