프로그램 상의 데이터를 외부매체(모니터, 스피커, 파일)로 출력하거나
입력장치(키볻, 마우스, 마이크, 파일)로 입력받는 과정
=> IO(Input & Output, 입출력)
IO를 진행하고 싶다면
우선적으로 "반드시" 프로그램과 외부매체와의 "통로"를 만들어야 한다.
=> 스트림(Stream)
스트림의 특징
- 단방향 : 입력이면 입력, 출력이면 출력
입력용 스트림 따로, 출력용 스트림이 따로 존재
동시에 입출력을 하고자 한다면?
-> 하나의 스트림으로는 불가능
-> 입력, 출력 스트림 둘다 가지고 있어야 함
- 선입선출(FIFO) : 먼저 전달한 값이 먼저 나오게 됨 => 큐(Queue)
( 순서대로 들어가서 나온다.)
시간이 지나면 문제가 발생할 수 있다.
스트림의 구분
- 통로의 사이즈
바이트 스트림 : 1Byte짜리가 이동할 수 있는 좁은 통로 => 입력(XXXInputStream) / 출력(XXXOutputStream)
문자 스트림 : 2Byte짜리가 이동할 수 있는 넓은 통로 => 입력(XXXReader) / 출력(XXXWriter)
- 외부매체와의 직접적인 연결여부
기반 스트림 : 외부 매체와 직접적으로 연결되는 통로
보조 스트림 : 기반 스트림만으로 부족한 성능을 향상시켜주는 용도의 스트림
=> 단독 사용 불가(기반스트림을 만들고 추가해주는 용도)
=> 속도향상, 자료형에 맞춰서 변환, 객체 단위로 입출력하게 도움
public class FileRun {
public static void main(String[] args) {
// 파일 클래스 객체 생성
// 1. 별도의 경로지정을 하진 않고
// 파일명만 제시해서 생성 =>
// 현재 이 프로젝트 폴더 내에 파일이 생성됨
// File 객체 생성
try {
File file1 = new File("test.txt");
file1.createNewFile();
// createNewFile() : 파일을 생성해주는 메소드
// 2. 경로지정을 한 파일명을 제시해서 만들고 싶다
// => 실제 존재하는 경로를 제시해야 함
// D:\IO실습폴더
File file2 = new File("D:\\IO실습폴더\\test.txt");
// file2 객체 생성
file2.createNewFile(); // 경로에 파일 생성
// 3. 폴더를 생성하고 안에 파일도 생성
// 별도의 경로 지정 x
File forder = new File("ccc");
forder.mkdir(); // make directory
// mkdir() : 폴더를 생성해주는 메소드
File file3 = new File("ccc\\test.txt");
file3.createNewFile();
// 4. 경로지정 후 폴더 생성 후 파일생성
File forder2 = new File("D:\\IO실습폴더\\ddd");
forder2.mkdir();
File file4 = new File("D:\\IO실습폴더\\ddd\\test.txt");
file4.createNewFile();
// File 에서 제공하는 메소드들
System.out.println("파일이세요? : " + file4.isFile());
// 파일이면 true / 폴더면 false를 반환
System.out.println("파일이세요? : " + forder2.isFile());
System.out.println("파일이름 : " + file4.getName()); // 파일명 추출
System.out.println("상위폴더 : " + file4.getParent()); // 상위폴더명 추출
System.out.println("파일용량 : " + file4.length()); // 파일크기
System.out.println("절대경로 : " + file4.getAbsolutePath()); // 절대경로
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void fileSave() {
// FileWriter : 파일로 데이터를 2byte 단위로 출력하는 스트림
FileWriter fw = null;
try {
// 1. 객체 생성 => 파일과 연결된 통로를 만들겠다.
fw = new FileWriter("b_char.txt");
// 2. 파일에 쓰기 => write()
fw.write("11/19 컴백 컴백 \n");
fw.write('A');
char[] arr = {'B', 'C', 'D','E', 'F', 'G'};
fw.write(arr); // 오버로딩
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3. 자원반납 => close() 통로를 달아준다.
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void fileRead() {
// FileRead : 파일로부터 데이터를 2byte단위로 입력받는 스트림
// 0. 객체선언
FileReader fr = null;
try {
// 1. 객체생성
fr = new FileReader("b_char.txt");
// 2. 파일을 읽기 => read()
// 반복문 사용
int value = 0;
while((value = fr.read()) != -1) {
System.out.print((char)value);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}