20240926 - Java - IO

Dodo Lee·2024년 9월 26일

[ 입출력 (IO) ]

1. 정의

Input과 Output의 약자
컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는 것
장치와 입출력을 위해서는 하드웨어 장치에 직접 접근이 필요한데,
다양한 매체에 존재하는 데이터들을 사용하기 위해
입출력 데이터를 처리할 공통적인 방법으로 스트림 이용
Input(입력) : 외부에서 내부로 값이 들어오는 것
Output(출력) : 내부에서 외부로 값이 나가는 것

  • 내부 : 자바 프로그램
  • 외부 : 키보드 입력, 파일 또는 폴더 // 모니터, 파일, 프로그램
  • 스트림(Stream) : 값이 오가는 연결 역할을 해 주는 통로
    --> 한 방향으로만 흐름. 따라서, 입력한 곳으로 출력 할 순 없음
    --> 입력 스트림, 출력 스트림이 따로 만들어야 됨

2. File 클래스

파일 시스템의 파일을 표현하는 클래스
파일 크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능 제공

3. Stream 클래스

입출력 장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스
모든 스트임은 단반향이며, 각각의 장치마다 연결할 수 있는 스트림 존재
하나의 스트림으로 입출력을 동시에 수행할 수 없으므로 동시에 수행하려면 2개의 스트림 필요
3-1) 바이트 기반 스트림 : 1byte 만 지나갈 수 있음(한글을 내보낼 수 없음)

  • 입력 스트림 : InputStram / XXXInputStream
  • 출력 스트림 : OutputStream / XXXOutputStream
    3-2) 문자 기반 스트림
  • 입력 스트림 : Reader / XXXReader
  • 출력 스트림 : Writer / XXXWriter
FileOutputStream fos = null;
FileInputStream fis = null;

4. 보조 스트림

스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용
보고 스트림은 실제 데이터를 주고 받는 스트림이 아니기 때문에 입출력 처리 불가능
기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림 생성

BufferedOutputStream bos = null;
bos = new BufferedOutputStream(fos);
BufferedInputSteream bis = null;
bis = new BufferedInputStream(fis);

** 속도 체크 코드

System.nanoTime();

1970.01.01 09:00:00 부터 현재 시간까지의 차이를 ns(nano second)로 반환
1ms = 1/1000s
1us = 1/1000ms
1ns = 1/1000us
-> 수행 전과 후 시간을 입력 받아 두 시간의 차이를 통해 수행 시간을 계산

long startTime = System.nanoTime();
fos.write(content.getBytes());
long endTime = System.nanoTime();
System.out.prtinln("[수행 시간] : " + (endTime - startTime) + "ns");

5. 파일 복사

5-1) 순서

1) 입력된 경로에 파일이 있는지 검사
2) 있으면 파일 내용을 모두 읽어오기 : FileInputStream + BufferedInputStream
3) 읽어온 내용을 같은 경로 위치에 "파일명_복사본" 이름으로 출력

  • Scanner 대신 BufferedReader 이용

5-2) 코드

public void fileCopy(){
  BufferedReader br = null;
  FileInputStream fis = null;
  BufferedInputStream bis = null;
  FileOutputStreasm fos = null;
  BufferedOutputStream bos = null;
  try{
    br = new Buffered(new InputStreamReader(System.in);
    System.out.print("파일 경로 입력 : ");
    String target = br.readLine();
    File file = new File(target);
    if(!file.exists()){
      System.out.println("[해당 경로에 파일이 존재하지 않습니다.]");
      return;
    }
    fis = new FileInputStream(target);
    bis = new BufferedInputStream(fis);
    byte[] bytes = bis.readAllBytes();
    StringBuilder sb = new StringBuilder();
    sb.append(target);
    int insertPoint = target.lastIndexOf(".");
    sb.insert(insertPoint, "_복사본");
    String copy = sb.toString();
    fos = new FileOutputStream(copy);
    bos = new BufferedOutputStream(fos);
    bos.write(bytes);
    bos.flush();
    System.out.prinln("복사 완료 : " + copy);
  }catch (Exception e){
    e.printStackTrace();
  }finally{
    try{
      if(br != null) br.close();
      if(bis != null) bis.close();
      if(bos != null) bos.close();
    }catch (Excetpion e){
      e.printStackTrace();
    }
  }
}
profile
연습생

0개의 댓글