7. JAVA I/O
7. JAVA I/O
1)입출력 Stream
- 모든 데이터의 입출력에 관한 기본적인 메소드만 제공한다.
2)java.io 패키지
- java.io 패키지는 기존의 파일이나 폴더에 대한 제어를 하는데 사용하는 File 클래스를 제공한다.
- File(File parent, String child)
- File(String pathname)
- File(String parent, String child)
- File(URI uri)
- Decorator : java.io패키지의 입출력 스트림을 다룰때 여러가지 클래스와 조합해서 이용하기 위해 Decorator라고 불리는
디자인패턴 설계가 이용된다.
- 객체를 동적으로 서브클래스를 이용해 확장한다.
3)File 클래스, FileReader, FileWriter 클래스
- java.io.File 클래스는 파일뿐만 아니라 디랙토리를 처리하는 것이 가능하다.
- 파일의 데이터를 읽고 쓰기 위한 기능은 제공하고 있지 않다.
- File클래스는 심볼릭, 링크 등 UNIX계의 파일시스템 고유 기능을 이용하는 것은 되지않는다.
- 디렉토리 내의 파일과 하위 디렉토리의 작성, 삭제, 변경등의 이벤트를 감시하는 기능은 제공하고 있지 않다.
- 파일의 소유자, 보안속성등 습득, 설정등은 되지 않는다.
- 바이너리 파일 : 입력/FileInputStream 출력/FileOutputStream
- 텍스트 파일 : 입력/FileReader 출력/FileWriter
4)BufferedReader, BufferedWriter 클래스
- 텍스트 파일의 데이터를 1글자씩 처리하는 경우에는 FileReader와 FileWirter 클래스를 사용할 필요가 있다.
- 조금 더 큰 단위의 데이터를 읽고 쓰는것이 효율적이다.
- 한줄씩 읽고 쓰기 위해서 BufferedReader 클래스와 BufferedWriter클래스가 제공된다.
- String readLine()
- void newLine()
5)PrintStream, PrintWriter 클래스
- java.io.PrintStream과 java.io.PrintWriter는 데이터의 출력 전용 클래스
- 기본형(type) 을 그대로 출력
- 서식변환을 해서 출력
- 자동 flush
6)ObjectOutputStream 클래스
7)Console 클래스
- 표준입력에서 문자열을 읽기 위한 코드
Console cconsole = System.console();
String line = console.readLine();
- Console 클래스에서 패스워드 읽기
public char[] readPassword()
public char[] readPassword(String fmt, object... args)
8)Serialize(직렬화), java.io.Serializable인터페이스
- 객체의 직렬화는 객체의 내용을 바이트 단위로 변환하여 파일 또는 네트워크를 통해서 스트림(송수신)이 가능케 하는것
- 자바는 객체의 I/O처리를 지원하지 않았었다.
- 객체의 직렬화, 역직렬화가 객체를 바이트단위로 변환하여 저장/복원하거나 네트워크로 전송할 수 있게 해준다.
- 직렬화 : java.io.ObjectOutputStream클래스의 writeObject메소드를 사용
- 역직렬화 : java.io.objectInputStream 클래스의 readObject메소드를 사용
- 오브젝트를 직렬화 할때는, static 변수와 transient 키워드로 선언한 변수는 대상에서 제외된다.
9)NIO.2, java.nio.file 패키지
- java.nio.file패키지가 등장한 이유
- 심볼릭,링크같은 UNIX계의파일시스템의고유기능을 이용할 수 없었다.
- 디랙토리 네 발생한 이벤트를 감시하는 것이 되지않았다.
- 기본적인 파일 속성이외의 상세한 파일속성과 설정을 사용하기 위해 플랫폼 고유의 네이티브코드를 이용할 수 있어야했다.
- 처리 실패했을 경우 적절한 예외가 발생하지 않았다. 유용한 예외정보를 얻을 수 없었다.
- java.nio.file.Path 인터페이스 도입함
- java.nio.file.FileSystem 클래스 도입함.(플랫폼 고유 파일시스템 나타낼 수 있음)
FileSystem fileSystem = FileSystems.getDefault();
- static 메소드만 제ㅐ공한다. 파일, 디랙토리의 작성, 삭제, 복사, 이동, 파일속성 획득, 설정 등. 알 수 있다.
10)Path 인터페이스
- Path 오브젝트 얻기
FileSystems.getDefault().getPath("path");
Paths.get("path");
- getRoot() : 루트 확인
- getName(i) : 단계 확인
- getFileName() : 파일 명
- getNameCount() : 경로 단계 수
- subpath(int beginIndex, int endIndex) : begin디렉토리부터 end디렉토리까지 읽어올 지 지정 begin <= i < end
- resolve(): 경로 합치기. 상대패스일 경우 마지막에 디랙토리를 합쳐 반환
- resolveSibling() : 상대패스 일 경우 부모 디랙토리와 전달된 디랙토리를 합쳐 반환
- normalize(path) : '..'와 '.'부분을 처리해서 문자열 경로를 정규화 한다.
- relativize() : 현재의 패스에서 전달받은 패스의 상대패스를 반환한다.
11)FileSystem, FileSystems, Files, Paths클래스
- java.io.File오브젝트에서 Path오브젝트를 얻기
Path path = file.toPath();
- Files 클래스의 copy메소드
- 복사하는 곳에 같은 파일이름이 존재할 경우 예외가 발생(StandardCopyOption.REPLACE_EXISTING 옵션 사용)
- 파일 속성은 복사되지 않는다.(StandardCopyOption.COPY_ATTRIBUTES 옵션 사용)
- 디렉토리 복사시 파일이 있는경우 파일은 복사되지 않는다.
- 심볼릭 링크를 복사한 경우 링크 본체는 복사되지 않고 링크 만 복사된다.(바로가기?)
- File 사이즈 얻기
Path file = Path.get("/var/tmp.txt");
long fileSize = (long)Files.getAttribute(file, "size");
- 디랙토리의 재귀처리
walkFileTree()
- 텍스트 파일 데이터를 스트림 오브젝트 획득
Stream<String> stream = Files.lines(Paths.get("sample.txt");
- Files 클래스의 list 메서드는 주어진 디렉터리의 모든 파일을 훑는다.
list 메서드는 재귀적이지 않기 때문에 해당 디랙토리 내 파일만.
- Files 클래스의 walk 메소드는 깊이를 우선으로 트리를 재귀적으로 찾는다.
심볼릭링크는 옵션 지정이 필요하다.
12)java.nio.file.attribute 패키지
- BasingFileAttributes, DosFileAttributes, PosixFileAttributes
- 파일속성세트를 보여주는 인터페이스 : Attribute View
13)InputStream 클래스, Reader 클래스
- void mark(int readlimit) : 입력 스트림의 현제위치를 마크 설정한다.
- void reset() : 입력 스트림의 읽는 위치를 마지막에 설정된 마크 위치로 이동
- long skip(long n) : 입력 스트림에서 n바이트 데이터만큼 스킵한다.