개발/Java

NIO2

728x90

NIO와 이름은 비슷하지만 크게 관련은 없는 NIO2가 7버전 부터 제공된다.

 

지금까지 파일을 다루기 위해서 제공한 io 패키지와 File 클래으세 미흡한 부분이 많았다. 그래서 이를 보완하는 내용이 많이 포함되어 있다.

 

파일의 속성을 다룰 수 있고, 심볼릭 링크까지 다룰 수 있는 기능 제공하고, 어떤 파일이 변경되었는지 쉽게 확인할 수 있는 WatchService 라는 클래스도 제공된다. 그리고 며가지 채널들도 추가됨.

 

File의 변경점

 

기존의 단점

 

  • 심볼릭 링크, 속성, 파일의 원한 등에 대한 기능이 없음
  • 파일을 삭제하는 delete() 메소드는 실패시 아무런 예외를 발생시키지 않고, boolean 타입의 결과만 제공해줌
  • 파일이 변경되었는지 확인하는 방법은 lastModified()라는 메소드를 제공해주는 long 타입의 겨로가로 이전시간과 비교하는 수 밖에 없었는데, 이 메소드가 호출되면 연계되어 호출되는 클래스가 다수 존재하여 성능상 문제도 많음.

File 클래스를 대체하는 클래스

 

  • Paths : 이 클래스가 제공하는 static한 get() 메소드를 사용하면 Path 라는 인터페이스의 객체를 얻을 수 있다. 여기서 파일과 경로에 대한 정보를 가지고 있음
  • Files : 기존 File 클래스의 단점 보완, Path 객체를 사용하여 파일을 통제하는데 사용
  • FileSystem : 현재 사용중인 파일 시스템에 대한 정보를 처리하는데 필요한 메소드를 제공함. getDefault()를 통해 현재 사용중인 기본 파일 시스템에 대한 정보를 갖고 있는 FileSystem 인터페이스의 객체를 얻을 수 있다
  • FileStore : 파일을 저장하는 디바이스, 파티션, 볼륨 등에 대한 정보들을 확인하는데 필요한 메소드를 제공

위의 모든 클래스는 nio.file 패키지에 위치함.

 

*심볼링 링크란?

 

*CharSequence

 A {@code CharSequence} is a readable sequence of {@code char} values. This
 * interface provides uniform, read-only access to many different kinds of
 * {@code char} sequences.
 * A {@code char} value represents a character in the <i>Basic
 * Multilingual Plane (BMP)</i> or a surrogate. Refer to <a
 * href="Character.html#unicode">Unicode Character Representation</a> for details.

Files 클래스

쓰기, 읽기, 복사,이동, 삭제 등의 메소드들을 제공

 

 

  • StandardOpenOption : 파일들을 열 때 조건을 의미함. Enum 클래스임
    • APPEND  : 쓰기 권한으로 파일을 열고, 기존에 존재하는 데이터가 있으면 가장 끝부분부터 데이터를 저장할 때
    • CREATE : 파일이 존재하지 않으면 새로 생성
    • CREATE_NEW : 파일을 생성하여, 기존 파일이 있으면 실패로 간주
    • DELETE_ON_CLOSE : 파일을 닫을 때 삭제함
    • DSYNC : 수정하는 모든 작업이 순차적으로 처리되도록 
    • READ : 읽기 권한으로 열 때
    • SPARSE : 파일을 Sparse할 때 사용
    • SYNC : 메타데이터에 대한 모든 업데이트는 순차적으로 파일 저장소에서 처리되도록 할 때 
    • TUNCATE_EXISTING : 이미 존재하는 파일이 있을 때, 쓰기 ㅇ권한으로 파일을 열고, 해당 파일의 모든 내용을 지울 때 사용
    • WRITE : 쓰기 권한으로 파일 열 때
  • StandardCopyOption
    • ATOMIC_MOVE : 시스템 처리를 통하여 단일 파일을 이동, 복사할 때에는 사용 불가
    • COPY_ATTRIBUTES : 새로운 파일에 속성 정보도 복사
    • REPLACE_EXISITING : 기존 파일이 있으면 새 파일로 변경

 

 

File클래스에서 제공하는 기능보다 많은 기능을 제공함

/**
 * This class consists exclusively of static methods that operate on files,
 * directories, or other types of files.
 *
 * <p> In most cases, the methods defined here will delegate to the associated
 * file system provider to perform the file operations.
 *
 * @since 1.7
 */

 

 

Path 인터페이스

 

public interface Path
    extends Comparable<Path>, Iterable<Path>, Watchable

정의된 함수

1. relativize()

* Constructs a relative path between this path and a given path.

2. toAbsolutePath()

* Returns a {@code Path} object representing the absolute path of this
* path.

3. normalize()

* Returns a path that is this path with redundant name elements eliminated.

(경로상 . 혹은  .. 을 없애는 작업)

4. resolve()

* Resolve the given path against this path.

(주어진 문자열 하나를 경로로 생각하고, 현재 Path의 가장 마지막 Path로 추가)

 

 

 

WatchService

 

파일이 변경되었는지 확인하는 클래스

기존에는 lastModified()를 주기적으로 호출해야하는 불편함이 있었음.

아래와 같이 선언되어 있음.

public interface WatchService extends Closeable

 

구현 메서드 목록

 

    @Override
    void close() throws IOException;
    WatchKey poll();
  WatchKey poll(long timeout, TimeUnit unit)
        throws InterruptedException;
    WatchKey take() throws InterruptedException;

 

 * A watch service that <em>watches</em> registered objects for changes and
 * events. For example a file manager may use a watch service to monitor a
 * directory for changes so that it can update its display of the list of files
 * when files are created or deleted.

 

 

SeekableByteChannel(random access)

 

