직렬화

  • 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.
  • 시스템적으로 이야기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기합니다.  

 

스트림

소스와 타겟 사이에 데이터를 전송할때 눈에 보이지 않는 가상의 통로

- 단방향만 된다

입력스트립, 출력스트림

- 다단계 결합이 있다

스트림은 여러개 결합이 가능, 다양한 기능을 구현

- 무한 대기가 존재한다

입력받을떄까지 계속해서 대기하는 상태 

예) 콘솔

 


스트림

 

- 키보드를 통해 값을 입력받아 콘솔에 출력

import java.io.*;
public class SimpleIn {

	//check계열 클래스는 무조건 예외처리해야됨-> 귀찮으니까 throws로 예외처리
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		
		//키보드로부터 값을 입력(문자,특수기호,숫자)-> 재출력
		int charRead;//System.in.read()-> 아스키코드값으로 저장
		                    //더이상 읽어들이지 않으면 -> -1 리턴
		//char 의 범위-> 0~65535
		//입출력에서는 for문 대신 while문 많이 씀-> 그 이유는 돌리는 횟수를 정할 수 없으므로
		System.out.println("입력하고자하는 문자열을 아무거나 입력?");
		while((charRead=System.in.read()) >=0)//아무글자나 계속 입력받는 동안
			//System.out.write(charRead);//저장된 아스키코드값을 문자로 변환하여 출력
			System.out.println(charRead);//저장된값 그대로 출력
	}
}

 

- 파일을 읽어들여 콘솔에 출력

txt 파일 읽기

//외부의 파일(text,image,동영상,실행파일(~.exe)) (byte 단위)(영문자위주)
//-> FileInputStream 
//자바에서는 byte단위, char단위(한글위주,FileReader) 스트림이 있음

import java.io.*;
public class FileInputTest{

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		FileInputStream fis = new FileInputStream("c:/webtest/3.java/jsp.txt");
		//new키워드 기본생성자로 객체 생성이 안되면 api확인해보기(생성자 보기)
		//자바에서 외부파일 불러올때 \ 인식이 안된다-> \\ or /로 해야함
		int read=0;//파일로 읽어들여서 임시로 저장할 변수
		//아스키코드값으로 저장할 것이니까 int형 변수. 
		while(read!=-1) {
			read=fis.read();
			System.out.write(read);
		}
	}
}

 

이미지파일 정보 읽어서 새로운 파일로 저장

import java.io.*;

public class FileOutputTest{

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		FileInputStream fis = new FileInputStream("c:/webtest/3.java/Oracle.png");
		
		//(1)
		/*FileOutputStream fos = new FileOutputStream("c:/webtest/3.java/Oracle2.png");*/
		//(2)
		/*File f = new File("c:/webtest/3.java/Oracle3.png");
		FileOutputStream fos = new FileOutputStream(f);*/
		//(3)다단계결합
		FileOutputStream fos = new FileOutputStream(new File("c:/webtest/3.java/Oracle3.png"));
		
		int read=0;
		while(true) {
			read=fis.read();
			if(read==-1) break; //출력할 것이 없으면 종료하라
			fos.write(read);
		}
	}
}

키보드로 값을 읽어들이기(다단계결합)

System.in(키보드로 데이터 읽어들임) + InputStreamReader(한글이 깨지지 않도록 설정) + BufferedReader(많은 양의 데이터를 한꺼번에 읽어들임)

BufferedReader br = new BufferedReader(Reader in);

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

키보드로 값을 입력 -> 파일로 저장 

//키보드로 값을 입력 받아 파일로 저장(회원가입의 시초)
import java.io.*;
public class Sawon {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
        //모든 정보를 String으로 저장
		String mem_name = null;//"" 이름
		String mem_id=null;//사번
		String mem_pwd=null;//암호
		String mem_age=null;//나이 -> 왜 String으로 저장하는지? 
		String mem_phone=null;//전번 
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//한글로 데이터를 저장(파일-> FileOutputStream(영문자위주), FileWriter(한글위주))
		File f = new File("c:/webtest/3.java/sawon2.txt");
		FileWriter fw = new FileWriter(f);
		
		System.out.println("==회원정보 입력하기==");
		//이름
		System.out.println("이름?");
		mem_name=br.readLine();
		//Id
		System.out.println("사번?");
		mem_id=br.readLine();
		//pwd
		System.out.println("암호?");
		mem_pwd=br.readLine();
		//age
		System.out.println("나이?");
		mem_age=br.readLine();
		//phone
		System.out.println("전번?");
		mem_phone=br.readLine();
		
		//FileWriter(쓰기)<-> FileReader(한글로 된 문서 읽기)
		fw.write(mem_name);fw.write("\r\n");//줄바꿈(1310)
		fw.write(mem_id);fw.write("\r\n");
		fw.write(mem_pwd);fw.write("\r\n");
		fw.write(mem_age);fw.write("\r\n");
		fw.write(mem_phone);fw.write("\r\n");
		fw.write("\r\n");//경계선 역할
		//메모리 관리적인 측면에서 더이상 읽거나 쓸게 없다면 마지막에 메모리 해제를 해줘야 한다
		/*db,네트웤,입출력 관련된 객체는 다 쓰면 메모리 해제를 해줘야한다 
		메모리를 해제해주지 않으면 메모리상에 계속 남아있어 새로운 객체를 생성해서
		실행을 하고자 하지만 이미 사용된 객체라 다음에 제대로된 실행이 되지 않을 수 있음 */
		fw.close();
		br.close();//메모리 해제
		
		//이렇게 하면 sawon파일이 만들어지는데 다시 한번 실행하면 내용이 덮인다
		//FileWriter(f,true)이렇게 바꾸면 append 되어서 내용이 저장된다
	}
}

 

 

--다음에 이어서 DataOutputStream 포스팅 예정입니다.

+ Recent posts