IO

노드스트림

I/O - Stream

  • I/O? 데이터의 입력(input)과 출력(output)
  • 데이터는 한쪽에서 주고 한쪽에서 받는 구조로 되어있음
    • 입력과 출력의 끝단: Node
    • 두 노드를 연결하고 데이터를 전송할 수 있는 개념: Stream
      • 입력 스트림: InputStrema, Reader
      • 출력 스트림: OutputStream, Writer
    • 단방향으로만 통신이 가능하며 하나의 스트림으로 입출력을 같이 처리할 수 없음

Node Stream의 종류와 nameing

node에 연결되는 스트림

try with resource

예외 발생 여부와 관계없이 stream 사용 후 자동으로 close 시켜주는 기능

try() {
} catch() {}

InputStream의 주요 메소드

Byte 단위로 읽을 때 사용

read()
  • read() : byte 하나를 읽어서 int로 반환, 더 이상 읽을 값이 없으면 -1을 리턴
  • read(byte b[]) : 데이터를 읽어서 b를 채우고 읽은 바이트 개수를 리턴, 더 이상 읽을 값이 없으면 0을 리턴
  • read(byte b[], int offset, int len) : 최대 len만큼 데이터를 읽어서 b의 offset부터 b에 저장하고 읽은 바이트 개수를 리턴, len+offset은 b의 크기 이하
    close()
  • close() : 스트림을 종료해서 자원을 반납한다.
try (InputStream input = new ByteArrayInputStream(data.getBytes())) {
    int read = -1;
    while ((read = input.read()) != -1) {
        System.out.printf("%c", read); // 일케 출력해야함
    }
} catch (IOException e) {
    e.printStackTrace();
}

Reader의 주요 메소드

char 단위로 읽을 때 사용

read()
  • read() : char 하나를 읽어서 int로 반환, 더 이상 읽을 값이 없으면 -1을 리턴
  • read(char buf[]) : 데이터를 읽어서 buf를 채우고 읽은 문자 개수를 리턴, 더 이상 읽을 값이 없으면 0을 리턴
  • read(char buf[], int offset, int len) : 최대 len만큼 데이터를 읽어서 buf의 offset부터 buf에 저장하고 읽은 문자 개수를 리턴, len+offset은 buf의 크기 이하
  • read(java.nio.CahrBuffer target) : 데이터를 읽어서 target에 저장, target은 buf 대체
    close()
  • close() : 스트림을 종료해서 자원을 반납한다.
char[] buffer = new char[10];
try (Reader input = new CharArrayReader(korean.toCharArray())) {
    int read = -1;
    while ((read = input.read(buffer)) > 0) {
        System.out.printf("%d, %s\n", read, new String(buffer, 0, read));
    }
} catch (IOException e) {
    e.printStackTrace();
}

OutputStream의 주요 메소드

Byte 단위로 쓸 때 사용

write()

  • write(int b) : b의 내용을 byte로 출력
  • write(byte b[]) : b를 문자열로 변환해서 출력
  • write(byte b[], int offset, int len) : b의 offsset부터 offset+len-1만큼을 문자열로 변환해서 출력
    close()
  • close() : 스트림을 종료해서 자원을 반납한다. 내부적으로 flush()를 호출
    flush()
  • flush() : 버퍼가 있는 스트림에서 버퍼의 내용을 출력하고 버퍼를 비운다.

Writer의 주요 메소드

Char 단위로 쓸 때 사용

write()
  • write(int b) : b의 내용을 char로 출력
  • write(char buf[]) : buf를 문자열로 변환해서 출력
  • write(char buf[], int offset, int len) : buf의 offsset부터 offset+len-1만큼을 문자열로 변환해서 출력
  • write(String str) : str을 출력
  • write(String str, int offset, int len) : str의 offset부터 offset+len-1만큼 출력
    append()
  • append(CharSequence c) : c를 출력하고 Writer를 리턴
  • append(CharSequence c, int start, int end) : c의 start부터 end까지 출력하고 Writer를 리턴
    close()
  • close() : 스트림을 종료해서 자원을 반납한다. 내부적으로 flush()를 호출
    flush()
  • flush() : 버퍼가 있는 스트림에서 버퍼의 내용을 출력하고 버퍼를 비운다.

File

가장 기본적인 입출력 장치 중 하나로 파일과 디렉터리를 다루는 클래스

현재 경로를 아는 방법

File current = new File(".");
System.out.println(current.getCanonicalPath());
//  프로젝트 내부에서 파일을 찾을 때
readMe = new File("bin\\com\\ssafy\\live5\\io\\node\\readme.txt");
//  특정 클래스 기준으로 파일을 찾을 때; 중간에 한글, 공백 x
readMe = new File(UseFileStream.class.getResource("readme.txt").getFile());

FileInputStream, FileOutputStream

FileInputStream()
  • FileInputStream(String name) : name 경로의 파일을 읽는 FileInputStream을 생성
    FileOutputStream()
  • FileOutputStream(String name) : name 경로의 파일에 출력하는 FileOutputStream을 생성한다
  • FileOutputStream(String name, boolean append) : name 경로의 파일에 출력하는 FileOutputStream을 생성한다. 기존에 파일이 있다면 뒤에 이어 쓴다.
long start = System.currentTimeMillis(); // 지금 시간
File src = new File("filepath1");
File target = new File("filepath2");

// file 옮기기
try(FileInputStream fin = new FileInputStream(src);
  FileOutputStream fout = new FileOutputStream(target);){
  byte[] buffer = new byte[bufferSize];
  int read = 0;
  while((read = fin.read(buffer)) > 0) {
    fout.write(buffer, 0, read);
  }
}catch(IOException e) {
  e.printStackTrace();
}

return System.currentTimeMillis() - start; // 시간 재는 법!!

FileReader, FileWriter

  • File.separator : os에 적합한 separator를 넣어줌
File target = new File("c:" + File.separator + "Temp" + File.separator + "diary.txt");
try (Scanner scanner = new Scanner(System.in); // 키보드 입력
    FileWriter writer = new FileWriter(target, true); // true는 append = true라는 의미
    FileReader reader = new FileReader(target);) {

    System.out.println("일기를 작성합니다. 그만두려면 x를 입력하세요.");
    writer.write("\n오늘 날짜: - " + new Date() + "\n");
    
    String str = null;
    while(true) {
      str = scanner.nextLine();
      if(str.equals("X")) {
        break;
      } else {
        writer.write(str + "\n");
      }
    }
    System.out.println("일기 저장 완료!!");

    char[] buffer = new char[10];
    int read = -1;
    while((read = reader.read(buffer)) > 0) {
      System.out.print(String.valueOf(buffer, 0, read));
    }
} catch (IOException e) {
    e.printStackTrace();
}