- 학습 목표 달성 확인 목록
- [] 바이너리 파일과 텍스트 파일을 구분할 수 있는가?
바이너리 파일:전용 App.에 의해 특정 형식으로 인코딩해야 된다
따라서 생성/변경하려면 전용 App.이 필요하다(예:hwp,class,psd…)
텍스트 파일:character set 규칙에 따라 인코딩한다.일반 텍스트 편집기로 생성/변경이 가능하다.(예:java,xml,xlsx…)
- [] 바이트 스트림 클래스와 문자 스트림 클래스를 구분하여 설명할 수 있는가?
바이트 스트림:8비트의 바이트를 읽고 쓰기 위한 스트림으로써
InputStream,OutputStream 클래스를 상속 받은 하위 클래스들을 말한다.
문자 스트림:16비트 문자나 문자열들을 읽고 쓰기 위한 스트림으로써 입출력을 위해서는
Reader,Writer 클래스를 상속 받은 하위 클래스들을 이용한다.
- [] 데이터 싱크(sink) 타입에 따라 클래스를 구분하여 설명할 수 있는가?

- [] FileInputStream/FileOutputStream으로 텍스트 출력을 다룰 수 있는가?
public class Exam0130 {
public static void main(String[] args) throws Exception {
FileInputStream in = new FileInputStream("temp/test1.data");
// 반복문을 이용하여 여러 바이트를 읽는다.
int b;
/*
while (true) {
b = in.read();
if (b == -1) // 파일의 끝에 도달하면 -1을 리턴한다.
break;
System.out.printf("%02x ", b);
}
*/
while ((b = in.read()) != -1) {
System.out.printf("%02x ", b);
}
in.close();
}
}
public class Exam0220 {
public static void main(String[] args) throws Exception {
FileInputStream in = new FileInputStream("temp/test1.data");
// 바이트들을 저장할 배열을 넉넉히 준비한다.
// => 이렇게 임시 데이터를 저장하기 위해 만든 바이트 배열을 보통 "버퍼(buffer)"라 한다.
//
byte[] buf = new byte[100];
// read(byte[])
// - 버퍼가 꽉 찰 때까지 읽는다.
// - 물론 버퍼 크기보다 파일의 데이터가 적으면 파일을 모두 읽어 버퍼에 저장한다.
// - 리턴 값은 읽은 바이트의 개수이다.
// read(byte[], 저장할 위치, 저장하기를 희망하는 개수)
// - 읽은 데이터를 "저장할 위치"에 지정된 방부터 개수만큼 저장한다.
// - 리턴 값은 실제 읽은 바이트 개수이다.
int count = in.read(buf);
in.close();
System.out.printf("읽은 바이트 수: %d\n", count);
for (int i = 0; i < count; i++)
System.out.printf("%02x ", buf[i]);
System.out.println();
}
}
- [] FileInputStream/FileOutputStream 클래스와 FileReader/FileWriter 클래스의 사이이 차이점을 이해하는가?
FileInputStream/FileOutputStream 클래스는 바이트단위의 자료를 처리하고
FileReader/FileWriter 클래스는 문자열단위로 자료처리를 한다
- [] JVM 환경 변수 “file.encoding” 의 사용법을 아는가?
이클립에서 애플리케이션을 실행할 때 다음과 같이 JVM 환경변수를 자동으로 붙인다.
$ java -Dfile.encoding=UTF-8 ....
OS에 상관없이 동일한 실행 결과를 얻고 싶다면 다음과 같이 file.encoding 옵션을 붙인다.
$ java -Dfile.encoding=UTF-8 -cp bin/main .....
- [] 드라이버 소프트웨어가 무엇인지 아는가?
한마디로 A와 B를 연결해주는 통역자 같은 역할을 한다.
- [] 스트리밍 API의 등장 이유를 아는가?
Stram API 등장 전
API의 사용법이 달라서 프로그래밍이 불편했다.

하지만 stream API 등장 후
일관된 방법으로 입출력 프로그래밍이 가능할 수 있게 되었다.

- [] FileReader/FileWriter 사용법
-FileWriter:파일에 쓰는 클래스
public class Exam0410 {
public static void main(String[] args) throws Exception {
FileWriter out = new FileWriter("temp/test2.txt");
String str = new String("AB가각");
out.write(str);
out.close();
System.out.println("데이터 출력 완료!");
}
}
-FileReader:파일을 읽는 클래스
public class Exam0120 {
public static void main(String[] args) throws Exception {
// 1) 파일의 데이터를 읽는 일을 하는 객체를 준비한다.
FileReader in = new FileReader("sample/utf8.txt"); // 41 42 ea b0 81 ea b0 81
// 2) JVM 환경 변수 'file.encoding'에 설정된 문자코드표에 따라
// 바이트를 읽어서 UCS2로 바꾼 후에 리턴한다.
//
// - JVM을 실행할 때 다음 옵션을 지정하지 않으면
// -Dfile.encoding=문자표
// - JVM은 OS의 기본 문자표라고 가정하고 파일을 읽는다.
// 만약 이클립스에서 실행한다면,
// UTF-8이라고 가정하고 읽는다.
// 만약 명령창(콘솔창)에서 실행한다면,
// OS에 따라 다르게 읽는다.
//
// 현재 JVM 환경 변수 'file.encoding' 값 알아내기
System.out.printf("file.encoding=%s\n", System.getProperty("file.encoding"));
// file.encoding이 UTF-8로 되어 있다면,
// => 영어는 1바이트를 읽어서 2바이트 UCS2로 변환한다.
int ch1 = in.read(); // 41 => 0041('A')
int ch2 = in.read(); // 42 => 0042('B')
// => 한글은 3바이를 읽어서 2바이트 UCS2로 변환한다.
int ch3 = in.read(); // ea b0 80 => ac00('가')
int ch4 = in.read(); // ea b0 81 => ac01('각')
// 3) 읽기 도구를 닫는다.
in.close();
System.out.printf("%04x, %04x, %04x, %04x\n", ch1, ch2, ch3, ch4);
}
}
- [] 데이터 프로세싱 스트림 클래스의 역할을 이해하는가?
비트이동연산자를 사용하여 출력하고픈 바이트를 오른쪽 맨 끝으로 이동시킨다

- [] 데이터를 입출력할 때 버퍼를 사용하는 이유를 아는가?
데이터를 전송하는데 있어서 목적지로 바로 보내는것이 아니라 중간에 버퍼(여분의 임시 저장소)를 둬서
전송하고자하는 데이터를 임시저장해주는것을 말한다.임시저장된 데이터가 어느정도 채워지면 한꺼번에 데이터를 전송하게 된다
여기서 flush()라는 메서드는 필요할때 데이터를 전송하는 메서드인데 버퍼를 비우는 작업을 한다.

- [] 파일에서 읽은 1바이트를 4바이트 int 값으로 변환할 때 주의할 점을 아는가?
