1. 스트림
- 데이터를 전송하는 소프트웨어 모듈.
- 스트림의 양 끝에는 입출력 장치, 자바 응용프로그램이 연결됨.
- 단방향
- 기본단위는 바이트 / 문자
2. 문자 스트림
- 2바이트 유니코드 문자 단위로 입출력하는 스트림
[FileReader 이용해 텍스트 파일 읽기]
1. 파일 입력스트림 생성
· FileReader
파일 입력 스트림 생성, 스트림과 파일 연결
FileReader fin = new FileReader("c:\\test.txt"); // 파일 입력스트림 생성, 스트림-파일 연결
2. 파일 읽기
· read()
: 파일로부터 문자 하나를 읽어 int타입으로 리턴. 파일의 끝을 만나면 -1 리턴
int c;
while((c = fin.read()) != -1) { // 문자 하나를 c에 읽어옴. 파일 끝까지 반복
System.out.println((char)c);
}
// 파일이 큰 경우, 속도가 느림
↓ 한 번에 한 블록(버퍼크기)만큼 읽는 방법
char [] buf = new char [1024];
while(true){
int n = fin.read(buf); // 한 번에 1024개 문자를 읽어 buf[]에 저장.
// 파일에 남아있는 문자 수가 1024개보다 작을 때, 실제로 읽은 문자의 개수 리턴
if(n < buf.length) break; // n < 1024이면 파일의 끝까지 읽었다고 판단.
}
3. 스트림 닫기
fin.close();
[파일 입출력 예외처리]
try {
FileReader fin new FileReader("c:\\test.txt");
int c = fin.read();
fin.close();
} catch(IOException e) {
System.out.println("입출력 오류");
}
[InputStreamReader을 이용해 텍스트파일 읽기]
- 바이트 데이터를 문자 집합을 통해 문자로 변환.
- 파일에서 바이트를 읽고, 읽어들인 바이트들이 문자집합에 정의된 문자인지 찾아 문자 리턴
1. 문자 입력스트림 생성
· InputStreamReader
바이트 파일 입력스트림 생성 후, InputStreamReader 객체 생성.
FileInputStream fin = new FileInputStream("c:\\test.txt"); // 바이트 파일 입력스트림 생성
InputStreamReader in = new InputStreamReader(fin, "MS949"); // MS949는 윈도우 디폴트 문자집합
2. 파일 읽기
FileReader로 읽을 때와 같음. (in.read())
[FileWriter 이용해 텍스트 파일 쓰기]
1. 파일 출력 스트림 생성
· FileWriter
- 파일을 열어 스트림과 연결.
- 파일 없을 경우 빈 파일 생성, 파일 있을 경우 파일 내용 지우고 파일 처음부터 쓰도록 함
FileWriter fout = new FileWriter("c:\\test.txt"); // 출력스트림 생성
2. 파일 쓰기
· write()
: 문자 단위로 파일에 저장
fout.write('a'); // 문자 'a'를 파일에 저장
fout.write("abc"); // 문자열 "abc"를 파일에 저장
↓ 한 번에 한 블록씩 쓰기
char [] buf = new char[1024];
fout.write(buf, 0, buf.length); // buf[]배열 처음부터 배열크기만큼 쓰기. buf에 문자 입력하기
3. 스트림 닫기
fout.close();
3. 바이트 스트림
- 바이너리 데이터 다루는 스트림.
- 이미지/동영상 파일, 문자로 구성된 텍스트파일 입출력
[FileInputStream 이용한 바이너리 파일 읽기]
1. 파일 입력 스트림 생성
파일을 찾아 열고, 파일을 연결한 스트림 fin 생성
FileInputStream fin = new FileInputStream("c:\\test.out");
2. 파일 읽기
· read()
byte b[] = new byte[6];
fin.read(b); // 배열 b의 크기만큼 바이트 읽기
// while문 이용:
int n=0, c;
while((c = fin.read()) != -1) {
b[n] = (byte)c; // 읽은 바이트를 배열에 저장
n++;
}
3. 스트림 닫기
fin.close();
[FileOutputStream 이용한 바이너리 파일 쓰기]
1. 파일 출력 스트림 생성
파일 생성해 스트림 연결. 파일이 이미 있으면 내용 지우고 연결
FileOutputStream fout = new FileOutputStream("c:\\test.out");
2. 파일 쓰기
· write()
byte b[] = {1,4,-5};
fout.write(b); // 배열 b[]의 바이트 모두 파일에 저장
// for문 이용해서 쓰기:
for(int i=0; i<b.length; i++)
fout.write(b[i]); // 배열 b[]의 바이트를 바이너리 그대로 파일에 저장. 한바이트씩
3. 스트림 닫기
fout.close();
4. 버퍼 입출력
- 버퍼 입력 스트림: 입력된 데이터를 버퍼에 모아서 한번에 프로그램으로 보냄
- 버퍼 출력 스트림: 프로그램에서 출력한 데이터를 버퍼에 모아서 한번에 출력장치에 출력
[버퍼 출력 스트림 생성]
* 바이트 버퍼 출력 스트림 : BufferedOutputStream()
* 문자 버퍼 출력 스트림 : BufferedWriter()
BufferedOutputStream bout = new BufferedOutputStream(System.out, 20); // 20바이트 크기 버퍼
// BufferedOutputStream은 바이트 단위. 한글은 2바이트이므로 한글 출력하려면
BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(System.out), 5);
[스트림 출력]
↓ 파일을 읽은 뒤, 버퍼 출력 스트림 통해 화면에 출력
FileReader fin = new FileReader("c:\\system.ini");
int c;
while((c=fin.read()) != -1){
bout.write((char)c); // 읽은 문자를 버퍼 출력 스트림에 씀.
}
[버퍼에 남아있는 데이터 출력]
버퍼스트림은 버퍼가 꽉 찼을 때만 출력됨.
버퍼에 있는 데이터 강제 출력하려면 flush()
bout.flush();
[스트림 닫기]
bout.close(); // 버퍼 스트림 닫기
fin.close(); // 파일 입력 스트림 닫기
5. File 클래스
- 입출력 기능은 없음. 입출력은 위의 FileInputStream, FileReader 등을 사용해야 함.
- 파일 / 디렉토리 속성 정보 (경로명, 크기, 타입, 수정 날짜 등) 제공
- 파일 관리 작업 (파일 삭제, 이름 변경, 디렉토리 생성, 디렉토리 내 파일 리스트 제공)
[File 객체 생성]
File f = new File("c:\\temp\\test.txt"); // File 객체 생성
File f = new File("c:\\temp","test.txt"); // 디렉터리와 파일명 나누어 전달
[File 클래스 메소드]
· mkdir() : 새로운 디렉터리 생성
· length() : 파일/디렉터리 크기 리턴 (바이트단위)
· getName() : 파일명 리턴. ex) "system.ini"
· getPath() : 완전경로명 리턴. ex) "c:\\windows\\system.ini"
· getParent() : 부모디렉터리 리턴. ex) "c:\\windows"
· isFile() : 파일 타입인지 판별
· isDirectory() : 디렉터리 타입인지 판별
· list() : 파일과 서브디렉터리 리스트를 문자열 배열(String[])로 리턴
· listFiles() : 파일과 서브디렉터리 리스트를 File[] 배열로 리턴
명품 JAVA Programming 참고
'개념 정리 > Java' 카테고리의 다른 글
[JAVA] 이벤트, 리스너, key 이벤트, 마우스 이벤트 (0) | 2023.10.25 |
---|---|
[JAVA] GUI, 컨테이너, 컴포넌트, 스윙, 배치관리자 (0) | 2023.10.23 |
[JAVA] 제네릭·컬렉션, Vector<E>, ArrayList<E>, Iterator<E>, HashMap<K, V> (0) | 2023.10.21 |
[JAVA] 문자열-기본형 변환, String메소드, Math메소드, Calendar 클래스 (0) | 2023.10.19 |
[JAVA] 패키지, 모듈 (0) | 2023.10.19 |