[JAVA] 직렬화와 여러 입출력 클래스

WOOK JONG KIM·2022년 10월 15일
0

패캠_java&Spring

목록 보기
25/103
post-thumbnail

직렬화(serialization)

인스턴스의 상태를 그대로 파일 저장하거나 네트웍으로 전송(serialization)하고 이를 다시 복원하는(deserialization) 방식

자바에서는 보조 스트림을 활용하여 직렬화를 제공함

ObjectInputStream & ObjectOutputStream

Serializable 인터페이스

직렬화는 인스턴스의 내용이 외부로 유출되는 것이므로 프로그래머가 해당 객체에 대한 직렬화 의도를 표시 해야함

구현 코드가 없는 marker Interface

transient : 직렬화 하지 않으려는 멤버 변수에 사용함(socket등 직렬화 할 수 없는 객체)

class Person implements Serializable{
	
    private static final long serialVersionUID = -150325202544036183L
    
    String name;
    String job;
    
    public Person() {}
    
    public Person(String name, String job){
    	this.name = name;
        this.job = job;
    }
    
    public String toString()
    {
    	return name + "," + job;
    }
}

public class SerializationTest{
	public static void main(String[] args) throws ClassNotFoundException{
    	
        Person personAhn = new Person("이순신", "대표이사");
        Person personKim = new Person("김유신", "상무이사");
        
        try(FileOutputStream fos = new FileOutputStream("serial.out");
        	ObjectOutputStream oos = new ObjectOutputStream(fos))
        {
        	oos.writeObject(personAhn);
            oos.writeObject(personKim);
        } catch(IOException e){
        	e.printStackTrace();
        }
        
        try(FileInputSteram fis = new FileInputStream("serial.out");
        	ObjectInputStream ois = new ObjectInputStream(fis))
        {
        	Person p1 = (Person)ois.readObject();
            Person p2 = (Person)ois.readObject();
        	
            System.out.println(p1);
            System.out.println(p2);
        } catch(IOException e){
        	e.printStackTrace();
        }
     }
}

Externalizable 인터페이스

writerExternal()readExternal()메서드를 구현해야 함

프로그래머가 직접 객체를 읽고 쓰는 코드를 구현할 수 있음

class Person implements Externalizable{

	String name;
    String job;
    
    public Person(){}
    
    public Person(String name, String job){
    	this.name = name;
        this.job = job;
    }
    
    public String toString()
    {
    	return name+","+job;
    }
    
    @Override
    public void writeExternal(ObjectOutput out) throws IOException{
    	out.writeUTF(name);
        out.writeUTF(job);
    }
    
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException{
    	name = in.readUTF();
        job = in.readUTF();
    }
}

여러 입출력 클래스

File 클래스

  • 파일 개념을 추상화환 클래스

  • 입출력 기능은 없고, 파일의 이름,경로,읽기 전용등의 속성을 알 수 있음

  • 이를 지원하는 여러 메서드들이 지원됨

public class FileTest {

	public static void main(String[] args) throws IOException {

		File file = new File("D:\\JAVA_LAB\\Chapter6\\newFile.txt");
		file.createNewFile();
		
		System.out.println(file.isFile());
		System.out.println(file.isDirectory());
		System.out.println(file.getName());
		System.out.println(file.getAbsolutePath());
		System.out.println(file.getPath());
		System.out.println(file.canRead());
		System.out.println(file.canWrite());
		
		file.delete();
	}
}

RandomAccessFile 클래스

  • 입출력 클래스 중 유일하게 파일에 대한 입력과 출력을 동시에 할 수 있는 클래스
  • 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능함
  • 다양한 메서드가 제공됨
public class RandomAccessFileTest {

	public static void main(String[] args) throws IOException {
		RandomAccessFile rf = new RandomAccessFile("random.txt", "rw");
		rf.writeInt(100);
		System.out.println("파일 포인터 위치:" + rf.getFilePointer());
		rf.writeDouble(3.14);
		System.out.println("파일 포인터 위치:" + rf.getFilePointer());
		rf.writeUTF("안녕하세요");
		System.out.println("파일 포인터 위치:" + rf.getFilePointer());
	
		rf.seek(0);
		System.out.println("파일 포인터 위치:" + rf.getFilePointer());
		
		int i = rf.readInt();
		double d = rf.readDouble();
		String str = rf.readUTF();
	
		System.out.println("파일 포인터 위치:" + rf.getFilePointer());
		System.out.println(i);
		System.out.println(d);
		System.out.println(str);
	}
}
profile
Journey for Backend Developer

0개의 댓글