InputStream은 1byte 객체
InputStreamReader는 2byte 객체
InputStream은 ASCII CODE만 읽을 수 있는 것에 반해
InputStreamReader는 UNICODE, 즉 한글도 구현이 가능하다.
컴퓨터는 buffer에다가 값을 채우고 밀어내는 형식으로 정보를 보내기 때문에 InputStreamReader에서 buffer기능을 추가해야지만 정상적인 정보의 읽기가 가능함을 알 수 있다.
우리가 입력시에 사용하는 Scanner객체는
Scanner sc = new Scanner(System.in)
결국 inputstream + inputstreamreader + bufferedreader를 통해 만들어 진다고 볼 수 있다.
system.out을 대체할 지역변수로 PrintStream객체를 만들고 그것을 부모 객체인 OutputStream으로 업캐스팅해준다.
(이렇게 하는 이유는 아무래도 우리가 사용할 write나 flush는 outputstream에서 모두 해결이 되기 때문이다.)
※input할때는 buffer가 있지만, 출력할 때는 buffer가 없다.
file객체에는 별도의 출력 기능이 존재하지 않는다.
따라서 file을 인자로 하는 FileWriter객체를 활용해서 쓰기가 가능
일반 read와 마찬가지로 bufferedreader가 필요하다.
읽고 쓰는 게 있다면 당연히 입력과 출력도 있겠지?
Read(byte[])인데 read(buffer)을 하면 이 때는 data값이 아닌 buffer안에든 내용의 개수가 return되고 buffer 안에는 읽은 내용이 들어간다.
즉, read는 buffer안에 값을 넣어주고 길이를 return하는 함수다.
Q : 왜 없는 값은 0이 아니라 -1일까
A : 대체로 정수에 대한 없음은 -1, String은 NULL이다.
Q : 왜 선언은 바깥에서하고 객체는 안에서 생성하느냐?
A : 예외사항이 발생하는 객체이기 때문에
Q2 : 그러면 try안에서 선언하면 되지않냐?
A2 : 그럼 finally(try 바깥)에서 fis, fos를 사용하지 못하기 때문에 선언은 바깥에서 생성은 안에서!!
getSource는 event가 일어난 객체의 참조값을 return해줌
따라서 actionlistener에서 command를 추가할 필요없이 field영역에 변수를 지정하는 것만으로도 기능구현이 가능하며 filechooser를 통해 저 file창을 구현할 수 있음