본문 바로가기

NIO5

Java NIO - Pipe 파이프(Pipe)는 두 스레드를 연결해주는 'One-way' 데이터 커넥션이다. 파이프(Pipe)에는 데이터를 쓸 수 있는 싱크채널(Sink Channel)과 데이터를 읽어가는 소스채널(Source Channel)이 있다. 싱크채널에 데이터를 써주면 파이프를 통해 소스채널로 전달되고, 다른 스레드가 소스채널을 통해 데이터를 읽을 수 있다. Pipe pipe = Pipe.open(); 우선 파이프 객체를 가져온다. Pipe.SinkChannel sinkChannel = pipe.sink(); String data = "Send message"; ByteBuffer buffer = ByteBuffer.allocate(64); buffer.clear(); buffer.put(data.getBytes()); b.. 2021. 1. 6.
Java NIO - 비동기 파일 채널 (AsynchronousFileChannel) Java NIO에서는 비동기적으로 파일 입출력을 실행할 수 있는 AsynchronousFileChannel을 제공한다. FileChannel은 동기적이다. read()/write() 요청을 하면 어찌되었던 메소드에서 리턴을 하고 다음 동작들이 실행된다. 이 동작을 비동기적으로 실행할 수 있도록 해주는 것이 AsynchronousFileChannel이다. Path path = Paths.get("/tmp/test.txt"); AsynchronousFileChannel channel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); Path 객체로 파일 경로를 만들고 정적메소드 AsynchronousFileChannel.open()을 호출해서 채.. 2021. 1. 4.
Java NIO - 파일 다루기 (Files 클래스) Java NIO에는 파일을 손쉽게 다룰 수 있는 유틸성 메소드를 모아둔 Files 라는 클래스가 있다. 주로 Path 인터페이스와 함께 사용해서 파일과 디렉토리를 다루는데 사용된다. Files.exists() 주어진 Path에 해당하는 파일이 파일시스템에 존재하는지 여부를 확인한다. Path path = Paths.get("/tmp/test.txt"); boolean exists = Files.exists(path, LinkOption.NOFOLLOW_LINKS); Path 객체를 가져와서 Files.exists() 메소드의 첫 번째 인자로 넘겨준다. 두 번째 인자로 준 LinkOption.NOFOLLOW_LINKS는 exists() 메소드가 파일 경로를 찾아갈 때 심볼릭 링크는 따라가지 않겠다는 의미다.. 2021. 1. 3.
Java NIO - 파일 읽기 쓰기 (FileChannel, Path) Java NIO를 이용해서 파일을 다룰 수 있는 클래스와 예제 코드를 소개하겠다. 1. FileChannel 파일에서 데이터를 읽고 쓸 수 있는 채널이다. 파일 채널을 생성하기 위해서는 IO의 FileInputStream, FileOutputStream의 getChannel()메소드를 호출하거나 RandomAccessFile의 getChannel() 메소드로 열 수도 있다. // RandomAccessFile 이용 RandomAccessFile file = new RandomAccessFile("testFile.txt", "rw"); FileChannel channel1 = file.getChannel(); // FileInputStream 이용 FileInputStream fis = new FileIn.. 2021. 1. 2.
Java NIO - Buffers Java NIO에서 버퍼(Buffer)는 채널(Channel)과 함께 사용된다. 데이터는 채널에서 읽혀 버퍼로 쓰여지거나 버퍼에 있는 데이터가 채널로 쓰여진다. Java NIO 버퍼(Buffer)는 본질적으로 메모리 블럭이다. 메모리의 한 공간에 할당되어 있는 공간을 NIO Buffer객체로 래핑(Wrapping)한 것으로 메모리로의 접근, 사용을 추상화 해 사용하기 편한 메소드를 제공해준다. 사용자는 버퍼에서 데이터를 얻고, 버퍼로 데이터를 저장한 다음 채널에 쓰거나 읽는다. 버퍼를 이용해 채널에서 데이터를 읽는 패턴은 다음과 같다. 버퍼가 채워진다(read from channel) buffer.flip() 메소드를 호출한다 버퍼에서 데이터를 꺼낸다 buffer.clear() 메소드 혹은 buffer... 2020. 12. 30.