본문 바로가기

Java

JAVA File I/O에 관하여

자바 파일 복사 방법
  1. Stream

  2. FileInputStream inputStream = new FileInputStream(file);
    FileOutputStream outputStream = new FileOutputStream(saveFullPath);
     
    int bytesRead = 0;
    byte[] buffer = new byte[1024];
     
    while ((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }
     
    outputStream.close();
    inputStream.close();

  • 문제점 : 파일크기( 정확히는 스트림의 길이 ) 만큼 while문을 돌면서 끊임없이 읽고쓰기를 반복 중 -> CPU, DISK에 모두 부담
  • 해결 방법 : 스트림을 버퍼에 장착(wrapping, chainning ) 하여 입출력 회수를 줄여보자 => 2번
  1. Buffer

  2. FileInputStream inputStream = new FileInputStream(file);
    FileOutputStream outputStream = new FileOutputStream(saveFullPath);
     
    BufferedInputStream bin = new BufferedInputStream(inputStream);
    BufferedOutputStream bout = new BufferedOutputStream(outputStream);
     
    int bytesRead = 0;
    byte[] buffer = new byte[1024];
    while ((bytesRead = bin.read(buffer, 0, 1024)) != -1) {
        bout.write(buffer, 0, bytesRead);
    }
     
    bout.close();
    bin.close();
     
    outputStream.close();
    inputStream.close();
  • Stream에 Buffer Filter를 장착
  • 문제점 : 데이터를 전송하는데 항상 CPU 연산을 필요로 한다. ( 정확히 어떤 연산을 하는거지? )
  • 해결 방법 : 컴퓨터의 입장에서 IO는 느린 작업중 하나이기 때문에 OS의 native IO 기능을 활용하자. => 3번
  1. Channel

  2. FileInputStream inputStream = new FileInputStream(file);        
    FileOutputStream outputStream = new FileOutputStream(saveFullPath);
     
    FileChannel fcin =  inputStream.getChannel();
    FileChannel fcout = outputStream.getChannel();
     
    long size = fcin.size();
    fcin.transferTo(0, size, fcout);
     
    fcout.close();
    fcin.close();
     
    outputStream.close();
    inputStream.close();

  • JDK 1.4 이상 부터 사용가능한 nio 패키지