Data Stream은 .dat 파일을 만들 때 사용하는 스트림으로 


특징은 dat 파일을 읽기 위해서는 어떤 타입이 어떤 순서로 들어있는지 알아야 읽을 수 있기 때문에


쉽게 읽어올 수 없다는 특징을 가진다.



package chap11.exam10.data;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class DataOutput {

	public static void main(String[] args) throws Exception {
		// 자료형을 유지해서 파일에 쓰기
		// 1. 파일 위치 설정
		String path = "C:/img/data.dat";
		// 2. 스트림 준비(보조)
		FileOutputStream fos = new FileOutputStream(path);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		DataOutputStream dos = new DataOutputStream(bos);
		
		// 3. 쓰기
		dos.writeUTF("aaa");
		dos.writeInt(1000);
		dos.writeBoolean(true);
		
		// 4. 비우기
		dos.flush();
		
		// 5. 닫기
		dos.close();
		bos.close();
		fos.close();
	}

}


package chap11.exam10.data;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;

public class DataInput {

	public static void main(String[] args) throws Exception {
		
		// 1. 파일 위치 설정
		String path = "C:/img/data.dat";
		// 2. 스트림 준비(보조)
		FileInputStream fis = new FileInputStream(path);
		BufferedInputStream bis = new BufferedInputStream(fis);
		DataInputStream dis = new DataInputStream(bis);
		
		// 3. 읽기 (파일에 있는 타입들을 알아야 하고
		// 입력한 순서대로 불러야 한다.)
		// 4. 출력
		System.out.println("이름 : " + dis.readUTF());
		System.out.println("급여 : " + dis.readInt());
		System.out.println("승진대상 : " + dis.readBoolean());
		
		
		
		// 5. 닫기
		dis.close();
		bis.close();
		fis.close();
	}

}



다양한 스트림들은 다양한 타입을 다루기에는 적절하지 않고 보통 하나에 특화 되어 있다.


그러나 Object Stream은 데이터 타입의 최상위 객체인 Object를 의미하는 보조 스트림으로


다양한 데이터 타입 뿐만 아니라 객체, 배열, 컬렉션 등 다양한 형태가 들어 갈 수 있다.


하지만 클래스의 경우는 직렬화를 하지 않으면 전달되지 않는다.


직렬화는 전달 할 데이터를 바이트로 바꿔서 나열하는 것이다.


다음 예제는 dat 파일을 만들어 읽는데 Sample이라는 클래스도 함께 전달하는 예제이다.



package chap11.exam11.obj;

import java.io.Serializable;
// 직렬화 인터페이스를 통해 모양을 잡아 준다.
public class Sample implements Serializable {
	/**
	 * 통신 시 사용하는 일련번호 serialVersionUID
	 * 객체 통신을 위한 일련번호
	 */
	private static final long serialVersionUID = 1L;
	int num = 11;
	String team = "edu";
	String job = "manager";
	
	public String method() {
		return "메소드 호출";
	}
}



package chap11.exam11.obj;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;

public class ObjOutput {

	public static void main(String[] args) throws Exception {
		// 1. 파일 위치 설정
		String path = "C:/img/temp/obj.dat";
		// 2. 스트림 준비(보조)
		FileOutputStream fos = new FileOutputStream(path);
		DataOutputStream dos = new DataOutputStream(fos);
		ObjectOutputStream oos = new ObjectOutputStream(dos);
		// 3. 쓰기
		// - Map으로
		Map<String, String> map = new HashMap<>();
		map.put("name",  "kim");
		map.put("phone", "010-1234-5678");
		oos.writeObject(map);
		// - Array로
		oos.writeObject(new int[] {90, 95, 90, 100});
		// - String으로
		oos.writeUTF("기본형도 가능");
		// - Instance Object, 객체화하여 넣기
		oos.writeObject(new Sample());
		// 4. 비우기
		oos.flush();
		// 5. 자원 반납
		oos.close();
		dos.close();
		fos.close();
	}

}



