* Data[Input/Output]Stream을 브릿지 클래스로 넣어 자바의 자료형에 맞게 입출력을 할 수 있다

파일 출력(데이터 저장)

: 자바 기본 자료형 변수 선언(int, double, byte, char ,,,) -> DataOutputStream -> FileOutputStream

import java.io.*;
//자바의 자료형에 맞게 데이터를 파일에 저장
//DataOutputStream를 거쳐서 파일을 생성하지 않으면 모든 정보가 string으로 저장된다

public class DataOutputTest {

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		//파일로 저장
		FileOutputStream fos = new FileOutputStream("c:/webtest/3.java/data.txt");
		//자바의 자료형에 맞게 포장
		DataOutputStream dos = new DataOutputStream(fos);
		//메모리에 자료형에 맞게 저장
		char kim='김'; //0~65535
		System.out.println((int)Kim);
		byte b=10;
		String str="ab\n";
		byte ba[]= {65,66,67};//A,B,C
		
		//파일로 저장-> write자료형(저장할값);
		dos.writeChar(kim);//<->readChar()
		dos.writeByte(b);
		dos.writeBytes(str);//writeString 아님!(주의)
		dos.write(ba);//ABC배열의 값을 매개변수로 받아서 출력
		dos.close();
		fos.close();
	}
}
/*
c:/webtest/3.java/
위치에 data.txt 파일 생성됨
*/

 

 

파일 읽어오기(데이터 읽어오기)

: FileInputStream -> DataInputStream -> 메모리에 올리고 -> 콘솔에 출력

import java.io.*;
//읽어들이는 부분

public class DataOutputTest2 {

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		
		//만들어진 파일의 내용을 다시 읽어들여서 확인 후 출력하기(자료형 제대로 저장됐는지 확인)
		DataInputStream dis = new DataInputStream(new FileInputStream("c:/webtest/3.java/data.txt"));
		//변수=dis.read자료형()<->dos.write자료형
		//굳이 변수 지정해서 뽑지 않아도 되지만 하나씩 값 확인하기 위함
		char c = dis.readChar();//'한'
		byte b1 = dis.readByte();
		String s = dis.readLine();//앞으로 쓰지말라는 경고로 짝대기 그어짐
		byte bb[]=new byte[3];//65,66,67
		dis.read(bb);//read(읽어들여서 저장할 byte배열을 매개변수로 넣어줌)
		dis.close();

		//변수에 있는 값을 그대로 뽑기-> println
		System.out.println("c=>"+c);
		System.out.println("b1=>"+b1);
		System.out.println("s=>"+s);
		System.out.println("bb=>"+new String(bb));
		//byte[]={65,66,67}=> 이걸 string으로 바꿔서 출력해야함(A,B,C)
		//String 클래스의 생성자를 통해서 byte배열을 String으로 변환할 수 있다
	}
}

 


객체형에 맞게 데이터를 입출력

객체를 파일로 출력

직렬화: 컴퓨터 메모리에 저장된 객체 -> (ObjectOutputStream) -> usb(파일로 저장) 

 

파일 읽어오기

역직렬화 : 파일에 저장된 객체의 저장정보 -> (ObjectInputStream) -> 컴퓨터 메모리에 로딩

 

*모든 클래스의 객체가 전부 파일로 저장되지는 않음-> 객체직렬화가 가능한 클래스로 만들어줘야한다(메모리에 저장된 객체 중 파일로 저장이 가능한 클래스)-> class 클래스명 implements Serializable

import java.io.*;
class Person implements Serializable{
	String name;
	int age;
	transient String addr; 
    //transient 멤버변수=> 이 멤버변수만 파일에 저장하지 않겠다는 의미
}

public class ObjectTest {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Person p = new Person();
		p.name="김";
		p.age=20;
		p.addr="서울";
		
		/*파일로 저장*/
		FileOutputStream fos = new FileOutputStream("c:/webtest/3.java/object.txt");
		//자바에서 파일 경로를 쓸때 \는 식별하지 못한다-> \\ 혹은 /로 써야함
        
		/*자바의 객체에 맞게 포장*/
		ObjectOutputStream oos = new ObjectOutputStream(fos);
        
		//형식) writeObject(저장할객체명) <-> readObject
		//writeObject의 저장할객체명이 obj인 이유?->모든 객체가 다 저장 가능하게 만들기 위함
		oos.writeObject(p);//Person->Object으로 변환되어 저장
		oos.close();
		fos.close();
		
		//만들어진 파일의 내용을 다시 읽어들여서 확인 후 출력
		ObjectInputStream ois = new ObjectInputStream
				(new FileInputStream("c:/webtest/3.java/object.txt"));
		//usb로 옮겨 집에 있는 컴퓨터에 연결-> readObject()은 object이므로
		//다시 꺼내올때는 원래의 객체로 명시적인 형변환이 필요하다
		Person p2 = (Person)ois.readObject();
		System.out.println("이름="+p2.name+",나이="+p2.age+",주소="+p2.addr);
	}
}
/*
이름=김,나이=20,주소=null
*/

 


인터페이스 종류

1. Marker Interface 

기능을 표시해주는 인터페이스

ex) 직렬화 목적으로 만들어진 인터페이스(Serializable) -> 추상메소드 없음

2. 설계목적으로 만들어진 인터페이스

추상메소드가 있어, 구현해야 된다는 통일성, 강제성을 부여함

3. Swing에서 이벤트처리할때 사용

ex) WindowListener, ActionListener 

 

+ Recent posts