Byte 단위 입출력

말하는 감자·2024년 12월 27일
0

자바 중급

목록 보기
13/21
post-thumbnail

개념

Byte 단위 입력(read)

InputStream

바이트 단위 엽력을 처리하기 위한 기본 클래스.
FileInputStream, ByteArrayInputStream 같은 서브클래스들이 특정 입력 소스로부터 데이터를 읽어온다.

기본 메서드

  • int read(): 입력 소스부터 1바이트를 읽어서 정수로 반환하거나, 스트림의 끝에 도달하면 -1을 반환
  • int read(byte[] b): 바이트 배열만큼 데이터를 읽어와 배열에 저장하고 실제로 읽은 바이트 수를 반환한다. 스트림의 데이터가 배열 크기보다 작으면 필요한 만큼만 읽는다

Byte 단위 출력(write)

OutputStream

바이트 단위 출력을 처리하기 위한 기본 클래스.
FilteOutputStream, ByteArrayOutputStream 같은 서브 클래스들이 특정 출력 대상을 처리

기본 메서드

  • void write(int b): 출력 스트림에 1바이트를 기록한다. 입력 값의 하위 8비트만 사용
  • void write(byte[] b): 배열 전체의 바이트 데이터를 출력 스트림에 기록
  • void write(byte[] b, int start, int len): b배열에서 start부터 시작하여 len만큼의 바이트 수를 작성

예외 처리

  • IOExceptions: 바이트 단위 입출력 작업중에 발생할 수 있는 오류(파일을 찾을 수 없음, 권한 문제 등)

리소스 관리

  • 스트림을 사용한 후 반드시 close() 메서드를 호출하여 스트림과 연결된 리소스를 해제해야 한다.

Code 예시

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

public class ByteExam1 {
    public static void main(String[] args) {
        FileInputStream fis=null;	// null로 초기화
        FileOutputStream fos=null;  // null로 초기화

        try {
            // 읽을 파일 경로
            fis=new FileInputStream("ByteExam1.java");
           // 작성 할 파일 경로
            fos=new FileOutputStream("Byte.txt");

            int readData;
            while((readData= fis.read()) != -1){	// fis.read()는 끝에 도달하면 -1을 반환하며 1바이트씩 읽음
                fos.write(readData);	// 1바이트씩 작성
            }
        }
        catch (IOException e){
            System.out.println(e.getMessage());
        }finally {
            try {
                fos.close();	// 리소스 해제
            }catch (IOException e){
                System.out.println(e.getMessage());
            }
        }
    }
}

결과

Code 실습

문제

data.txt의 내용을 그대로 읽어서 copy.txt로 복사하려고 합니다. 12번째 줄 부터 fis와 fos를 이용해서 코드를 완성해 보세요.

Solution

import java.io.*;

public class ByteReadWriteExam{
    public static void main(String[] args){
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try{
            fis = new FileInputStream("data.txt");
            fos = new FileOutputStream("copy.txt");
            
            int readData=-1;
            while((readData=fis.read())!=-1){
                fos.write(readData);
            }
        }
        catch(Exception e){
            System.out.println(e);
        } 
        finally{
            //fis와 fos를 사용하고 나면 close해야 합니다.    
            try{
                fis.close();
                fos.close();
            }
            catch(Exception e){
                System.out.println(e);
            }
        }
    }
}

결과

+ 심화

  • void write(byte[] b, int start, int len): b배열에서 start부터 시작하여 len만큼의 바이트 수를 작성
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteExam1 {
    public static void main(String[] args) {
        FileInputStream fis=null;
        FileOutputStream fos=null;
        try {
            fis=new FileInputStream("ByteExam1.java");
            fos=new FileOutputStream("copy.txt");

            byte[] b=new byte[512];
            int readData=-1;
            while((readData=fis.read(b))!=-1){
                fos.write(b,0,readData);
            }
        }catch (IOException e){
            System.out.println(e.getMessage());
        }finally {
            try {
                fos.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }

    }
}

기존의 1바이트씩 읽고 쓰는게 아닌 생성한 b의 크기(512 바이트)씩 읽고 씀

  • fis.read(b) 가 호출되면서 fis에서 읽은 값들이 배열 b에 저장되고 읽은 바이트 값(512)을 반환
  • readData 에는 읽은 바이트 값이 저장(모자라지 않았다면 512바이트, 더 이상 읽은 값이 없다면 -1)
  • fos.write.(b,0,readData): 배열 b의 내용을 0부터 readData만큼 스트림에 작성
profile
주니어개발자(?)

0개의 댓글