본문 바로가기

자바공부

바이트 스트림과 파일 입출력

728x90
반응형

* 바이트 스트림은 바이트 단위로 바이너리 데이터가 흐르는 스트림이다.

바이트 스트림은 바이너리 데이터를 있는 그대로 입출력하기 때문에 이미지나 동영상 파일 입출력에 필수적이고, 문자들로 구성된 파일도 입출력할 수 있다.

 

* FileOutputStream을 이용한 바이너리 파일 쓰기

프로그램 내의 변수나 배열에 들어 있는 바이너리 값을 그대로 파일에 저장해야 하는 경우가 있다. 메모리에 있는 이미지 비트들을 그대로 이미지 파일로 저장하는 경우이다.

 

* FileOutputStream 클래스의 생성자

생성자 설명
FileOutputStream(File file) file이 지정하는 파일에 출력하는 FileOutputStream 생성
FileOutput(String name) name이 지정하는 파일에 출력하는 FileOutputStream 생성
FileOutputStream
(File file, boolean append)
FileOutputStream을 생성하며 append가 true이면 file이 지정하는 파일의 마지막부터 데이터 저장
FileOutputStream
(String name, boolean append)
FileOutputStream을 생성하며 append가 true이면 name 이름의 파일의 마지막부터 데이터 저장

 

*  OutputStream과 FileOutputStream의 공통 주요 메소드

메소드 설명
void write(int b) int 형으로 넘겨진 한 바이트를 출력 스트림으로 출력
void write(byte[] b) 배열 b의 바이트를 모두 출력 스트림으로 출력
void write(byte[] b, int off, int len) len 크기만큼 off부터 배열 b를 출력 스트림으로 출력
void flush() 출력 스트림에서 남아 있는 바이너리 데이터 모두 출력
void close() 출력 스트림을 닫고 관련된 시스템 자원 해제

 

* FileOutpuStream으로 바이너리 파일 쓰기

package Ch0805Ex;
import java.io.*;
public class Ch0805Ex {
	public static void main(String[] args) {
		byte b[] = {7,51,3,4,-1,24};
		
		try {
			FileOutputStream fout = new FileOutputStream("c:\\Temp\\test.out");
			for(int i=0; i<b.length; i++) {
				fout.write(b[i]); // 배열 b의 바이너리를 그대로 기록
                // for문 없이 한 번에 배열 b[]를 저장할 수도 있다.
			}
			fout.close();
		}catch(IOException e) {
			System.out.println("c:\\Temp\\test.out에 저장할 수 없었습니다. 경로명을 확인해 주세요");
			return;
		}
		System.out.println("c:\\Temp\\test.out을 저장하였습니다.");
	}
}

 

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

바이트 스트림으로 파일을 읽는 스트림 클래스는 FileInputStream이다.

 

* FileInputStream 클래스의 생성자

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

 

* InputStream과 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으로 바이너리 파일 읽기

package Ch0806Ex;
import java.io.*;
public class Ex0806Ex {
	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) {	// -1은 파일 끝(EOF)
				b[n] = (byte)c; // 읽은 바이트를 배열에 저장
				n++;
				// fin.read(b);의 한 줄로 코딩할 수 있다.
			}
			// 배열 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에서 읽지 못했습니다. 경로명을 체크해보세요");
		}
	}
}

 

반응형