포스트

Java - 입출력 및 바이트스트림

👀입출력 스트림

클래스와 메모리, 저장 장치 사이에서 객체는 모두 메모리에 만들어지고 이것은 전원이 꺼지면 사라진다.
이를 해결하기위해 하드디스크와 같은 장치에 파일 형태로 저장하면 전원이 꺼지더라도 데이터가 보존된다.
데이터의 영구보관을 위해 파일에 저장해야 하는데 🎈스트림을 이용하여 가능하다

스트림(Stream)

  • 자바의 입출력 -> 모든 하드웨어에 독립적으로 설계
  • 자바는 입출력을 스트림으로 처리한다
  • 스트림은 ‘개울을 따라 시냇물이 졸졸 흘러간다’ 라는의미에서 순서가 있는 데이터의 연속적인 흐름이다
  • 스트림을 이용해 하드웨어와 입출력을 수행하는 일은 JVM에 의해 실행된다
  • 자바는 입출력 클래스를 java.io 패키지로 제공하고있다

스트림(Stream)의 특징

  • 단방향이다. ( 방향에따라 입력 스트림, 출력 스트림)
  • 선입선출 , FIFO 구조
  • 스트림은 지연될 수 있다 -> 입력 스트림이 흐르는 통로인 파이프가 비어있다면 데이터가 들어올때까지 대기 -> 출력 스트림이 흐르는 통로인 파이프가 꽉차있다면 빈공간이 생길때까지 대기

스트림(Stream)의 분류

1.바이트 스트림

  • 바이트(8bit)를 읽고 쓰기 위한 스트림
  • InputStream,OuputStream 클래스와 하위 클래스를 이용한다
  • 문자 데이터 OR 바이너리 데이터 상관없이 처리가능

2.문자 스트림

  • 16비트 문자나 문자열을 읽고 쓰기위한 스트림
  • Reader,Writer 클래스와 하위 클래스 이용
  • 문자가 아닌 바이너리 데이터는 처리불가
  • 문자가 아닌 데이터를 문자 스트림으로 출력하면 깨져서 출력됨

Java 의 입출력 스트림

입출력 장치와 자바 응용 프로그램 연결

  • 입력 스트림 : 입력 장치로부터 자바 프로그램으로 데이터를 전달하는 객체
  • 출력 스트림 : 자바 프로그램에서 출력 장치로 데이터를 보내는 객체

특징

  • 기본단위 : 바이트(Byte)
  • 단방향 , 선입선출(FIFO)

파일 입출력 예외 처리

파일 입출력 동안 예외 발생 가능

  • 스트림 생성 동안 FileNotFoundException 가 발생한다면 -> 경로명 오류, 디스크 고장
  • 스트림 생성 동안 IOException 가 발생한다면 -> 디스크 오동작, 파일이 깨진경우, 디스크 공간이 모자란경우 등
  • 👌try-catch 블록이 반드시 필요하다

기본 메서드

  • InputStream -> abstract int read() // 한 바이트를 읽어서 반환(0에서 255 사이의 정수)
  • OuputStream -> abstract void write(int b) // 한 바이트를 특정한 장치에 씀
  • Reader -> abstract int read() // 한 문자를 읽어서 반환
  • Writer -> abstract void write(int c) // 한 문자를 특정한 장치에 씀

👀바이트 스트림

OutputStream 클래스와 InputStream 클래스

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

OutputStream 클래스의 주요 메서드

  1. void close() : 출력 스트림 닫기
  2. void flush() : 버퍼에 남은 출력 스트림 출력
  3. void write(int i) : 정수 i의 하위 비트 8비트를 출력
  4. void write(byte buffer[]) : buffer 내용을 출력
  5. void write(byte buffer[], int index, int size) : buffer의 index부터 size만큼 바이트 출력

InputStream 클래스의 주요 메서드

  1. int available() : 현재 읽기 가능한 바이트 수를 반환
  2. void close() : 입력 스트림을 닫기
  3. int read(int i) : 한 바이트를 읽어 int 형으로 반환, 더이상 읽을 값이 없다면- 1 반환
  4. int read(byte buffer[]) : buffer의 크기만큼 읽어 buffer에 저장하고 읽은 바이트 수를 반환
  5. int read(byte buffer[], int offset, int numBytes) : numbytes 만큼을 읽어 buffer의 offset 위치에 저장하고 읽은 바이트 수를 반환

FileInputStream과 FileOuputStream

  • FileInputStream 클래스 생성자와 주요 메서드
    1.FileInputStream(File file) : file이 지정하는 파일로부터 읽는 인풋스트림 생성
    2.FileInputStream(String name) : name이 지정하는 파일로부터 읽는 인풋스트림 생성

  • FileOutputStream 클래스 생성자와 주요 메서드
    1.FileOutputStream(File file) : file이 지정하는 파일로부터 읽는 아웃풋스트림 생성
    2.FileOutputStream(String name) : name이 지정하는 파일로부터 읽는 아웃풋스트림 생성


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

  1. 파일 출력 스트림 생성 (파일열기)
  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
package practice;
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class FileOutputStreamEx {
    
    public FileOutputStreamEx() {
        byte b[] = {7, 51, 3, 4, -1, 24};
        
        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();
 
    }
 
}

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

  1. 파일 입력 스트림 생성
  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
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();
    }
 
}

FilterOutputStream 클래스와 FilterInputStream 클래스

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

  • BufferedInputStream 클래스

    버퍼를 사용하여 스트림을 입력
    BufferedInputStream(InputStream inputStream)
    BufferedInputStream(InputStream inputStream, int bufSize)

  • BufferedOutputStream 클래스

    버퍼를 사용하여 스트림을 출력
    BufferedOutputStream(OutputStream outputStream)
    BufferedOutputStream(OutputStream outputStream, int buffSize)


PrintStream 클래스

  1. FilterOutputStream 클래스로부터 상속된 클래스
  2. 모든 형식의 데이터를 출력하는 기능을 제공
  3. System.out.println문장의 System.out(클래스 변수)은 항상 PrintStream 클래스로부터 생성된 객체를 참조한다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.