Локальный файл находится на жестком диске или флешке, подключенной к порту USB. Файлы можно разделить на две категории: текстовые файлы и байтовые файлы. Типичные текстовые файлы — это файлы, созданные текстовым редактором. Файл изображения является примером байтового файла, состоящего в основном из необработанных байтов.
В этой статье дается базовое объяснение того, как читать локальные текстовые и байтовые файлы в Java. Чтобы прочитать текстовый файл, используйте класс FileReader. Чтобы прочитать байтовый файл, используйте класс FileInputStream. Оба класса находятся в пакете java.io.*, который необходимо импортировать. Первая половина этой статьи посвящена чтению текстовых файлов, а вторая половина — чтению байтовых файлов.
Прежде чем научиться создавать объект FileReader, создайте следующий текстовый файл с помощью текстового редактора и нажмите клавишу Enter в конце первых двух строк:
A text 1 A text 1 A text 1 A text 1 A text 1 B text 2 B text 2 B text 2 B text 2 B text 2 C text 3 C text 3 C text 3 C text 3 C text 3
Если клавиша Enter не нажата в конце последней строки, текстовый редактор может добавить новую строку при сохранении файла. После создания предыдущего текста сохраните содержимое с именем temp.txt, используя меню текстового редактора, user@host :~/dir1$, в каталог. Это означает, что должен быть создан каталог dir1.
Класс FileReader имеет пять конструкторов. В этой статье проиллюстрирован только один (чтобы статья была короткой). Синтаксис конструктора следующий:
public FileReader(String fileName) throws FileNotFoundException
При этом создается в памяти поток (копия) файла, путь и имя которого представляет собой строку fileName. Выдает исключение FileNotFoundException, если файл не найден в указанном каталоге. После копирования содержимого файла открытый файловый объект необходимо закрыть, чтобы освободить любые системные ресурсы, связанные с открытым файлом.
Если конструктор успешно создан, то файл считается открытым. После использования файл должен быть закрыт. Синтаксис для закрытия файла:
public void close() throws IOException
После того, как файл только что был открыт, эффективное чтение файла еще не произошло. Чтобы читать по одному символу за раз (один, затем следующий), используйте синтаксис метода FileReader:
public int read() throws IOException
Это возвращает прочитанный символ (в виде целого числа) или -1, если достигнут конец потока (потока копирования файла в памяти).
Чтобы прочитать следующую последовательность символов файла в массив, используйте синтаксис метода FileReader:
public int read(char[] cbuf, int off, int len) throws IOException
Он возвращает количество прочитанных символов или -1, если был достигнут конец потока. Off в синтаксисе означает смещение. Это индекс в файле, с которого должно начаться чтение следующей последовательности символов. Len — количество символов для чтения. Это должна быть длина массива, а cbuf — это массив, в который считывается последовательность символов.
Помните, что объект FileReader должен быть закрыт с помощью его метода close после эффективного чтения.
Синтаксис метода, чтобы узнать, не вернет ли следующее чтение -1, таков:
public boolean ready() throws IOException
Он возвращает true, если есть что-то для чтения, и false в противном случае.
Следующий код считывает предыдущий файл посимвольно в строку StringBuilder:
StringBuilder sb = new StringBuilder(); try{ FileReaderfr = new FileReader("dir1/temp.txt"); while (fr.ready()) { char ch = (char)fr.read(); sb.append(ch); } } catch(Exception e) { e.getMessage(); } System.out.println(sb);
Код начинается с создания экземпляра объекта StringBuilder, sb. Далее идет конструкция try-catch. Блок try начинается с создания экземпляра FileReader, фр. И есть цикл while, который повторяется до тех пор, пока ready() не вернет false. Первый оператор цикла while считывает и возвращает следующий символ в виде целого числа. Его нужно перевести в char. Следующий оператор в цикле while добавляет к строке следующий символ, sb. Результат:
A text 1 A text 1 A text 1 A text 1 A text 1 B text 2 B text 2 B text 2 B text 2 B text 2 C text 3 C text 3 C text 3 C text 3 C text 3
Это в точности содержимое файла, но добавлена лишняя строка на компьютере автора.
При чтении в массив содержимое массива должно быть освобождено для чтения следующей последовательности символов. Следующий код иллюстрирует это:
StringBuilder sb = new StringBuilder(); try{ FileReaderfr = new FileReader("dir1/temp.txt"); while (fr.ready()) { char[] arr = new char[5]; int offset = 0; fr.read(arr, offset, 5); offset = offset + 5; System.out.print(arr); } } catch(Exception e) { e.getMessage(); } System.out.println();
Значение смещения должно увеличиваться для каждой итерации на длину массива. Результат:
A text 1 A text 1 A text 1 A text 1 A text 1 B text 2 B text 2 B text 2 B text 2 B text 2 C text 3 C text 3 C text 3 C text 3 C text 3
Это точно так же, как содержимое файла, но с добавлением дополнительной строки на компьютере автора.
Следующий файл изображения называется bars.png. Он находится в каталоге user@host :~/dir1$, который совпадает с каталогом temp.txt. Он состоит всего из трех цветных полос:
Конструктор для объекта FileInputStream:
public FileInputStream(String name) throws FileNotFoundException
Поскольку он выдает исключение, он должен быть в конструкции try-catch. Помните, что этот класс предназначен для чтения байтов.
Если конструктор успешно создан, то файл считается открытым. После чтения байтов файл необходимо закрыть, используя следующий синтаксис:
public void close() throws IOException
После того, как файл только что был открыт, эффективное чтение файла еще не произошло. Чтобы читать по одному байту за раз (один, затем другой), используйте синтаксис метода FileInputStream:
public int read() throws IOException
Это возвращает прочитанный байт (как целое число) или -1, если достигнут конец потока (потока копирования файла в памяти).
Помните, что после этого эффективного чтения объект FileInputStream должен быть закрыт с помощью его метода close.
Чтобы получить оценку количества байтов, оставшихся для чтения, используйте синтаксис метода:
public int available() throws IOException
Поскольку этот метод возвращает оценку, при использовании в сочетании с read() нельзя быть уверенным, что все байты файла были прочитаны. И следует отдать предпочтение следующему методу, который считывает все байты:
public byte[] readAllBytes() throws IOException
Этот метод возвращает все оставшиеся байты, но все равно будет читать весь файл.
ArrayList должен быть импортирован из пакета java.util.*. Следующий код считывает оценку всех байтов в объект ArrayList:
ArrayList al = new ArrayList(); try{ FileInputStream fir = new FileInputStream("dir1/bars.png"); while (fir.available() > 0) { byte bt = (byte)fir.read(); al.add(bt); } } catch(Exception e) { e.getMessage(); } System.out.println(al);
Код начинается с создания экземпляра объекта ArrayList, например. Далее идет конструкция try-catch. Блок try начинается с создания экземпляра FileInputStream, fir. И есть цикл while, который повторяется, пока не будет доступен(), и предполагает, что не осталось ни одного байта для чтения. Первый оператор цикла while считывает и возвращает следующий байт в виде целого числа. Его нужно преобразовать в байт. Следующий оператор в цикле while добавляет (добавляет) следующий символ в список, т.е. Результат:
[-119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, -7, 0, 0, 0, -10, 8, 6, 0, 0, 0, 20, 25, 33, 69, 0, 0, 0, 6, 98, 75, 71, 68, 0, -1, 0, -1, 0, -1, -96, -67, -89, -109, 0, 0, 3, 48, 73, 68, 65, 84, 120, -100, -19, -42, 49, 74, 67, 81, 0, 68, -47, -81, -68, 52, 105, 83, -120, 85, 42, 65, -112, -12, 41, 44, 92, 64, -74, -26, 34, 92, -110, -115, -107, 32, -23, -19, 44, 4, 9, -60, 85, 60, 62, 92, -50, 89, -63, 52, 23, -26, -26, -70, 44, -41, 5, 104, 58, -99 - - - and continues - - - ]
Байты — это целые числа. Будем надеяться, что изображение трех предыдущих баров состоит из всех этих байтов. Идея состоит в том, чтобы программист изменил некоторые байты, изменил изображение, а затем сохранил результат; затем повторно отобразите его с помощью средства просмотра изображений, представляя измененное изображение. Однако это дополнительное расписание не рассматривается в этой статье.
Метод readAllBytes() возвращает массив байтов. Итак, просто получите возвращаемые значения с массивом байтов, как показано в следующем коде:
byte[] arr = new byte[1000]; try{ FileInputStream fir = new FileInputStream("dir1/bars.png"); arr = fir.readAllBytes(); } catch(Exception e) { e.getMessage(); } for (int i=0; i<arr.length; i++) System.out.print(arr[i] + ", "); System.out.println();
Код начинается с объявления массива, который получит байты. Размер (длина) здесь должен быть выше предполагаемого размера. Предполагаемый размер можно получить с помощью метода available(). Основной код находится в блоке try. Результат:
-119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, -7, 0, 0, 0, -10, 8, 6, 0, 0, 0, 20, 25, 33, 69, 0, 0, 0, 6, 98, 75, 71, 68, 0, -1, 0, -1, 0, -1, -96, -67, -89, -109, 0, 0, 3, 48, 73, 68, 65, 84, 120, -100, -19, -42, 49, 74, 67, 81, 0, 68, -47, -81, -68, 52, 105, 83, -120, 85, 42, 65, -112, -12, 41, 44, 92, 64, -74, -26, 34, 92, -110, -115, -107, 32, -23, -19, 44, 4, 9, -60, 85, 60, 62, 92, -50, 89, -63, 52, 23, -26, -26, -70, 44, -41, 5, 104, 58, -99, - - - and continues - - -
Этот вывод и предыдущий совпадают на компьютере автора.
Локальные текстовые и байтовые файлы могут быть прочитаны. Чтобы прочитать текстовый файл, используйте класс потока FileReader. Чтобы прочитать байтовый файл, используйте класс потока FileInputStream. Оба класса находятся в пакете java.io.*, который необходимо импортировать. Эти два класса имеют конструкторы и методы, обеспечивающие чтение. Мы надеемся, что эта статья была вам полезна. Дополнительные советы и руководства см. в других статьях Linux Hint.