본문 바로가기

포스트464

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 - Selector '셀렉터(Selector)'는 하나의 스레드가 여러개의 채널을 관리할 수 있게해주는 NIO 컴포넌트다. NIO는 셀렉터라는 메커니즘을 제공하여 하나 이상의 NIO 채널들을 모니터링하고, 데이터 전송이 가능해지는 상황을 인지할 수 있게 해준다. Java NIO - 셀렉터를 사용하는 이유 3개의 클라이언트 연결이 붙어 있는 서버 프로그램을 생각해보자. 서버에는 3개의 소켓채널(SocketChannel)이 열려있을 것이다. 클라이언트는 자기가 보내고 싶을 때 요청을 보내기 때문에 서버는 클라이언트의 요청을 기다려야한다. 가장 쉬운 방법은 클라이언트마다 스레드를 생성해서 붙여주는 방법이다. 각 스레드는 클라이언트와 연결된 채널에서 기다린다. 즉, 새로운 요청이 올 때까지 채널에 블로킹되어 있다. 서버 프로그램을.. 2021. 1. 1.
Java NIO - Chanel 사이의 전송 transferFrom(), transferTo() 입출력 프로그램을 작성할 때 채널과 채널 사이에 데이터를 전송해야할 경우가 있다. 지금까지 정리한 바에 의하면 우선 소스 채널에서 데이터를 버퍼로 읽어들이고, 버퍼에 채워져있는 데이터를 다시 타겟 채널로 쓰는 동작을 생각하게 된다. 하지만 중간에 버퍼가 끼어들게 되면 데이터가 버퍼로 복사되고 다시 채널쪽으로 복사되는 비효율이 있을 수 있다. Java NIO에서는 채널 사이에 데이터를 전송할 수 있도록 transferTo() 메소드와 transferFrom() 메소드를 제공한다. RandomAccessFile sourceFile = new RandomAccessFile("sourceFile.txt", "r"); FileChannel sourceChannel = sourceFile.getChannel(); .. 2020. 12. 31.
[Java 예제] Array를 Set으로 변환 예제 코드 Java에서 배열(Array)을 Set 타입으로 변경하는 코드는 다음과 같다. Set set = new HashSet(Arrays.asList(array)); 배열을 List로 변경한 다음 HashSet의 생성자에 넘겨주면 된다. 참고로 Arrays.asList(array) 동작은 O(1) 연산이다. 그냥 배열을 리스트 API로 해석할 수 있도록 만들어주는 역할을 할 뿐이다. List를 HashSet의 생성자로 넘겨주면, 리스트 크기의 해시 테이블을 먼저 만들고 리스트를 순회하면서 엘리먼트들을 하나씩 HashSet에 추가하는 연산을 수행한다. 즉, 최종적으로는 O(n) 동작이다. Set set = new HashSet(); Collecdtions.addAll(set, array); 결국 풀어쓰면 이 코드.. 2020. 12. 30.
Java NIO - Buffers Java NIO에서 버퍼(Buffer)는 채널(Channel)과 함께 사용된다. 데이터는 채널에서 읽혀 버퍼로 쓰여지거나 버퍼에 있는 데이터가 채널로 쓰여진다. Java NIO 버퍼(Buffer)는 본질적으로 메모리 블럭이다. 메모리의 한 공간에 할당되어 있는 공간을 NIO Buffer객체로 래핑(Wrapping)한 것으로 메모리로의 접근, 사용을 추상화 해 사용하기 편한 메소드를 제공해준다. 사용자는 버퍼에서 데이터를 얻고, 버퍼로 데이터를 저장한 다음 채널에 쓰거나 읽는다. 버퍼를 이용해 채널에서 데이터를 읽는 패턴은 다음과 같다. 버퍼가 채워진다(read from channel) buffer.flip() 메소드를 호출한다 버퍼에서 데이터를 꺼낸다 buffer.clear() 메소드 혹은 buffer... 2020. 12. 30.
[책] 달러구트 꿈 백화점 - 이미예, 팩토리나인 오랜만에 흥미로운 소재의 소설 책을 읽었다. 은 꿈을 파는 백화점에 취업한 '페니'라는 주인공의 이야기이다. 책의 표지에서부터 제목, 소재까지 외국 소설의 느낌을 강하게 받았다. 사실 책 제목만 보고 고른 소설이라 저자 이름도 안 봐서 소설을 읽는 중간까지는 외국 소설인줄 알았다. (읽으면서 '번역 참 잘했네...'라는 생각을 가지고 있었는데 한국소설이었다;;;) 이 소설의 배경은 잠들어야만 입장할 수 있는 독특한 마을의 이야기이다. 우리가 잠들면 꿈을 꾸게 되는 경우가 있는데, 그 꿈을 얻기 위해 찾아오는 마을에서 벌어지는 일들이다. 꿈을 사러오는 손님들은 남녀노소는 물론이고, 반려 동물까지 다양하다. 이 마을에는 꿈을 만드는 꿈 제작자, 꿈을 판매하는 상점(그 중에서 달러구트의 꿈 백화점이 가장 인기.. 2020. 12. 29.
Java NIO - Channel, Buffer 그리고 Selector 자바는 Java 4 부터 새로운 입출력 API를 지원하기 시작했다. NIO라는 이름으로 불리는 API는 New IO 혹은 Non-blocking IO라는 뜻을 가지고 있으며 java.nio 패키지로 포함되었다. 이후 Java 7으로 버전을 올리면서 Java IO와 Java NIO 사이의 일관성 없는 클래스 설계를 바로잡고, 비동기 채널 등의 네트워크 지원을 대폭 강화한 NIO 2 API가 추가되었다. Java NIO는 3가지 컴포넌트로 구성되어 있다. Channel Buffers Selectors 실제로는 이것보다 더 많은 컴포넌트들이 있지만 가장 핵심적으로는 저 3가지를 꼽을 수 있다. 채널(Channel) Java NIO의 모든 IO는 '채널(Channel)'에서부터 시작한다. 채널은 스트림과 유사하.. 2020. 12. 29.