Java признак конца файла

Содержание
  1. Работа с файлами в Java
  2. 1. Класс Files
  3. 2. Создание файлов и директорий
  4. 3. Копирование, перемещение и удаление
  5. 4. Проверка типа файла и факта существования
  6. 5. Работа с содержимым файла
  7. 6. Получение содержимого директории
  8. 7. Метод Files.newInputStream
  9. Файловые каналы
  10. Содержание
  11. Введение
  12. Чтение данных из файла
  13. Пример отображения файлов
  14. Копирование содержимого с использованием файловых каналов
  15. Копирование с помощью метода transferTo
  16. Java — Файлы и ввод / вывод
  17. Поток
  18. Байтовые потоки
  19. Потоки персонажей
  20. Стандартные потоки
  21. Чтение и запись файлов
  22. FileInputStream
  23. FileOutputStream
  24. Навигация по файлам и ввод / вывод
  25. Каталоги на Java
  26. Создание каталогов
  27. Каталоги листинга
  28. Java работа с файлами
  29. Какие проблемы мы будем решать в этом уроке?
  30. Подготовительные работы
  31. Как записывать в файл?
  32. 2. Как читать файл?
  33. 3. Как обновить файл?
  34. 4. Как удалить файл?
  35. Обработка исключений + чтение из файла

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

Квест Java Syntax Pro еще в разработке

Сейчас мы вычитываем лекции и работаем над задачами. Если заметили ошибки — пишите в комментариях: всё учтем перед релизом. Спасибо!

1. Класс Files

Метод Описание
Создает новый файл с путем path
Создает новую директорию
Создает несколько директорий
Создает временный файл
Создает временную директорию
Удаляет файл или директорию, если она пуста
Копирует файл
Перемещает файл
Проверяет, что путь — это директория, а не файл
Проверяет, что путь — это файл, а не директория
Проверяет, что объект по заданному пути существует
Возвращает размер файла
Возвращает все содержимое файла в виде массива байт
Возвращает все содержимое файла в виде строки
Возвращает все содержимое файла в виде списка строк
Записывает в файл массив байт
Записывает в файл строку
Возвращает коллекцию файлов (и поддиректорий) из заданной директории

2. Создание файлов и директорий

Файлы и директории создавать очень просто. Убедимся на примерах:

Код Примечание
Создает файл
Создает директорию
Создает директорию и все нужные поддиректории, если их не существует.

3. Копирование, перемещение и удаление

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

Код Примечание
Копирует файл
Перемещает и переименовывает файл
Удаляет файл

4. Проверка типа файла и факта существования

Когда у вас есть какой-то путь, полученный извне, вы бы хотели знать, это файл или директория. Ну и вообще: существует такой файл/директория или нет?

Для этого тоже есть специальные методы. Так же можно легко узнать длину файла:

5. Работа с содержимым файла

И наконец, есть целая серия методов, которые позволяют легко прочитать или записать содержимое файла. Пример:

Код Описание
Читаем содержимое файла в виде списка строк.

Выводим строки на экран

6. Получение содержимого директории

Остался еще самый интересный метод — получение файлов и поддиректорий в заданной директории.

. У него есть итератор(!), и с помощью этого итератора можно получить все файлы и поддиректории заданной директории.

Выглядит проще, чем кажется:

Получаем объект со списком файлов
Цикл по списку файлов

7. Метод Files.newInputStream

Начиная с Java 5 классы FileInputStream и FileOutputStream стали считаться устаревшими. Одним из их минусов было то, что при создании объекта этих классов сразу происходит создание файлов на диске. И потенциально выбрасываются все ошибки, связанные с созданием файлов.

Вот сравнение старого подхода к созданию файлов и нового:

Источник

Файловые каналы

Содержание

Введение

