프로그래밍 언어/JAVA

FileInputStream을 이용한 바이너리 파일 읽기

· 코딩마이데이

바이트 스트림으로 파일을 읽는 스트림 클래스는 FileInputStream이며, 생성자와 주요 메소드는 다음과 같습니다.

생성자 설명
FileInputStream(File file) file이 지정하는 파일로부터 읽는 FileInputStream 생성
FileInputStream(String name) name이 지정하는 파일로부터 읽는 FileInputStream 생성

 

메소드 설명
int read() 입력 스트림에서 한 비이트를 얻어 int형으로 리턴
int read(byte[] b) 최대 배열 b의 크기만큼 바이트를 읽음. 읽는 도중 EOF를 만나면 실제 읽은 바이트 수 리턴
int read(byte[] b, int off, int len) 최대 len개의 바이트를 열어 b 배열의 off 위치부터 저장, 읽는 도중 EOF를 만나면 실제 읽은 바이트 수 리턴
int available() 입력 스트림에서 현재 읽을 수 있는 바이트 수 리턴
void close() 입력 스트림을 닫고 관련된 시스템 자원 삭제

 

파일 읽기 스트림 생성

FileInputStream 클래스는 파일과 연경한 바이트 스트림을 생성합니다.

FileInputStream fin = new FileInputStream("c:\\Temp\\test.out");

 

이 코드를 실행하면 c:\\Temp\\test.out 파일을 찾아 열고, 이 파일을 연결한 스트림 fin을 생성합니다.

 

파일 읽기

fin.read() 메서드를 호출하면 파일 스트림으로부터 한 바이트를 읽어 리턴한다. read() 메서드를 이용하여 파일에 저장된 바이트들을 읽어 배열 byte b[]에 다시 채우는 코드는 다음과 같습니다.

byte b[] = new byte[6]; // 비어있는 배열
int n = 0, c;
while ((c = fin.read()) != -1) { // 파일 끝(EOF)까지 힌 바이트씩 읽기
	b[n] = (byte)c; // 읽은 바이트를 배열에 저장
	n++;
}

 

파일의 끝(EOF)를 만나면 fin.read() 메소드는 -1을 리턴합니다. 이 코드의 끝에 있는 다섯 줄은 다음 한 줄로 바꾸어 한 번에 배열로 읽어 들일 수 있다.

fin.read(b); // 파일에서 배열 b[]의 크기만큼 바이트 읽기

 

스트림 닫기

더 이상 스트림이 필요없을 때 close() 메소드를 호출하여 스트림을 닫는다.

fin.close(); // 스트림을 닫는다. 더 이상 스트림으로 호출하여 읽을 수 없다.

 

FileInputStream으로 바이너리 파일 읽기

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamEx {
    public static void main(String[] args) {
        byte b[] = new byte[6]; // 비어 있는 byte 배열
        try {
            // "c:\\Temp\\test.out" 파일을 열어 배얄 b에 저장
            FileInputStream fin = new FileInputStream("c:\\Temp\\test.out");
            int n = 0, c;
            while((c = fin.read()) != -1) {
                b[n] = (byte) c; // 읽은 바이트를 배열에 저장
                n++;
            }
            // 배열 b[]의 바이트 값을 모두 화면에 출력
            System.out.println("c:\\Temp\\test.out에서 읽은 배열을 출력합니다.");
            for (int i = 0; i < b.length; i++)
                System.out.print(b[i]  + " ");
            System.out.println();
            
            fin.close();
        } catch (IOException e) {
            System.out.println("c:\\Temp\\test.out에서 읽지 못했습니다. 경로명을 체크해보세요");
        }
    }
}

 

실행 결과

c:\Temp\test.out에서 읽은 배열을 출력합니다.
7 51 3 4 -1 24