2024.02.07

김무영·2024년 2월 8일

파일 복사

  • 입력 스트림을 사용하여 특정파일과 연결하고, 파일의 내용을 읽어 들인 후
    출력 스트림을 사용하여 생성도니 파일에 모든 내용을 내보낸다.
  • 8bit stream을 사용하면 모든 파일포맷을 복사할 수 있고,
    16bit stream을 사용하면 독자포멧이 없는 txt파일만 복사 할 수 있다.

HDD 구조

  • 사용자가 저장하는 파일은 HDD에 섹터별로 분리되어 저장된다.
  • 사용하면 할 수록 파일이 쪼개지는 단편화가 진행된다.
  • HDD는 제조사마다 다르지만 일반적으로 512byte를 읽어들인다.
    • 무시 :
      int data = 0;
      while((data=fis.read()!=-1 ){
      //fis.read() : HDD에서 몇 바이트를 읽어 들이든 1Byte만 사용.
      }
    • 경청 :
      1. 512byte를 읽어들였을 때 저장할 배열을 생성.
        byte[] data = new byte[512];
      2. HDD에 읽어들인 크기대로 배열에 저장.
        int dataSize = 0;//읽어들인 크기 저장
        while((dataSize=fis.read( data ))!=-1){
        //1. fis.read : HDD에서 한번에 읽어온 값을
        //2. data : 비어있는 배열에 저장하고
        //3. 읽어들인 데이터의 크기를 변수(dataSize)에 저장
        }
      3. 읽어들인 크기만큼 스트림에 기록
        				 fos.write(data,0,dataSize);

기본형 데이터형을 읽어들이거나 내보낼 때 사용하는 스트림.

  • dataInputStream, DataOutputStream이 제공

instance를 읽어들이거나, 내보낼 때 사용하는 스트림

  • ObjectInputStream, ObjectOutputStream이 제공
  • 기본형 데이터 형은 Stream을 타고 나갈 수 있지만,
    객체(instance)는 Stream을 타고 나갈 수 없다 => 객체는 크기를 알 수 없다.
  • marshal stream.
  • 8bit stream => 한번에 데이터를 8bit씩 보내는 스트림.
  • 참조형 데이터 형이 Stream을 타고 나갈려면 객체가 일정크기로 쪼개져야하는데,
    크기를 알 수 없기 때문에 몇 개로 쪼개져야할 지 알 수 없다.
  • 객체는 중요한 값을 가지고 있을 수도 있기 때문에 JVM외부로 나가는 것을 막아놨다.
  • 기본형 데이터형이 JVM외부로 나가는 것을 막기 위해 transient 접근 지정자를 제공.

instance of 연산자

  • 객체가 클래스로부터 생성되었는지 비교하는 연산자.
  • 사용법 )
    객체명 instanceof 클래스명

NIO( Non - blocking I/O )

  • JDK1.4부터 도입된 클래스
  • 비동기적인 입출력을 제공하는 클래스
  • 기존의 I/O보다 효율적인 다중 연결과 대용량 데이터처리를 할 때 사용.
  • N-I/O의 핵심 구성 요소는 Channel과 Buffer가 있다.
    • Channel : 입출력 소스 ( 파일,네트워크 )
    • Buffffer : 데이터를 임시로 저장하는데 사용.
  • 비동기성( Asynchronous ) : 입출력 작업이 완료될때까지 기다리지 않고 다른 작업을 수행할 수 있는 것.
  • non - blocking : 입출력 작업이 블로킹되지 않고, 다른 작업을 수행하다가 입출력이 가능한 상태가 되면 해당 작업을 수행하는 것.
  • 채널을 통해서 입출력이 일어나고, 데이터는 버퍼를 통해서 전송된다.

대용량 텍스트파일 읽기

  • java.nio.files패키지의 Files 클래스를 사용
    1. 내용을 읽어 들일 파일을 선택.
      java.nio.files.Path = Paths.get("경로");
    2. 해당 파일의 모든 줄을 읽어 들인다.
      List<String> lines = Files.readAllLines( path )
      //반복
      for(String line : lines){
      }

N-I/O를 사용한 파일 복사

  • 방법
    1. 원본파일

      Path original = Paths.get("원본파일명"); // JDK17에서는 of method도 추가되었다.
    2. 복사할 파일

      Path copy = Paths.get("복사할 파일명")
    3. 복사수행

      try{
      Files.copy( original,copy, 옵션 );
         //옵션 : 
      //StandardCopyOption.REPLACE_EXISTING : 파일이 있다면 덮어쓴다.
      }catch(IOException ie){
      
      }

0개의 댓글