
java.io
- 해당 패키지는 파일, 네트워크 스트림, 내부 메모리 버퍼에서 부터 읽거나 쓰는 작업을 지원하기 위해 설계된 패키지임
- 네트워크 통신을 위해 필요한 많은 클래스들을 갖고 있지는 않음(java.net 과 javax.net에 포함되어 있음)
- 소켓 연결이 만들어지고 나서야 program이
InputStream
과OutputStream
을 통해서 데이터를 읽어들이고 쓸 수 있음
java.nio
- java.io가 성능 병목을 만들어서, java.nio 패키지가 나오게 되었음
- java.io는 I/O stream processing에 기반한 구현이고 이것은 본질적으로 blocking 연산임(비록 어느 정도의 concurrency가 내부적으로 있긴 하지만) ↔ java.nio는 메모리 상의 버퍼로부터 읽고 쓰는 방식으로 구현됨(버퍼를 비우고 채우는 오래 걸리는 작업과, 거기서부터 읽고 쓰는 빠른 작업을 분리를 할 수 있게 해줌)
- java.nio 구현은
channel
이라는 중간 프로세스를 도입하여 bulk data를buffer
에 넣고 빼는 작업을 담당함 Selector
는 이벤트에 대한 다수의 channel을 모니터링하기 위한 객체임. 즉, Selector가 I/O 연산을 할 수 있게 준비된channel
을 선택해줌- reading thread는 channel로 부터 이용 가능한 데이터를 가져오고 이용 가능한 것이 없다면 block을 하지 않고 다른 작업을 진행함
- java.io 는 데이터를 캐시하지 않고 읽고 쓰는 반면(순차적으로 읽을 수 밖에 없음) java.nio는 버퍼에다가 읽은 데이터를 저장함. 그래서, 버퍼안에서 이전 데이터와 이후 데이터를 왔다 갔다 하면서 조회가 가능함
- java.io 는 모든 데이터가 읽히기 전까지 stream을 block 하는 반면 java.nio는 non-blocking style로 동작함
List Files in a Directory in Java(java.nio.file.Files, java.nio.file.Paths)
Stream vs Buffer
- Java NIO와 IO사이의 큰 차이는 IO는 Stream 기반이지만, NIO는 Buffer 기반
- 스트림 기반의 Java IO는 스트림으로 부터 한번에 여러 바이트를 읽습니다. 읽은 바이트를 가지고 무엇을 할지는 사용하는 사람에 달려있습니다. 데이터는 어디에도 캐시되있지않습니다. 더구나 스트림 속 데이터에서 앞 뒤로 이동할 수 없습니다. 만약 스트림으로 부터 읽은 데이터 내부에서 앞뒤로 이동할 필요가 있다면, 버퍼를 만들어 캐싱을 해야합니다.
- 버퍼기반의 Java NIO는 조금 다릅니다. 이미 처리된 buffer로부터 데이터를 읽습니다. 만약 필요하다면 버퍼 내부에서 앞뒤로 이동할 수 있습니다. 이러한 특징은 데이터를 처리하는 동안 좀 더 유연함을 제공합니다.
InputStream to ByteArray (to File)
File file = new File("/Users/gilgeun-o/Downloads/게임개발프로세스_copy2.pdf"); try (S3Object download = service.download("copy_pdf.pdf", "testfolder", "testfolder2")) { S3ObjectInputStream objectContent = download.getObjectContent(); byte[] bytes = IOUtils.toByteArray(objectContent); Files.write(file.toPath(), bytes); }