Language/JAVA

[JAVA] JAVA의 입출력, 바이트 스트림(ByteStream) | Yoon's Dev

Yooniron 2021. 4. 24. 20:55

JAVA의 입출력, 바이트 스트림(ByteStream)

 

 


바이트 스트림

 

■ 바이트 스트림

✓ 바이트 단위의 입출력

 

바이트 스트림과 연관된 클래스

 

 

✓ OutputStream 클래스와 InputStream 클래스

  - 바이트 스트림의 입출력에 필요로 되는 다양한 메서드를 제공하는 추상 클래스

 

- OutputStream 클래스의 주요 메서드

메서드 설명
void close() 출력 스트림을 닫기
void flush() 버퍼에 남아있는 출력 스트림을 출력
void write(int i) 정수 i의 하위 비트 8비트를 출력
void write(byte buffer[]) buffer 내용을 출력
void write(byte buffer[], int index, int size) buffer의 index부터 size 만큼의 바이트를 출력

 

-InputStream 클래스의 주요 메서드

메서드 설명
int available() 현재 읽기 가능한 바이트 수를 반환
void close() 입력 스트림을 닫기
int read() 한 바이트를 읽어 int 형으로 반환, 더 이상 읽을 값이 없다면 -1을 반환
int read(byte buffer[]) buffer의 크기만큼 읽어 buffer에 저장하고 읽은 바이트 수를 반환
int read(byte buffer[], int offset, int numBytes) numbytes 만큼을 읽어 buffer의 offset 위치에 저장하고 읽은 바이트 수를 반환
int skip(long numBytes) numBytes로 지정된 바이트를 건너뛰고 건너 뛴 바이트 수를 반환
void mark(int numBytes) 입력 스트림의 현재 위치를 마크
boolean markSupported() mark()와 reset()를 지원하면 true를 반환
void reset() 입력 시작 부분을 현재의 위치에서 가장 가까운 이전의 마크 위치로 설정

 

FileInputStream과 FileOutputStream

✓ 파일이 입출력 대상

 

-FileOutputStream 클래스 생성자와 주요 메서드

생성자 설명
FileOutputStream(File file) file이 지정하는 파일에 출력하는 FileOutputStream 생성
FileOutputStream(String name) name이 지정하는 파일에 출력하는 FileOutputStream 생성
FileOutputStream(File file, boolean append) FileOutputStream을 생성하며 append가 true이면 file이 지정하는 파일의 마지막부터 데이터 저장
FileOutputStream (String name, boolean append) FileOutputStream을 생성하며 append가 true이면 name 이름의 파일의 마지막부터 데이터 저장
메서드 설명
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() 출력 스트림을 닫고 관련된 시스템 자원 해제

 

 

- 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() 입력 스트림을 닫고 관련된 시스템 자원 해제

 바이트 스트림으로 바이너리 파일 쓰기

✓ 바이너리 값을 파일에 저장하기

  - 프로그램 내의 변수, 배열, 버퍼에 있는 바이너리 값을 파일에 그대로 기록

  1. 파일 출력 스트림 생성(파일 열기)  // 스트림을 생성하고 파일을 열어 스트림과 연결

     ex) FileOutputStream fout = new FileOutputStream("파일경로")

  2. 파일 쓰기  // write()로 문자 하나 씩 파일에 기록

  3. 스트림 닫기  // close()

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package practice;
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class FileOutputStreamEx {
    
    public FileOutputStreamEx() {
        byte b[] = {75134-124};
        
        try {
            FileOutputStream fout = new FileOutputStream("파일경로");
            for(int i=0; i<b.length; i++// 배열 b의 수를 바이너리 그대로 기록
                fout.write(b[i]);
            fout.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
        new FileOutputStreamEx();
 
    }
 
}
 
cs

 

 바이트 스트림으로 바이너리 파일 읽기

✓ 바이너리 파일에서 읽기 위해 FileInputStream 클래스 이용

  1. 파일 입력 스트림 생성(파일 열기)  // 스트림을 생성하고 파일을 열어 스트림과 연결

    ex) FileInputStream fin = new FileInputStream("파일경로");

  2. 파일 읽기 // read()로 문자 하나 씩 파일에서 읽기, 블록 단위로 읽기 가능

  3. 스트림 닫기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package practice;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
 
public class FileInputStreamEx {
    
    public FileInputStreamEx() {
        byte b[] = new byte[6];
        try {
            FileInputStream fin = new FileInputStream("파일경로");
            int n=0, c;
            while((c=fin.read()) != -1 ) {
                b[n] = (byte)c; //읽은 바이트를 배열에 저장
                n++;
            }
            // 배열 b의 바이트 값을 모두 화면에 출력
            for(int i=0; i<b.length; i++)
                System.out.print(b[i] + " ");
            
            fin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
        new FileInputStreamEx();
    }
 
}
 
cs

FilterOutputStream 클래스와 FilterInputStream 클래스

✓ 일반적으로 필터를 사용하기 위해서 사용

 

□ FilterOutputStream 클래스

  - OutputStream 클래스로부터 상속된 클래스

  - 필터를 사용하여 원하는 정보만 출력시켜주는 기능을 제공

  - FilterOutputStream(OutputStream outputStream)

 

□ FilterInputStream 클래스

  - InputStream 클래스로부터 상속된 클래스

  - 필터를 사용하여 원하는 정보만 입력할 수 있는 기능을 제공

  - FileInputStream(InputStream inputStream)

 


 BufferedOutputStream 클래스와 BufferedInputStream 클래스

✓ FilterOutputStream, FilterInputStream 클래스로부터 상속

 

□ BufferedOutputStream 클래스

  - 버퍼를 사용하여 스트림을 출력

  - 생성자

     . BufferedOutputStream(OutputStream outputStream)

     . BufferedOutputStream(OutputStream outputStream, int buffSize)

 

□ BufferedInputStream 클래스

  - 버퍼를 사용하여 스트림을 입력

  - 생성자

    . BufferedInputStream(InputStream inputStream)

    . BufferedInputStream(InputStream inputStream, int bufSize)

 


DataOutputStream 클래스와 DataInputStream 클래스

✓ 자바의 기본 자료형 데이터를 바이트 스트림으로 출력하는 클래스

 

□ DataOutputStream 클래스

  - FilterOutputStream 클래스로부터 상속되었다

  - DataOutput 인터페이스를 사용한 클래스

  - 기본 자료형 데이터를 바이트 스트림으로 출력

     . DataOutputStream(OutputStream outputStream)

  - readByte(), readInt(), readDouble()과 같은 메서드 제공

 

□ DataInputStream 클래스

  - FilterInputStream 클래스로부터 상속되었다

  - DataInput 인터페이스를 사용한 클래스

  - 바이트 스트림으로부터 자바의 기본 자료형 데이터를 입력

     . DataInputStream(InputStream inputStream)

  - writeByte(int v), writeInt(int v), writeDouble(double v)과 같은 메서드 제공

 


■ PrintStream 클래스

FilterOutputStream 클래스로부터 상속된 클래스

✓ 모든 형식의 데이터를 출력하는 기능을 제공

System.out.println문장의 System.out(클래스 변수)은 항상 PrintStream 클래스로부터 생성된 객체를 참조한다.