채널 : 디바이스 파일 네트워크 등과의 연결 상태를 나타내는 클래스

바이트 기반의 채널을 처리하는 데 사용. 현재 위치를관리하고 해당 위치가 변경되는 것을 허용하도록 되어 있다. 채널을 보다 유연하게 처리하는데 사용된다.

public interface SeekableByteChannel
    extends ByteChannel
 * A byte channel that maintains a current <i>position</i> and allows the
 * position to be changed.
 *
 * <p> A seekable byte channel is connected to an entity, typically a file,
 * that contains a variable-length sequence of bytes that can be read and
 * written. The current position can be {@link #position() <i>queried</i>} and
 * {@link #position(long) <i>modified</i>}. The channel also provides access to
 * the current <i>size</i> of the entity to which the channel is connected. The
 * size increases when bytes are written beyond its current size; the size
 * decreases when it is {@link #truncate <i>truncated</i>}.
 *

 

NetworkChannel,

네트워크 소켓을 처리하기 위한 채널, 네트워크 연결에 대한 바인딩, 소켓 옵션을 세팅하고, 로컬 주소를 알려주는 인터페이스

package java.nio.channels;
 * A channel to a network socket.
 *
 * <p> A channel that implements this interface is a channel to a network
 * socket. The {@link #bind(SocketAddress) bind} method is used to bind the
 * socket to a local {@link SocketAddress address}, the {@link #getLocalAddress()
 * getLocalAddress} method returns the address that the socket is bound to, and
 * the {@link #setOption(SocketOption,Object) setOption} and {@link
 * #getOption(SocketOption) getOption} methods are used to set and query socket
 * options.  An implementation of this interface should specify the socket options
 * that it supports.
public interface NetworkChannel
    extends Channel

MulticastChannel

IP 멀티캐스트를 지원하는 네트워크 채널, 여기서 멀티 태스크는 네트워크 주소인 IP를 그룹으로 묶고 그 그룹에 데이터를 전송하는 방식

 * A network channel that supports Internet Protocol (IP) multicasting.
 *
 * <p> IP multicasting is the transmission of IP datagrams to members of
 * a <em>group</em> that is zero or more hosts identified by a single destination
 * address.
public interface MulticastChannel
    extends NetworkChannel

 

AsynchronousFileChannel

 

AsynchronousFileChannel을 처리한 결과는 java.util.concurrent 패키지의 Future 객체로 받게 된다.

Future 인터페이스로 결과를 받지 않으면

CompletionHandler 라는 인터페이스를 구현한 객체로 받을 수도 있다. CompletionHandler는 모든 데이터가 성공적으로 처리되었을 대 수행되는 completed 메소드와 실패했을 때 처리되는 failed() 메소드를 제공하므로 필요에 따라 적절한 구현체를 사용하면 된다.

 

 * An asynchronous channel for reading, writing, and manipulating a file.
 *
 * <p> An asynchronous file channel is created when a file is opened by invoking
 * one of the {@link #open open} methods defined by this class. The file contains
 * a variable-length sequence of bytes that can be read and written and whose
 * current size can be {@link #size() queried}. The size of the file increases
 * when bytes are written beyond its  current size; the size of the file decreases
 * when it is {@link #truncate truncated}.
 *
public abstract class AsynchronousFileChannel
    implements AsynchronousChannel

Future

비동기 연산의 결과를나타내는 인터페이스.

* A {@code Future} represents the result of an asynchronous
 * computation.  Methods are provided to check if the computation is
 * complete, to wait for its completion, and to retrieve the result of
 * the computation.  The result can only be retrieved using method
 * {@code get} when the computation has completed, blocking if
 * necessary until it is ready.

아래와 같은 메서드들이 정의되어 있다.

    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;

 

TransferQueue

 

package java.util.concurrent;에 정의된 인터페이스

아래와 같이 정의되어 있음.

Producer/Consumer 패턴을 통해특정 타입의 객체를 처리하는 스레드 풀을 미리 만들어 놓고, 해당 풀이 객체들을 받으면 처리하도록 한다.

이 기능을 보다 일반화 하여 SynchronousQueue의 기능을 인터페이스로 끌어 올리면서 좀 더 일반화 해서 BlockingQueue를 확장한 것이다. 

public interface TransferQueue<E> extends BlockingQueue<E> 

아래와 같은 메서드들이 정의되어 있다.

    boolean tryTransfer(E e);
    void transfer(E e) throws InterruptedException;
    boolean tryTransfer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;
    boolean hasWaitingConsumer();
    int getWaitingConsumerCount();

 

 

Objects

java.util 패키지에 선언된 클래스

아래와 같이 정의되어 있고.

public final class Objects

이 클래스는 compare(), equals(), hash(), hashCode(), toSTring() 등의 static한 메소드들을 제공한다. 매개변수로 넘어오는 객체가 null이라 할지라도 예외를 발생시키지 않도록 구현해 놓은 특징이 있다.

 

 * This class consists of {@code static} utility methods for operating
 * on objects, or checking certain conditions before operation.  These utilities
 * include {@code null}-safe or {@code null}-tolerant methods for computing the
 * hash code of an object, returning a string for an object, comparing two
 * objects, and checking if indexes or sub-range values are out of bounds.
 *

 

구현부를 보면

아래와 같이 null을 추가적으로 체크해주는 것을 확인할 수 있다.

    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
    public static int hashCode(Object o) {
        return o != null ? o.hashCode() : 0;
    }

 

'개발 > Java' 카테고리의 다른 글

StringJoiner  (0) 2021.05.18
자바 Optional 이란  (0) 2021.05.18
ThreadLocal이란?  (0) 2021.05.17
자바 volatile 이란?  (0) 2021.05.17
BigInteger, BigDecimal 클래스  (0) 2021.05.17