Каналы являются новой возможностью библиотеки Java, частью нового пакета ввода/вывода (java.nio). В документации (http://java.sun.com/j2se/1.4/docs/api/java/nio/channels/Channel.html) каналы определяются следующим образом:

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

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

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

Чтение данных из файла

Как можно прочитать эти данные в Java-программе? Вот один из способов:

public class ChannelDemo0 <
public static void main ( String args []) throws IOException <
FileInputStream fis = new FileInputStream ( «data» ) ;
DataInputStream dis = new DataInputStream ( fis ) ;
short s = dis.readShort () ;
System.out.println ( s ) ;
dis.close () ;
>
>

В этой программе используется класс DataInputStream и метод readShort этого класса. Однако если вы выполните программу ChannelDemo0, результат ее работы будет таким:

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

import java.nio.*;
import java.nio.channels.*;
import java.io.*;

public class ChannelDemo1 <

// просуммировать значения типа short из файла данных

static short sumFileContents ( String fn ) throws IOException <

// открыть поток ввода и создать канал

FileInputStream fis = new FileInputStream ( fn ) ;
FileChannel fc = fis.getChannel () ;

// отобразить файл в байтовый буфер

// установить прямой порядок байтов

// создать ссылку на байтовый буфер как на буфер значений short

ShortBuffer sb = mbb.asShortBuffer () ;

short sum = 0 ;
while ( sb.hasRemaining ()) <
sum += sb.get () ;
>

public static void main ( String args []) throws IOException <
short sum = sumFileContents ( «data» ) ;
System.out.println ( sum ) ;
>
>

Метод sumFileContents сначала создает FileInputStream, а затем файловый канал, основанный на этом потоке. Аналогичный подход используется для потоков вывода (FileOutputStream) или для файлов, которые открыты и по чтению и по записи (RandomAccessFile).

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

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

Пример отображения файлов

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

import java.nio.*;
import java.nio.channels.*;
import java.io.*;

public class ChannelDemo2 <
public static void main ( String args []) throws IOException <

// проверить аргументы командной строки

// отобразить файл в буфер

// реверсировать байты в файле

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

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

Для восстановления файла ChannelDemo2.java в оригинальный вид вы должны выполнить команду:

Копирование содержимого с использованием файловых каналов

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

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

import java.nio.*;
import java.nio.channels.*;
import java.io.*;

public class ChannelDemo3 <
public static void main ( String args []) throws IOException <

// проверить аргументы командной строки

FileInputStream fis = new FileInputStream ( args [ 0 ]) ;
FileOutputStream fos = new FileOutputStream ( args [ 1 ]) ;
FileChannel fcin = fis.getChannel () ;
FileChannel fcout = fos.getChannel () ;

// отобразить входной файл

// выполнить копирование файла

fcin.close () ;
fcout.close () ;
fis.close () ;
fos.close () ;
>
>

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

файл ChannelDemo3 скопируется в ChannelCopy3.java.

Копирование с помощью метода transferTo

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

import java.nio.*;
import java.nio.channels.*;
import java.io.*;

public class ChannelDemo4 <
public static void main ( String args []) throws IOException <

// проверить аргументы командной строки

FileInputStream fis = new FileInputStream ( args [ 0 ]) ;
FileOutputStream fos = new FileOutputStream ( args [ 1 ]) ;
FileChannel fcin = fis.getChannel () ;
FileChannel fcout = fos.getChannel () ;

// выполнить копирование файла

fcin.close () ;
fcout.close () ;
fis.close () ;
fos.close () ;
>
>

Метод transferTo передает байты из канала-источника (fcin) в указанный канал-назначение (fcout). Передача обычно производится без явных чтений или записи в канал на уровне пользователя. В документации (http://java.sun.com/j2se/1.4/docs/api/java/nio/channels/FileChannel.html#transferTo(long, long, java.nio.channels.WritableByteChannel)) по поводу метода transferTo говорится:

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

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

Как выглядит «обычное» копирование файла с использованием каналов? Вот пример:

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

public class ChannelDemo5 <
public static void main ( String args []) throws IOException <

// проверить аргументы командной строки

FileInputStream fis = new FileInputStream ( args [ 0 ]) ;
FileOutputStream fos = new FileOutputStream ( args [ 1 ]) ;
FileChannel fcin = fis.getChannel () ;
FileChannel fcout = fos.getChannel () ;

ByteBuffer buf = ByteBuffer.allocateDirect ( 8192 ) ;

long size = fcin.size () ;
long n = 0 ;
while ( n ) <
buf.clear () ;
if ( fcin.read ( buf ) 0 ) <
break ;
>
buf.flip () ;
n += fcout.write ( buf ) ;
>

fcin.close () ;
fcout.close () ;
fis.close () ;
fos.close () ;
>
>

Источник

Java — Файлы и ввод / вывод

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

Поток

Поток может быть определен как последовательность данных. Есть два вида потоков —

InPutStream — InputStream используется для чтения данных из источника.

OutPutStream — OutputStream используется для записи данных в пункт назначения.

InPutStream — InputStream используется для чтения данных из источника.

OutPutStream — OutputStream используется для записи данных в пункт назначения.

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

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

Теперь давайте получим файл input.txt со следующим содержимым —

В качестве следующего шага скомпилируйте вышеуказанную программу и выполните ее, что приведет к созданию файла output.txt с тем же содержимым, что и в input.txt. Итак, давайте поместим приведенный выше код в файл CopyFile.java и сделаем следующее:

Потоки персонажей

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

Теперь давайте получим файл input.txt со следующим содержимым —

В качестве следующего шага скомпилируйте вышеуказанную программу и выполните ее, что приведет к созданию файла output.txt с тем же содержимым, что и в input.txt. Итак, давайте поместим приведенный выше код в файл CopyFile.java и сделаем следующее:

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

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

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

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

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

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

Вот иерархия классов для работы с потоками ввода и вывода.

FileInputStream

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

Следующий конструктор принимает имя файла в виде строки для создания объекта входного потока для чтения файла —

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

public void close () генерирует IOException <>

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

Защищенный void finalize () выбрасывает IOException <>

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

public int read (int r) выдает IOException <>

public int read (byte [] r) выдает IOException <>

public int available () выдает IOException <>

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

public void close () генерирует IOException <>

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

Защищенный void finalize () выбрасывает IOException <>

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

public int read (int r) выдает IOException <>

public int read (byte [] r) выдает IOException <>

public int available () выдает IOException <>

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

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

FileOutputStream

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

Вот два конструктора, которые можно использовать для создания объекта FileOutputStream.

Следующий конструктор принимает имя файла в виде строки для создания объекта входного потока для записи файла —

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

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

Sr.No. Метод и описание
1

public void close () генерирует IOException <>

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

Защищенный void finalize () выбрасывает IOException <>

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

public void write (int w) выдает IOException <>

Этот метод записывает указанный байт в выходной поток.

public void write (byte [] w)

Записывает байты w.length из упомянутого байтового массива в OutputStream.

public void close () генерирует IOException <>

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

Защищенный void finalize () выбрасывает IOException <>

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

public void write (int w) выдает IOException <>

Этот метод записывает указанный байт в выходной поток.

public void write (byte [] w)

Записывает байты w.length из упомянутого байтового массива в OutputStream.

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

Ниже приведен пример для демонстрации InputStream и OutputStream:

Приведенный выше код создаст файл test.txt и запишет заданные числа в двоичном формате. То же самое будет вывод на экране стандартного вывода.

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

Каталоги на Java

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

Создание каталогов

Метод mkdir () создает каталог, возвращая true в случае успеха и false в случае ошибки. Ошибка указывает, что путь, указанный в объекте File, уже существует или что каталог не может быть создан, поскольку еще не существует полного пути.

Метод mkdirs () создает каталог и всех его родителей.

Метод mkdir () создает каталог, возвращая true в случае успеха и false в случае ошибки. Ошибка указывает, что путь, указанный в объекте File, уже существует или что каталог не может быть создан, поскольку еще не существует полного пути.

Метод mkdirs () создает каталог и всех его родителей.

Следующий пример создает каталог «/ tmp / user / java / bin» —

Скомпилируйте и выполните приведенный выше код для создания «/ tmp / user / java / bin».

Примечание. Java автоматически позаботится о разделителях путей в UNIX и Windows в соответствии с соглашениями. Если вы используете косую черту (/) в версии Java для Windows, путь все равно будет корректным.

Каталоги листинга

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

Это даст следующий результат на основе каталогов и файлов, доступных в вашем каталоге / tmp

Источник

Java работа с файлами

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

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

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

Создадим простой проект, не обязательно Maven проект, так как нам не потребуется не каких дополнительных библиотек.

После того как вы создали проект, создайте класс WorkInFile.java и напишите туда стандартную конструкцию main:

Теперь создадим класс который будет иметь методы для работы с файлами, а назовем его FileWorker.java все методы в нем которые не есть private будут статическими для того чтобы мы получали к ним доступ без экземпляра этого класса.

Как записывать в файл?

В классе FileWorker.java создадим статический метод который будет осуществлять запись в файл и назовем этот метод write(String text; String nameFile):

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

После чего мы получим новый файл “a.txt” со следующим содержимым:

2. Как читать файл?

Теперь в классе FileWorker создадим метод для чтения файла, также статический:

StringBuilder – в чем разница между обычным String? В том что когда вы в StringBuilder добавляете текст он не пересоздается, а String пересоздает себя.

Также если файла нет то метод выкинет Exception.

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

Теперь проверим его:

В первом случае когда файл не существует мы получим это:

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

3. Как обновить файл?

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

Давайте создадим метод update в классе FileWorker:

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

В результате обновления файла:

мы получим следующее содержание файла “a.txt“:

4. Как удалить файл?

В тот же наш утилитный класс FileWorker добавим метод delete, он будет очень простым так как у объекта File уже есть метод delete():

Источник

Обработка исключений + чтение из файла

Чтение текстового файла. Парсинг его данных. Создание исключений для данных. Запись свойств объектов в файл
Проблема такая. Есть файл data.txt. В нем например какие-то данные. Landon Donovan, 150, A.

Чтение и обработка содержимого файла согласно условию задания
Задание: Создать текстовый файл с произвольной информацией. Организовать просмотр содержимого.

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

обработка исключений
На собеседовании задали вопрос: «При обработке исключений есть ли какие-либо ограничения на.

Добавлено через 1 минуту
и если проверять, то проверять еще надо на файловость и читаемость, конечно.

Во-вторых, это нормально, что при наличии файла возвращается строка, и при отсутствии тоже возвращается строка? А если файл присутствует, и в нем записано «File is not found.», путаница не возникнет?
Если так и задумано, тогда ок.

А насчет NPE.
При отсутствии файла вылетает IOE на 5-й строчке, оно перехватывается на 9-й, поток in так и остался нулем, а NPE вылетает когда вы пытаетесь его закрыть.

И еще, функцию рекомендуется начинать с описания ее контракта, желательно по стандартной схеме, принятой для java документации.

Если хотите попрактиковаться, предлагаю такой план.
Начните с постановки задачи. Представьте, что вам надо спроектировать библиотеку (хотя бы из одной функции, но это пока не известно). Какие задачи она должна решать?
Потом попробуйте спроектировать API, т.е. функции(ю). Каждая функция задается декларацией (public static String readFile(String file)), и контрактом: допустимые значения аргументов, что возвращает, список исключений, когда они происходят. Контракты в яве на уровне кода поддерживаются только в части списка исключений, остальное пишете словами в комментарии.
Реализацию функций оставим на следующий этап.

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

Обработка исключений
можете помочь сделать свое исключение в этом коде, пожалуйста!) public static void main(String.

Обработка исключений
Написать программу, решающую данную задачу:Велосипедист, имея начальную скорость X м/с, спускается.

Обработка исключений
Доброго времени суток. Решил все таки отойти от привычной delphi, на замену была выбрана java, я в.

Источник

Читайте также:  Признаки нарушения сна у детей до 1 года
Sr.No. Метод и описание
1