2021-09-08

0908 파일 입출력

1. getAbsolutePath() / getCanonicalPath() 차이점:

getCanonicalPath() 는 해당 파일의 경로까지에서 ..을 제거하고 이쁜 절대경로만 출력해줌

2. FileFilter 클래스를 implements함으로써 원하는 파일만 걸러낼수 있다. ( 해당 이름을 포함하고 있는 파일만, 해당 형식의 파일만 등등. ) 

3. 파일입출력

1) InputStream -> InputStreamReader -> BufferedReader

: 1바이트씩 읽는다 -> 여러 바이트를 읽는다 -> 문자열(String)으로 읽는다. 

2) close()를 할때는 순서를 꼭 맞추어, 마지막에 연 객체를 가장 먼저 닫아야 한다. 그렇지 않으면 의존하고 있는 객체 순서가 안 맞아서 고아객체가 생길 수 있다.

3) Stream은 강물. 데이터의 흐름. 강물은 한쪽 방향으로만 흐른다. 거스를 수 없다. 즉 데이터의 흐름이 일방적이고, 양쪽으로 동시에 읽고쓸수없다. 따라서 InputStream과 OutputStream이 각각 따로 존재한다. 

4) System.in 은 InputStream 타입의 정적 필드 변수이다. 따라서 키보드 입력을 받을 때 흔히

Scanner(System.in)했던것은 - Scanner가 생성자 매개변수로 InputStream 타입을 받기 때문이다. 

5) InputStream은 1바이트씩 읽는다. 만약에 int를 넘길경우 2바이트이기 때문에 read()를 부르면 1바이트 읽고 나머지 1바이트는 stream안에 걍 남아있다 ㅋㅋㅋ 그럼 byte[]를 넘기면 어떻습니까? -> 그러나 한글은 char로 변환해도 깨진다. 아스키 코드값에 대응되지 않기 때문이다...

6) Scanner와 BufferedReader는 각기 장단점이 있다.  BufferedReader는 기본적으로 String타입( 혹은CharSequence 타입. 거기서 거기다.) 만 받는다. 공백이나 엔터도 그냥 다 String으로 퉁친다. 문자열을 따로 파싱하지 않기 때문에 속도가 굉장히 빠르다 (스택오버플로우에 따르면 Scanner의 약 6배) 

반면 Scanner는 nextInt nextLong등 .. 다양한 타입을 지원하며 자동으로 파싱해주니까 편리하다. 하지만 그만큼 내부적으로 복잡한 정규식검사를 거치기 때문에 속도가 훨씬 느리다. 동기화도 지원하지 않는다. 그리고 엔터나 공백을 BufferedReader와 다르게 처리하기 때문에 이로인한 부정확한 출력결과가 있을 수 있음. 사용에 주의한다. 

댓글 없음:

댓글 쓰기

0328 fdisk, mkfs, mount, fstab

 1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다.  - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다.  - 마지막에 w를 해야 실제로 반영이 된다.  3. mkfs를 하여 어떤 파일시스...