자바

 

 

 

 

 

 

 

class DataStreamTest

package java17_3;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class DataStreamTest {

	public static void main(String[] args) {
		DataInputStream in=null;
		DataOutputStream out =null;
		
		try{
//텍스트 파일이 아닌 이진파일(binary file) 로 자료 저장			
		    File file =new File("C:\\Users\\choi\\Desktop\\android_Image\\data.txt");
			
			out =new DataOutputStream(new BufferedOutputStream(
					new FileOutputStream(file)));
			
			out.writeDouble(3.14); //실수값 저장
			out.writeInt(100);//정수값 저장
			out.writeUTF("바이트 스트림 연습"); //문자열 저장
			out.flush(); //버퍼를 clear 시킴=>파일이 완성됨
			
			System.out.println("데이터가 저장되었습니다.");
			out.close(); //flush() 를 호출하고 스트림을 닫음
						
			in=new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
			System.out.println(in.readDouble());//double 값
			System.out.println(in.readInt());// int 값
			System.out.println(in.readUTF());// 문자열 값
			in.close();// 스트림 닫기
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				if(out!=null)out.close();
				if(in!=null)in.close(); //스트림 닫기
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		
	}
	
	
	
	
	
	

	
	
}


 

=>

데이터가 저장되었습니다.
3.14
100
바이트 스트림 연습

 

class MemberInfoDTO

package java17_3;

import java.io.Serializable;

public class MemberInfoDTO implements Serializable{
	

	private static final long serialVersionUID = 1L;

	private String juminNo;
	private String passwd;
	
	
	
	public MemberInfoDTO(String juminNo, String passwd) {
		super();
		this.juminNo = juminNo;
		this.passwd = passwd;
	}
	
	public String getJuminNo() {
		return juminNo;
	}
	public void setJuminNo(String juminNo) {
		this.juminNo = juminNo;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	@Override
	public String toString() {
		return "MemberInfoDTO [juminNo=" + juminNo + ", passwd=" + passwd + "]";
	}
	

	
	
	
	
	
}

 

class ObjectStreamEx

package java17_3;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import java17_5.MemberDTO;

//객체 직렬화 예제
public class ObjectStreamEx {

	public static void main(String[] args) {
		FileOutputStream fos=null;
		ObjectOutputStream oos =null;//객체를 저장하는 클래스
		MemberDTO m1=new MemberDTO("kim", 30, "90434530-123245", "2234432");
		MemberDTO m2=new MemberDTO("park", 28, "43234530-123245", "223233");
		MemberDTO m3=new MemberDTO("hong", 25, "21434530-123245", "2234432");
		File file=null;
		try{
			file=new File("C:\\Users\\choi\\Desktop\\android_Image\\object.dat");
			fos =new FileOutputStream(file);
			oos=new ObjectOutputStream(fos);
			oos.writeObject(m1);//dto 객체를 파일로 저장
			oos.writeObject(m2);
			oos.writeObject(m3);
			
			System.out.println("객체를 저장했습니다.");
			fos.close();
			oos.close();
			
			ObjectInputStream ois =new ObjectInputStream(new FileInputStream(file));
			
			MemberDTO dto=null;
			int b=0;
			while(true){
				try{
					dto =(MemberDTO)ois.readObject();
					System.out.println(dto.toString());
				}catch(Exception e){
					b=-1;
					//e.printStackTrace();
					if(ois!=null)ois.close();
				}		
				if(b==-1)break;
			}
			
			
			System.out.println("객체를 출력");
						
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(fos!=null)fos.close();
			}catch(Exception e2){
				e2.printStackTrace();
			}
			
			try{
				if(oos!=null)oos.close();
			}catch(Exception e2){
				e2.printStackTrace();
			}
		}
		
		
		
		//파일로 저장된 객체 불러오기
		FileInputStream fis =null;
		ObjectInputStream ois =null;
		try{
			fis=new FileInputStream(file);
			ois=new ObjectInputStream(fis);
			MemberDTO dto1=(MemberDTO)ois.readObject();
			MemberDTO dto2 =(MemberDTO)ois.readObject();
			MemberDTO dto3=(MemberDTO)ois.readObject();
			
			System.out.println(dto1.toString());
			System.out.println(dto2.toString());
			System.out.println(dto3.toString());
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				if(fis!=null)fis.close();
				if(ois!=null)ois.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}	
	}
	
	
}
/*
출력=>



객체를 저장했습니다.
MemberDTO [name=kim, age=30, memberInfoDTO=MemberInfoDTO [juminNo=9442349-321321, passwd=12324]]
MemberDTO [name=park, age=28, memberInfoDTO=MemberInfoDTO [juminNo=9442349-321321, passwd=12324]]
MemberDTO [name=hong, age=25, memberInfoDTO=MemberInfoDTO [juminNo=9442349-321321, passwd=12324]]
객체를 출력
MemberDTO [name=kim, age=30, memberInfoDTO=MemberInfoDTO [juminNo=9442349-321321, passwd=12324]]
MemberDTO [name=park, age=28, memberInfoDTO=MemberInfoDTO [juminNo=9442349-321321, passwd=12324]]
MemberDTO [name=hong, age=25, memberInfoDTO=MemberInfoDTO [juminNo=9442349-321321, passwd=12324]]

*
*/


















 

객체를 저장했습니다.
MemberDTO [name=kim, age=30, memberInfoDTO=null]
MemberDTO [name=park, age=28, memberInfoDTO=null]
MemberDTO [name=hong, age=25, memberInfoDTO=null]
객체를 출력
MemberDTO [name=kim, age=30, memberInfoDTO=null]
MemberDTO [name=park, age=28, memberInfoDTO=null]
MemberDTO [name=hong, age=25, memberInfoDTO=null]

 

class RandomFileExam

package java17_3;

import java.io.RandomAccessFile;
import java.util.RandomAccess;

//순차적인 접근파일
//비순차적인 접근 파일(Random Access File)
public class RandomFileExam {
	public static void main(String[] args) {
		StringBuilder output =new StringBuilder();
		String str =null;
		try {
			//r 읽기 전용, w 쓰기 전용, rw 읽기 쓰기 전용
			RandomAccessFile file 
			=new RandomAccessFile("C:\\Users\\choi\\Desktop\\android_Image\\radomeAccess.txt", "rw");
			
			//파일 포인터 이동
			file.seek(0);
			//기록
			file.write("추가한 내용...".getBytes("ms949"));
			file.seek(0);
			
		//파일 포인터(읽기 위치)가 파일 길이보다 작으면 반복 처리
			while(file.getFilePointer() < file.length()){
				output.append(file.getFilePointer()+":");
				str =file.readLine(); //한 라인을 읽음
//한글 처리
//스트링.getBytes() 스트링을 바이트 배열로 변환
//8859_1 서유럽언어 인코딩 방식				
//ms949 한글인코딩 (다국어지원 x)
//utf-8 한글인코딩	(다국어지원 o)			
//new String( 바이트배열, 캐릭터셋)	스트링의 인코딩방식 변환			
				str =new String(str.getBytes("8859_1"), "ms949");
				output.append(str+"\r\n");//줄바꿈 처리
			}
			file.close();//파일 닫기
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(output.toString());
	}
	
}

 

 

0:추가한 내용.

 

Java 객체 직렬화(Serialization) 와 역직렬화(Deserialization)

 

Java의 직렬화와 역직렬화에 대해서 알아봅시다.

 

 

 

정의

 

Java에서 말하는 직렬화(Serialization)란 과연 뭘까?

말그대로 객체를 직렬화하여 전송 가능한 형태로 만드는 것을 의미한다. 객체들의 데이터를 연속적인 데이터로 변형하여 Stream을 통해 데이터를 읽도록 해준다.

이것은 주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 주로 사용된다.

 

그럼 역직렬화(Deserialization)는?

직렬화된 파일 등을 역으로 직렬화하여 다시 객체의 형태로 만드는 것을 의미한다. 저장된 파일을 읽거나 전송된 스트림 데이터를 읽어 원래 객체의 형태로 복원한다.

 

 

 

 

직렬화 가능한 클래스

 

자. 그럼 직렬화를 해보자!

직렬화를 위한 전제조건이 있다. 바로 직렬화가 가능한 클래스를 먼저 만드는 것이다.

이는 Serializable을 통해 정할 수 있다.

 

public class A {

...

}

 

이런 형태라면 

 

public class A implements Serializable {

...

}

 

위와 같이 직렬화가 가능한 클래스 A에 Serializable 인터페이스를 implements하면 된다.

하지만 단순히 인터페이스를 구현한다고 해서 다 가능한 대상이 되는 것일까? 객체에는 다양한 변수와 메서드, 그리고 상속구조가 존재하는데??

여러가지 상황에 따라 직렬 가능한 클래스와 데이터가 결정된다. 그리고 내가 결정할 수도 있다.

 

 

1. Serializable 인터페이스를 implements

 위의 예시와 같이 Serializable 인터페이스를 구현하는 클래스로 만든다.

 

2. Serializable 없는 경우

 보통의 경우는 직렬화가 불가능하다. 하지만 클래스들간의 관계를 고려해보면 가능한 경우도 있다. 바로 Serializable을 implement한 클래스를 상속받은 경우이다.

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

Like attracts like. (유유상종)

댓글 ( 4)

댓글 남기기

작성