Автор оригинала: Pankaj Kumar.
1. Класс Java FileInputStream
- Класс Java FileInputStream является частью java.io посылка.
- FileInputStream получает входные байты из файла в файловой системе.
- FileInputStream используется для чтения потоков необработанных байтов, таких как данные изображения.
- FileInputStream-это подкласс класса InputStream.
2. Иерархия классов FileInputStream
3. Конструкторы FileInputStream
FileInputStream предоставляет множество методов для чтения байтов из файла, и мы можем создать экземпляр FileInputStream , используя приведенные ниже конструкторы .
FileInputStream(файловый файл): Создает объект FileInputStream, открывая соединение с фактическим файлом с помощью указанного объекта file.FileInputStream(FileDescriptor fdObj): Создает объект FileInputStream с помощью указанного файлового дескриптора fdObj, который представляет существующее соединение с фактическим файлом в файловой системе.FileInputStream(строковое имя): Создает объект FileInputStream, открывая соединение с фактическим файлом, названным указанным именем, которое представляет путь к файлу.
4. Методы потока ввода файлов
Давайте взглянем на приведенные ниже методы класса FileInputStream.
доступный(): Этот метод возвращает оценку количества оставшихся байтов, которые могут быть считаны из входного потока без блокировки при следующем вызове метода для этого входного потока.close(): Этот метод закрывает входной поток файла и освобождает все системные ресурсы, связанные с потоком. Если этот поток имеет связанный канал, то канал также закрывается.finalize(): Этот метод гарантирует, что метод close() этого входного потока файла вызывается, когда на него больше нет ссылок.getChannel(): Этот метод возвращает уникальный объект FileChannel, связанный с этим входным потоком файла. Начальная позиция возвращаемого канала будет равна количеству байтов, считанных из файла, а чтение байтов из этого потока приведет к увеличению позиции канала.getFD(): Этот метод возвращает объект FileDescriptor, представляющий соединение с фактическим файлом в файловой системе, используемой этим потоком ввода файлов.read(): Этот метод считывает байт данных из этого входного потока и возвращает следующий байт данных или -1, если достигнут конец файла.чтение(байт[] b): Этот метод считывает байт данных до длины указанного массива(b.длина) из этого входного потока в указанный массив байтов и возвращает общее количество байтов, считанных в буфер, или -1, если достигнут конец файла.чтение(байт[] b, int off, int len): Этот метод считывает байты данных до указанной локальной сети из этого входного потока в указанный массив байтов. Если указанный len не равен нулю, метод блокируется до тех пор, пока не будут доступны некоторые входные данные; в противном случае байты не считываются и возвращается 0. Он возвращает количество байтов, считанных в буфер, или -1, если достигнут конец файла.пропустить(длинный n): Этот метод пропускает и удаляет указанные n байтов данных из входного потока и возвращает фактическое количество пропущенных байтов. Это вызывает исключение IOException, если указанное n отрицательно.
5. Примеры потока ввода файлов Java
Давайте рассмотрим некоторые примеры программ для класса FileInputStream.
5.1) Чтение файла с помощью FileInputStream
package com.journaldev.examples;
import java.io.File;
import java.io.FileInputStream;
/**
* Java Read file using FileInputStream
*
* @author pankaj
*
*/
public class ReadFileUsingFileInputStream {
public static void main(String[] args) {
File file = null;
FileInputStream fileInputStream = null;
try {
file = new File("D:/data/file.txt");
fileInputStream = new FileInputStream(file);
System.out.println("Available bytes in file: "+fileInputStream.available());
int line;
while ((line=fileInputStream.read()) != -1) {
System.out.print((char)line);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
Вывод :
Available bytes in file: 48 Hello world. This is a FileInputStream Program.
Обратите внимание, что file.txt – это файл, используемый в вышеуказанной программе, и его содержимое распечатывается. Вы можете создать любой другой файл и запустить эту программу, внеся необходимые изменения.
Java 7 предоставляет try с ресурсом, который представляет собой оператор try, объявляющий один или несколько ресурсов. Ресурс-это объект, который должен быть закрыт после завершения работы с ним программы. Инструкция try with resource гарантирует, что каждый ресурс будет закрыт в конце инструкции.
Давайте взглянем на приведенный ниже пример программы с использованием try with resources.
package com.journaldev.examples;
import java.io.File;
import java.io.FileInputStream;
/**
* Java Read file using FileInputStream with Try with Resource
*
* @author pankaj
*
*/
public class FileInputStreamTryWithResource {
public static void main(String[] args) {
File file = new File("D:/data/file.txt");
try (FileInputStream fileInputStream = new FileInputStream(file)){
System.out.println("Available bytes in file: "+fileInputStream.available());
int line;
while ((line=fileInputStream.read()) != -1) {
System.out.print((char)line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Это даст тот же результат, что и предыдущая программа. Также проверьте текстовый файл чтения java для получения дополнительной информации о том, как читать текстовый файл на java.
5.2) доработать()
Метод FileInputStream finalize() гарантирует, что метод close() этого файла inputstream вызывается, когда на него больше нет ссылок.
Если мы попытаемся получить доступ к FileInputStream после вызова finalize(), мы получим исключение .
package com.journaldev.examples;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* Java FileInputStream Finalize method example
*
* @author pankaj
*
*/
public class FileInputStreamFinalizeExample extends FileInputStream{
public FileInputStreamFinalizeExample(String name) throws FileNotFoundException {
super(name);
}
public static void main(String[] args) {
FileInputStreamFinalizeExample file = null;
try {
file = new FileInputStreamFinalizeExample("D:/data/file.txt");
System.out.println("Available bytes in the file: "+file.available());
int line;
while ((line=file.read()) != -1) {
System.out.print((char)line);
}
//calling finalize method
file.finalize();
System.out.println("\n");
System.out.println("------After finalize called--------");
System.out.println(file.available());
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (file != null) {
file.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
Выходные данные вышеупомянутой программы приведены ниже:
Available bytes in the file: 48 Hello world. This is a FileInputStream Program. ------After finalize called-------- java.io.IOException: Stream Closed at java.io.FileInputStream.available(Native Method) at com.journaldev.examples.FileInputStreamFinalizeExample.main(FileInputStreamFinalizeExample.java:31)
5.3) getFD()
FileInputStream getFD() возвращает объект FileDescriptor, представляющий соединение с фактическим файлом в файловой системе, используемой этим файловым потоком. Давайте рассмотрим приведенный ниже пример программы.
package com.journaldev.examples;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
/**
* Java FileInputStream FileDescriptor Example
*
* @author pankaj
*
*/
public class FileInputStreamFileDescripterExample {
public static void main(String[] args) {
File file = new File("D:/data/file.txt");
try (FileInputStream fileInputStream = new FileInputStream(file)){
FileDescriptor fileDescriptor = fileInputStream.getFD();
boolean valid = fileDescriptor.valid();
System.out.println("Valid file: "+valid);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Результатом работы вышеуказанной программы является:
Valid file: true
5.4) чтение(байт[] b, int выкл, int len)
Этот метод считывает байты данных заданной длины из этого входного потока в указанный массив байтов. Если указанная длина не равна нулю, метод блокируется до тех пор, пока не будет доступен некоторый ввод; в противном случае байты не считываются и возвращается 0. Он возвращает количество байтов, считанных в буфер, или -1, если достигнут конец файла.
package com.journaldev.examples;
import java.io.FileInputStream;
/**
* Java Read file using read(byte[] b, int off, int len) method
*
* @author pankaj
*
*/
public class FileInputStreamRead {
public static void main(String[] args) {
try (FileInputStream fileInputStream = new FileInputStream("D:/data/file.txt")) {
byte[] b = new byte[10];
int i = fileInputStream.read(b, 0, 8);
System.out.println("Available bytes in file: " + fileInputStream.available());
System.out.println("Number of bytes in read from file: " + i);
for (byte bs : b) {
char c = (char) bs;
if (bs == 0) {
c = '-';
}
System.out.print(c);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Вывод :
Available bytes in file: 40 Number of bytes in read from file: 8 Hello wo--
5.5) пропустить(длинный n)
Метод FileInputStream skip(long n) пропускает и удаляет указанные n байтов данных из входного потока и возвращает фактическое количество пропущенных байтов. Это вызывает исключение IOException, если указанное n отрицательно.
package com.journaldev.examples;
import java.io.FileInputStream;
/**
* Java Read file with skip(long n) method example
*
* @author pankaj
*
*/
public class FileInputStreamSkip {
public static void main(String[] args) {
try (FileInputStream fileInputStream = new FileInputStream("D:/data/file.txt")) {
System.out.println("Available bytes in the file: " + fileInputStream.available());
int line;
//skip 2 bytes
fileInputStream.skip(2);
System.out.println("Available bytes in the file after skip: " + fileInputStream.available());
while ((line=fileInputStream.read()) != -1) {
System.out.print((char)line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Результатом приведенной выше программы является:
Available bytes in the file: 12 Available bytes in the file after skip: 10 llo world.
5.6) getChannel()
Этот метод возвращает уникальный объект FileChannel, связанный с этим входным потоком файла. Начальная позиция возвращаемого канала будет равна количеству байтов, считанных из файла, а чтение байтов из этого потока приведет к увеличению позиции канала.
package com.journaldev.examples;
import java.io.FileInputStream;
import java.nio.channels.FileChannel;
/**
* Java Read file with getChannel method example
*
* @author pankaj
*
*/
public class FileInputStreamChannel {
public static void main(String[] args) {
FileInputStream fileInputStream = null;
FileChannel fileChannel = null;
try {
fileInputStream = new FileInputStream("D:/data/file.txt");
System.out.println("Available bytes in file: " + fileInputStream.available());
int line;
while ((line=fileInputStream.read()) != -1) {
fileChannel = fileInputStream.getChannel();
System.out.print("No of bytes read: "+fileChannel.position());
System.out.println("; Char read: "+(char)line);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
if (fileChannel != null) {
fileChannel.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
Выход:
Available bytes in file: 12 No of bytes read: 1; Char read: H No of bytes read: 2; Char read: e No of bytes read: 3; Char read: l No of bytes read: 4; Char read: l No of bytes read: 5; Char read: o No of bytes read: 6; Char read: No of bytes read: 7; Char read: w No of bytes read: 8; Char read: o No of bytes read: 9; Char read: r No of bytes read: 10; Char read: l No of bytes read: 11; Char read: d No of bytes read: 12; Char read: .
Это все для Java FileInputStream, я надеюсь, что здесь не было пропущено ничего важного.
Ссылка: API Doc