카테고리 없음

고급 자바_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을 구현하지 않은 클래스의 인스턴스도 직렬화 대상에서 제외된다.