코딩 노트

Java.io.file - multi + object 본문

Java

Java.io.file - multi + object

newbyeol 2023. 7. 17. 18:09

멀티 바이트 입출력

- 원시형 데이터 및 크기가 정해진 예외적인 데이터들이 멀티 바이트이다.

 

멀티바이트 출력

준비물: 파일 객체, 출력과 입력 스트림, 버퍼, 분해를 도와주는 보조 스트림

//준비물

File target = new File("sample/multi.kh");

 

FileOutputStream stream = new FileOutputStream(target); //메인스트림

 

BufferedOutputStream buffer = new BufferedOutputStream(stream); //보조스트림1

 

DataOutputStream data = new DataOutputStream(buffer); // 보조스트림2 / 분해를 도와줌

 

구조 : [프로그램] → data(분해) buffer(임시저장) stream(통로) target(파일) [실제파일]

 

//data에게 각종 원시형 데이터 전달

data.writeInt(100); //4byte

data.writeDouble(100); //8byte

data.writeChar(100); //2byte

data.writeFloat(100); //4byte

data.writeLong(100); //8byte

- 자료형에 따라서 분해방식이 달라진다. 명령이 자료형별로 존재한다.

 

· 정리(+버퍼 비우기 - flush)

- 왜 close()를 적지 않으면 저장이 안 될까?

- 가득차지 않았기 때문에 전송이 안 되는 것, 버퍼는 가득 차야지만 전송을 시켜준다.

 

· 앞으로도 전송할 것이 있을 때 사용한다. (네트워크 통신에서 많이 사용)

data.flush();

· 앞으로는 전송할 일이 없을 때 사용한다. (파일에서 많이 사용한다)

data.close();

 

멀티바이트 입력

//준비물

File target = new File("sample/multi.kh");

FileInputStream stream = new FileInputStream(target);

BufferedInputStream buffer = new BufferedInputStream(stream);

DataInputStream data = new DataInputStream(buffer);

 

구조 : [프로그램] ← data(조립) ← buffer(임시저장) ← stream(통로) ← target(파일) ← [실제파일]

 

 

int a = data.readInt();

double b = data.readDouble();

char c = data.readChar();

float d = data.readFloat();

long e = data.readLong();

 

//정리

data.close();

여러가지 데이터 타입이라면 순서가 맞아야 데이터가 깨지지 않고 제대로 넘어온다.

그냥 막 읽고 싶다면 같은 종류의 데이터만 저장시켜야 한다.

 

객체 입출력

Date d = new Date();

 

//준비물

File target = new File("sample/object.kh");

 

FileOutputStream stream = new FileOutputStream(target);

BufferedOutputStream buffer = new BufferedOutputStream(stream);

// DataOutputStream data = new DataOutputStream(buffer); //분해만

ObjectOutputStream obj = new ObjectOutputStream(buffer); //직렬화+분해

 

obj.writeObject(d);

 

//정리

obj.close();

 

(Q) 객체를 사용한 로또 예제

- 객체는 아무거나 저장이 가능하다.

- 내가 만든 객체도 저장이 가능하고 랜덤 객체도 가능하지만 Scanner은 안 된다.

Random r = new Random();

Set<Integer> lotto = new TreeSet<>();

while(lotto.size() < 6) {

lotto.add(r.nextInt(45) + 1);

}

 

//출력

File target = new File("sample/lotto.kh");

 

FileOutputStream stream = new FileOutputStream(target);

BufferedOutputStream buffer = new BufferedOutputStream(stream);

ObjectOutputStream obj = new ObjectOutputStream(buffer);

 

obj.writeObject(lotto);

 

obj.close();

 

객체 입력

//준비물

File target = new File("sample/object.kh");

 

FileInputStream stream = new FileInputStream(target);

BufferedInputStream buffer = new BufferedInputStream(stream);

ObjectInputStream obj = new ObjectInputStream(buffer);

위 세 줄을 축소한 코드, 배우는 입장에서는 비추천

ObjectInputStream obj = new ObjectInputStream(

new BufferedInputStream(new FileInputStream(target)));

애초에 ObjectOutputStream은 아무거나(Object) 저장하도록 되어 있다.

따라서 저장된 객체를 불러오면 당연히 Object 형태로 보관 중이다.

주의사항은 다운캐스팅을 해야한다는 것이다.

Date d = (Date)obj.readObject();

System.out.println("d = " + d);

 

// 정리

obj.close();

(Q) 위에서 만든 로또 번호를 확인하는 코드

File target = new File("sample/lotto.kh");

 

FileInputStream stream = new FileInputStream(target);

BufferedInputStream buffer = new BufferedInputStream(stream);

ObjectInputStream obj = new ObjectInputStream(buffer);

 

Set<Integer> lotto = (Set<Integer>) obj.readObject();

 

obj.close();

 

for(int number : lotto) {

System.out.println(number);

}

 

내가 만든 객체로 입출력

- 클래스를 만들 때 파일로도 저장할 계획이라면 마킹(marking)을 해야한다.

- java.io.Seriazable 인터페이스를 상속받으면 해결된다.

Student st = new Student("테스트", 50);

//출력

File target = new File("sample/student.kh");

 

FileOutputStream stream = new FileOutputStream(target);

BufferedOutputStream buffer = new BufferedOutputStream(stream);

ObjectOutputStream obj = new ObjectOutputStream(buffer);

 

obj.writeObject(st);

 

obj.close();

위에서 저장한 Student 객체를 입력하여 정보 출력

// Test05에서 저장한 Student 객체를 입력하여 정보 출력

File target = new File("sample/student.kh");

 

FileInputStream stream = new FileInputStream(target);

BufferedInputStream buffer = new BufferedInputStream(stream);

ObjectInputStream obj = new ObjectInputStream(buffer);

 

Student st = (Student) obj.readObject();

 

obj.close();

 

System.out.println("name = " + st.getName());

System.out.println("score = " + st.getScore());

 

'Java' 카테고리의 다른 글

java.file.string  (0) 2023.07.18
object 마지막 게임 캐릭터 정보 예제  (0) 2023.07.17
Java.io.file - single  (0) 2023.07.14
Java.util.collection - Stack, Queue  (0) 2023.07.14
Java.util.collection - Map  (0) 2023.07.14