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();
}