코딩 노트
Java.io.file - multi + object 본문
멀티 바이트 입출력
- 원시형 데이터 및 크기가 정해진 예외적인 데이터들이 멀티 바이트이다.
멀티바이트 출력
준비물: 파일 객체, 출력과 입력 스트림, 버퍼, 분해를 도와주는 보조 스트림
//준비물
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 |