카테고리 없음
고급 자바_1230-1
정재화니
2022. 12. 30. 12:51
문자 기반의 스트림을 이용하여 파일 내용을 읽어보겠습니다.
package kr.or.ddit.basic;
import java.io.FileReader;
import java.io.IOException;
public class FileIOTest03 {
public static void main(String[] args) {
// 문자 기반의 스트림을 이용하여 파일 내용 읽기
try { // Reader로 끝나면 입력 Writer로 끝나면 출력
// 문자 기반의 파일 입력용 스트림 객체 생성
FileReader fr = new FileReader("D:\\highjava\\D_other\\test.txt");
int c;
while( (c = fr.read()) != -1 ) {
System.out.print((char)c);
}
} catch (IOException e) {
// TODO: handle exception
}
}
}
결과를 보면
입력이 되는것을 알 수 있습니다.
UTF-8로 저장했을 때와 ANSI로 저장했을때의 차이를 보도록 하겠습니다.
ANSI파일과 UTF-8 파일을 두개 준비합니다.
public class FIleIOTest05 {
// 한글이 저장된 파일 읽어오기 ( 한글의 인코딩을 지정해서 읽어온다.)
public static void main(String[] args) {
try {
// FileReader fr = new FileReader("D:\\highjava\\D_other\\test_utf-8.txt");
FileReader fr = new FileReader("D:\\highjava\\D_other\\test_ansi.txt");
int c;
while( (c=fr.read()) != -1) {
System.out.print((char)c);
}
fr.close();
} catch (IOException e) {
// TODO: handle exception
}
}
}
두가지를 비교해보겠습니다.
UTF-8은 한글이 잘 나오는데 ANSI는 한글이 안나오는 것을 볼 수 있습니다.
Buffered 스트림 사용하기
입출력 성능 향상을 위해서 사용한다.
public static void main(String[] args) {
// 입출력 성능 향상을 위해서 Buffered스트림을 사용한다.
try {
FileOutputStream fout = new FileOutputStream("D:\\highjava\\D_other\\bufferTest.txt");
// 버퍼의 크기가 5인 스트림 객체 생성
// 버퍼의 크기를 정하지 않으면 기본 크기로 만들어진다.(8192byte = 8KB)
BufferedOutputStream bout = new BufferedOutputStream(fout, 5);
for(char i = '1'; i <= '9'; i++) {
// fout.write(i);
bout.write(i);
}
bout.flush(); //버퍼에 남아 있는 데이터를 강제로 모두 출력시킨다.
// fout.close(); // 보조 스트림을 닫으면 보조스트림이 사용한 기반이 되는 스트림도 같이 닫혀서 굳이 안닫아도 된다.
bout.close(); // close() 안에는 flush()기능이 들어있다.
// 그치만 중간에 어떤 작업이 필요할때는 close전에 flush가 필요하다
System.out.println("작업 끝...");
} catch (IOException e) {
// TODO: handle exception
}
}
버퍼를 사용하면 이전과 다르게 속도가 빨라지는 것을 알 수 있다.
문자 기반의 Buffered스트림 사용하기
public class BufferedIOTest02 {
public static void main(String[] args) {
// 문자 기반의 Buffered스트림 사용하기
try {
// 이클립스에서 자바 프로그램이 실행되는 현재 위치는 해당 프로그램이 속한 프로젝트 폴더가
// 현재위치가 된다.
//.\src\kr\or\ddit\basic\FileTest01.java
FileReader fr = new FileReader("./src/kr/or/ddit/basic/FileTest01.java");
BufferedReader br = new BufferedReader(fr);
// 문자 기반의 입력용 버퍼 스트림에는 데이터 줄 단위로 읽어올 수 있는 메서드를 제공한다.
// ==> readLine()메서드
String temp = ""; // 읽어온 한 줄의 데이터가 저장될 변수
for(int i = 1; (temp=br.readLine())!=null; i++) {
System.out.printf("%4d : %s\n", i, temp);
}
br.close();
} catch (IOException e) {
e.printStackTrace();;
}
}
}
자료형 단위로 출력할 보조스트림 DataOutputStream객체를 생성하고 출력한 자료를 읽어오기
public class DataIOTest {
public static void main(String[] args) {
try {
FileOutputStream fout = new FileOutputStream("D:\\highjava\\D_other\\test.dat");
// 자료형 단위로 출력할 보조스트림 DataOutputStream 객체 생성
DataOutputStream dout = new DataOutputStream(fout);
dout.writeInt(200); // 정수형으로 데이터 출력
dout.writeFloat(123.456f); // 실수형(float)으로 데이터 출력
dout.writeBoolean(false); // 논리형으로 데이터 출력
dout.writeUTF("ABCDabcd"); // 문자열 형식으로 데이터 출력
System.out.println("출력 완료...");
dout.close(); //스트림 닫기
//-----------------------------------------------------------------
//위에서 출력한 자료 읽어오기
FileInputStream fin = new FileInputStream("D:\\highjava\\D_other\\test.dat");
DataInputStream din = new DataInputStream(fin);
// DataInputStream으로 데이터를 읽어올 때는
// DataOutputStream으로 출력한 순서와 같은 순서로 읽어와야 된다.
System.out.println("정수형: " + din.readInt());
System.out.println("실수형: " + din.readFloat());
System.out.println("논리형: " + din.readBoolean());
System.out.println("문자열: " + din.readUTF());
System.out.println("읽기 작업 완료...");
din.close();
} catch (IOException e) {
// TODO: handle exception
}
}
}
순서가 같아야 한다고 나와 있는데 순서가 달라지면 값이 달라지는 것을 알 수 있다.
객체를 직렬화하여 입출력 할 수 있게 해주는 보조 스트림
객체를 파일에 저장하는 방법
파일에 저장된 객체를 다시 읽어오는 방법
- java.io.Serializable을 구현해야만 직렬화가 가능하다
제어자 transient가 붙은 인스턴스변수는 직렬화 대상에서 제외된다.
Serialiezable을 구현하지 않은 클래스의 인스턴스도 직렬화 대상에서 제외된다.