카테고리 없음

7. JAVA I/O

왱코 2019. 3. 21. 23:54

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바이트 데이터만큼 스킵한다.