I/O4: NIO

I/O4: NIO

NIO(New Input Output)

  • 자바7버전부터 이용가능.
  • 기존 I/O를 대체하는 개념이 아닌 다른 특성을 가진 I/O이다.
  • 지금 file클래스보다는 Path와 files 라이브러리를 사용.
  • 장점 : 다수의 클라이언트환경, 짧은 입출력 작업에 적합.
    • I/O가 더 유리한 경우 : 대용량 처리, 소수의 클라이언트 환경

Java IO vs NIO

https://www.journaldev.com/17794/java-files-nio-files-class




Path와 Files

I/O가 File 하나로 파일 관련 요소들을 관리하던 것을 NIO에서는 Path, Files로 분리해서 관리한다.

  • java.nio.file.Path 인터페이스 : java.io.File과 거의 동일하다.
  • java.nio.files.Files 클래스 : java.io.File과 유사하지만 객체생성 필요없이 메서드로 바로 사용할 수 있어 더 편리하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public static void main(String[] args) throws IOException {
FilesTest ft = new FilesTest();
ft.copyTest();
ft.dirInfo();
ft.readTextFile();
ft.deleteTest();
}//end of main

public void copyTest() throws IOException{
Path src = Paths.get("c:/windows/explorer.exe");
Path target = Paths.get("C:/Temp/files_copy_explorer.exe");
if(Files.isReadable(src)){
Files.copy(src, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("복사완료");
}
}//end of copyTest

public void dirInfo() throws IOException{
Path target = Paths.get(".");
DirectoryStream<Path> dirStream = Files.newDirectoryStream(target);
for(Path p : dirStream){
Date time = new Date(Files.getLastModifiedTime(p).toMillis());
String name = p.getFileName().toString();
long length = Files.size(p);
if(Files.isDirectory(p)){
name = "["+name+"]";
}
System.out.printf("%-20s\t%tF %<tT\t%s%n", name, time, length);
}
}//end od dirInfo


public void readTextFile() throws IOException{
Path target = Paths.get("./form.xml");
BufferedReader reader = Files.newBufferedReader(target);
String line = null;
while ((line = reader.readLine()) != null){
System.out.println(line);
}

List<String> lines = Files.readAllLines(target);
for(String line2 : lines) System.out.println(line2);
}

public void deleteTest() throws IOException {
Path target = Paths.get("C:/Temp/files_copy_explorer.exe");
boolean result = Files.deleteIfExists(target);
String resultStr = result ? "삭제성공" : "삭제실패";
System.out.println(resultStr);
}
//출력값
복사완료
.classpath 2020-06-10 12:32:21 301
.project 2020-06-10 12:32:21 384
[.settings] 2020-08-18 10:42:17 0
[bin] 2020-08-17 11:15:56 4096
config.properties 2020-08-13 12:24:25 96
form.xml 2020-08-18 11:16:11 85
googleImg.png 2020-08-18 09:45:40 4273
mylog_0.log 2020-07-23 11:12:50 1313
[src] 2020-08-17 11:15:55 4096
<사람></사람>
<이름>김하지</이름>
<나이>77</나이>
<총점></총점>
삭제완료




Buffer

  • read/write가 가능한 메모리상의 배열.
  • NIO에서 모든 입출력이 버퍼를 통해서 이루어짐.
  • 장점 : I/O 성능 향상.

http://www.tcpschool.com/cpp/cpp_io_streamBuffer

  • 데이터타입에 따른 종류
    • 다양한 타입의 버퍼가 있지만 실제로 채널은 ByteBuffer를 통해서만 데이터를 읽고 쓸 수 있다.

https://altongmon.tistory.com/287

  • 메모리 위치에 따른 종류
    • 다이렉트버퍼 : OS메모리에 위치.
    • 넌다이렉트버퍼 : JVM 힙메모리에 위치.

https://altongmon.tistory.com/287




java.nio.channel.FileChannel

  • 파일을 읽고 쓰는데 사용되는 채널.
  • 동기화되어있어 멀티스레드 환경에 안전.
  • open()과 close()로 FileChannel을 열고 닫음.
  • 읽기전용 : FileChannel readChannel = FileChannel.open(srcPath, StandardOpenOption.READ
  • 파일생성하고 쓰기 : FileChannel readChannel = FileChannel.open(srcPath, StandardOpenOption.READ
  • 사용한 후에는 close()로 꼭 닫아야함.
  • read()할때 읽은 데이터수가 리턴. 더이상 읽을 데이터가 없을땐 -1리턴