본문 바로가기
java/개념

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

by unhyepnhj 2024. 6. 20.

바이트 스트림

- 바이트 단위로 데이터가 흐르는 스트림

- 바이너리 데이터를 있는 그대로 입출력

- 이미지나 동영상 파일 입출력에 필수적

 

InputStream, OutputStream

- 추상 클래스

- 바이트 입출력 처리를 위한 공통 기능을 가진 슈퍼 클래스

 

FileInputStream, FileOutputStream

- 파일 입출력을 위한 클래스

- 파일로부터 바이너리 데이터를 읽거나 파일에 바이너리 데이터를 저장

 

DataInputStream, DataOutputStream

- 기본 타입 값을 바이너리 형태로 입출력

- 문자열을 바이너리 형태로 입출력


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

- 프로그램 내의 변수나 배열에 들어 있는 바이너리 값을 그대로 파일에 저장

- 메모리에 있는 이미지 비트들을 그대로 이미지 파일로 저장

- 바이너리 파일은 사람이 읽고 해석하는 것이 거의 불가능

- 바이너리 데이터를 파일에 저장할 때 FileOutputStream 클래스 이용

 

FileOutputStream 클래스의 생성자

OutputStream과 FileOutputStream의 공통 주요 메소드

 

파일 출력 스트림 생성

FileOutputStream fout = new FileOutputStream("c:\\Temp\\test.out");
//c\Temp\test.out 파일에 바이너리 데이터를 생성하는 출력 스트림 생성

- FileOutputStream 생성자는 c:\Temp\test.out 파일을 생성하여 연결

- 파일이 이미 있으면 그 내용을 지우고 스트림에 연결

- 쓰기가 이루어지면 c:\Temp\test.out 파일은 바이너리 파일이 됨

 

파일 쓰기

byte b[] = {7, 51, 3, 4, -1, 24};
for(int i=0; i<b.length; i++)
	fout.write(b[i]);	//배열 b[]의 바이트를 바이너리 그대로 파일에 저장

- write() 메소드를 이용하여 한 바이트씩 배열 데이터 기록

fout.write(b);	//배열 b[]의 바이트 모두 저장

- for문 없이 한 번에 저장 가능


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

- FileInputStream은 바이트 스트림으로 파일을 읽는 스트림 클래스

 

FileInputStream 클래스 생성자

 

InputStream과 FileInputStream의 공통 주요 메소드


파일 입력 스트림 생성

- FileInputStream 클래스는 파일과 연결한 바이트 스트림을 생성

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

- c:\Temp\test.out 파일을 찾아 열고 이 파일을 연결한 스트림 fin을 생성

 

파일 읽기

- fin.read() 메소드 호출

- 파일 스트림으로부터 한 바이트를 읽어 리턴

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

- read() 메소드를 이용하여 파일에 저장된 바이트들을 읽고 배열 byte b[]에 다시 채우는 코드

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

- 한 줄로 가능

 

스트림 닫기

fin.close();

예제 8-5 FileOutputStream을 이용하여 byte[] 배열 속에 들어 있는 바이너리 값을 c:\Temp\test.out 파일에 저장

import java.io.*;

public class FileOutputStreamEx {
	public static void main(String[] args) {
		byte b[]={7, 51, 3, 4, -1, 24};
		
		try {
			FileOutputStream fout=new FileOutputStream("c:\\Temp\\test.out");
			fout.write(b);
			fout.close();
		}
		catch(IOException e) {
			System.out.println("c:\\Temp\\test.out에 저장할 수 없습니다. 경로명을 확인해 주세요.");
			return;
		}
		System.out.println("c:\\Temp\\test.out을 저장하였습니다.");
	}
}

 

예제 8-6 FileInputStream을 이용하여 c:\Temtest.out 파일을 읽어 byte[] 배열 속에 저장하고 화면에 출력하는 코드

public class FileInputStreamEx {
	public static void main(String[] args) {
		byte b[]=new byte[6];	//빈 byte 배열
		try {
			FileInputStream fin=new FileInputStream("c:\\Temp\\test.out");
			int n=0, c;
			while((c=fin.read())!=-1) {
				b[n]=(byte)c++;
				n++;
			}
			//출력
			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에서 읽지 못했습니다. 경로명을 다시 확인하세요.");
		}
	}
}

'java > 개념' 카테고리의 다른 글

File 클래스  (0) 2024.06.23
버퍼 입출력과 파일 입출력  (0) 2024.06.23
문자 스트림과 파일 입출력  (0) 2024.06.19
입출력 스트림  (0) 2024.06.19
제네릭과 배열  (0) 2024.06.10