- 자바 입출력은 바이트 단위(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);
}
}