package chap11.exam11.obj;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.Map;
import java.util.Set;

public class ObjInput {

	public static void main(String[] args) throws Exception {
		// 1. 경로 설정
		String path = "C:/img/temp/obj.dat";
		
		// 2. 스트림 생성
		FileInputStream fis = new FileInputStream(path);
		BufferedInputStream bis = new BufferedInputStream(fis);
		ObjectInputStream ois = new ObjectInputStream(bis);
		
		// 3. 읽기 
		Map<String, String> map = (Map<String, String>)ois.readObject();
		int [] scores = (int[])ois.readObject();
		String msg = (String)ois.readUTF();
		Sample sample = (Sample)ois.readObject();
		
		// 4. 출력하기
		Set<String> set = map.keySet();
		for(String key : set) {
			System.out.println(key + " : " + map.get(key));
		}
		
		for(int i = 0; i < scores.length; i++) { System.out.println(scores[i]); }
		
		System.out.println(msg);
		
		System.out.println("sample : " + sample.num);
		System.out.println("sample : " + sample.job);
		System.out.println("sample : " + sample.team);
		System.out.println("sample : " + sample.method());
		
		// 4. 해제
		ois.close();
		bis.close();
		fis.close();
	}

}





Prop은 Properties의 줄임말로 보통 Java Project 내부에서 읽고 쓰기를 한다.


프로그램의 내부에서 사용하기 때문에 환경 설정, 저장한 데이터 등의 데이터를 저장한다.


Properties는 map 인터페이스를 상속받은 자료 구조이다.


다음 예제를 확인해보자. 예제를 실행 하면 클래스 파일 옆에 Properties 파일이 생성된다.



package chap11.exam12.prop;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.util.Properties;

public class PropWriter {

	public static void main(String[] args) throws Exception {
		// 1. 파일 위치 지정
		String path = "src/chap11/exam12/prop/profile.properties";
		
		// 2. Properties 객체 준비
		Properties pro = new Properties();
		
		// 3. 객체에 값 추가 (무엇을 넣어도 문자열로 넣어버림
		pro.put("1", "1111");
		pro.put("2", "2222");
		pro.put("3", "3333");
		pro.put("4", "4444");
		pro.put("5", "5555");
		
		// 4. 스트림 준비
		FileOutputStream fos = new FileOutputStream(path);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		
		// 5. 저장(스트림, 주석)
		pro.store(bos, "simple Comment");
		System.out.println("저장 완료");
		
		// 6. 자원 반납
		bos.close();
		fos.close();
	
	}

}



package chap11.exam12.prop;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

public class PropReader {

	public static void main(String[] args) throws Exception {
		// 1. 불러올 파일 위치 지정
		String path = "";
		// jar로 배포하고나면 사용자마다 경로가 상이하므로
		// 특정 클래스를 기준으로 리소스를 호출해야 한다.
		// 1-1. 경로를 가져오는 방법
//		path = PropReader.class.getResource("profile.properties").getPath();
//		System.out.println(path);
		// 1-2. 스트림으로 직접 불러오는 방
		InputStream is = PropReader.class.getResourceAsStream("profile.properties");
		
		// 2. 프로퍼티 객체 준비
		Properties pro = new Properties();
		
		// 3. 스트림 준비
		BufferedInputStream bis = new BufferedInputStream(is);
		
		// 4. 읽어오기
		pro.load(bis);
		
		// 5. 객체에서 값을 하나씩 추출
		System.out.println(pro.get("1"));
		System.out.println(pro.get("2"));
		System.out.println(pro.get("3"));
		System.out.println(pro.get("4"));
		System.out.println(pro.get("5"));
		
		// 6. 자원 반납
		bis.close();
		is.close();
		
		// 간단한 설정에 좋음, 보안성이 안좋음(전부 String)
		
	}

}



+ Recent posts