[Byte 단위 입출력]

hamonjamon·2022년 7월 31일
0
  • 자바 입출력은 바이트 단위(Byte), 문자 단위(Char) 입출력 클래스로 나뉜다.
    • byte단위 입출력클래스는 모두 InputStream과 OutputStream이라는 추상클래스를 상속받아 만들어집니다.
    • 문자(char)단위 입출력클래스는 모두 Reader와 Writer라는 추상클래스를 상속받아 만들어집니다.

| 자바에서 입출력을 진행하면 내부적으로 운영체제는 보통 512바이트씩 읽어오기에 1바이트씩 읽는 프로그램을 작성하는 경우 파일을 읽어올 때 511바이트는 버리면서 프로세스를 진행하게 되어 아래처럼 성능 차이가 발생하는 것이다.


1바이트씩 파일을 읽어들여 생성하는 프로그램

public class ByteExam1 {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis(); //메소드 시작 시간
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("src/main/java/javaIO/exam/ByteExam1.java");
            fos = new FileOutputStream("byte.txt");

            int redaData = -1;
            while ((redaData = fis.read()) != -1) {
                fos.write(redaData);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis(); //메소드 종료 시간
        System.out.println(endTime - startTime);
    }
}

512바이트씩 파일을 읽어들여 생성하는 프로그램

public class ByteExam2 {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis(); //메소드 시작 시간
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("src/main/java/javaIO/exam/ByteExam2.java");
            fos = new FileOutputStream("byte2.txt");

            int readCount = -1;
            byte[] buffer = new byte[512];
            while ((readCount = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, readCount);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis(); //메소드 종료 시간
        System.out.println(endTime - startTime);
    }
}

0개의 댓글