반응형
01. 스트림의 사용
1) InputStream & OutputStream스트림의 사용
- 파일업로드, 파일다운로드
- 왜? 텍스트뿐만 아니라, 다양한 형태의 파일들도 읽어야하니
- 대용량이다? BufferedInputStream & BufferedOutputStream로 확장하기
- InputStream & OutputStream을 확장해서 쓰는 경우가 많다!!!
2) Reader & Writer스트림의 사용
- 텍스트파일 읽을 때 (html)
- 대용량이다? BufferedReader & BufferedWriter로 확장하기
02. (Data) 원하는 형태의 값들 파일에 저장하고 읽기
1) DataOutputStreamApp
package xyz.itwill.io;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
//🌈 파일에 원하는형태의 값들 저장하기
// => DataOutputStream 보조스트림으로 확장하면 1Byte 값 뿐만아니라 2Byte , 4Byte , 8Byte 다양히 저장 가능하다.
//🌀출력스트림 : FileOutputStream, DataOutputStream (확장: 원하는 자료형의 값 변형없이 저장 가능)
// => 파일에 원하는 자료형 값들 변형없이 저장하기
public class DataOutputStreamApp {
public static void main(String[] args) throws IOException {
//🔥DataOutputStream🔥
// => 원하는 자료형의 값을 원시데이터를 그대로 전달하는 것이 아닌 원하는 형태로 바꿔서 전달
// => 즉, 순수데이터가 가공되지 않고 그대로 원하는 형태로 묶여서 전달
// => 내가 int 줄테니까 묶어서 그대로 전달해줘~ (4Byte)
// => 내가 String 줄테니까 묶어서 그대로 전달해줘~ (4Byte)
// => 내가 boolean 줄테니까 묶어서 그대로 전달해줘~ (1Byte)
// => ...
//1.
//🔥DataOutputStream(보조스트림클래스): OutputStream 객체를 전달받아 원하는 자료형의 값을 원시데이타로 전달하기 위한 기능의 출력스트림을 생성하는 클래스
DataOutputStream out = new DataOutputStream(new FileOutputStream("c:/data/data.txt"));
//2.
//DataOutputStream.writeInt(int v): 정수값을 출력스트림으로 전달하는 메소드
out.writeInt(100); //100 그대로 전달해 파일에 저장
//DataOutputStream.writeBoolean(boolean b) : 논리값을 출력스트림으로 전달하는 메소드
out.writeBoolean(true); //true 그대로 전달해 파일에 저장
//DataOutputStream.writeUTF(String s) : 문자열(값)을 출력스트림으로 전달하는 메소드 - 조합형으로 전달
out.writeUTF("홍길동"); //홍길동 그대로 전달해 파일에 저장
//3.
//파일 출력스트림 제거
out.close();
//4.
System.out.println("c:\\\\data\\\\data.txt 파일에 여러 자료형의 값들을 저장 하였습니다.");
}
}
// => 실제 .txt파일을 열어보면 깨져서 보일 것임
// => 이는 DataOutputStream을 이용해 원하는 데이터의 형태로 저장했기 때문에, (1Byte, 2Byte, 4Byte ..등)
// => DataInputStream으로 읽어야 정상적인 읽기가 가능해짐.
2) DataInputStreamApp
package xyz.itwill.io;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
//🌈 원하는 형태로 저장한 값들 모두읽기
public class DataInputStreamApp {
public static void main(String[] args) throws IOException {
//🔥DataInputStream🔥
// => 주의사항) 반드시 파일에 저장된 자료형의 순서대로 값을 읽어서 사용해야함
// => 값을 순차적으로 읽지 않으면 비정상적인 결과 발생
//1.
//🔥DataInputStream (보조스트림클래스): InputStream 객체를 전달받아 원시데이타를 원하는 자료형의 값으로 읽기 위한 기능의 입력스트림을 생성하는 클래스
DataInputStream in = new DataInputStream(new FileInputStream("c:/data/data.txt"));
//2.
//DataInputStream.readInt() : 입력스트림의 원시데이터를 정수값으로 읽어와 반환하는 메소드
int vlaue1 = in.readInt();
//DataInputStream.readBoolean() : 입력스트림의 원시데이터를 논리값으로 읽어와 반환하는 메소드
boolean vlaue2 = in.readBoolean();
//DataInputStream.readUTF() : 입력스트림의 원시데이터를 문자열로 읽어와 반환하는 메소드
String vlaue3 = in.readUTF();
//3.
System.out.println("value1= "+ vlaue1);
System.out.println("value2= "+ vlaue2);
System.out.println("value3= "+ vlaue3);
//4.
//파일 입력스트림 제거
in.close();
}
}
03. (Object) 객체단위의 값들 파일에 저장하고 읽기
1) ObjectOutputStreamApp
package xyz.itwill.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.Date;
//🍯 파일에 객체단위의 값들 저장하기
// => 자바는 객체지향프로그램이다!!
// => 객체 전체를 전달하거나 저장할 수 있도록 만들어진 보조스트림이 있다.
// => 이 스트림을 이용하면 예를들어 회원정보를 읽어들이고 전달할 수 있을 것이다.
public class ObjectOutputStreamApp {
public static void main(String[] args) throws IOException {
//🔥DataOutputStream🔥
// => 객체단위로 출력가능!
//1.
//🔥ObjectOutputStream(보조스트림클래스) : OutputStream 객체를 전달받아 원하는 객체를 원시데이타로 전달하기 위한 기능의 출력스트림을 생성하는 클래스
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c:/data/object.txt"));
//2.
//ObjectOutputStream.Object(Object o) : 출력스트림으로 객체를 전달하기 위한 메소드
out.writeObject("홍길동"); //출력스트림으로 String 객체 전달
out.writeObject(new Date()); //출력스트림으로 Date 객체 전달
out.writeObject(Arrays.asList("임꺽정","전우치","일지매")); //출력스트림으로 ArrayList 객체 전달
//3.
//파일 출력스트림 제거
out.close();
//4.
System.out.println("c:\\\\data\\\\object.txt 파일에 여러개의 객체가 저장 되었습니다.");
}
}
2) ObjectInputStreamApp
package xyz.itwill.io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Date;
import java.util.List;
//🍯 객체단위로 저장한 값들 모두읽기
public class ObjectInputStreamApp {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//🔥ObjectInputStream🔥
// => 주의사항
// => 반드시 파일에 저장된 갹체자료형의 순서대로 값을 읽어서 사용해야함, 값을 순차적으로 읽지 않으면 비정상적인 결과 발생
// => read()메소드 사용할 때 반환타입이 Object라 명시적 객체 형변환 필요, 명시적 객체 형변환하지 않으면 ClassCastException발생할 수 있음
//1.
//🔥ObjectInputStream(보조스트림클래스): InputStream 객체를 전달받아 원시데이타를 원하는 형태의 객체로 읽기 위한 기능의 입력스트림을 생성하는 클래스
ObjectInputStream in = new ObjectInputStream(new FileInputStream("c:/data/object.txt"));
//2.
//ObjectInputStream.readObject() : 입력스트림의 원시데이타를 객체로 읽어 반환하는 메소드
// => Object 객체 타입으로 반환하므로, 명시적 객체 형변환 후 instanceof연산자 사용해야함 (하지만 우리는 순서를 알고 있으므로 하지않았다!)
// => readObject() 말고도 readByte, readInt .. 있지만 readObject() 가장 많이 씀!
// => String는 이미 Serializable 인터페이스를 상속받고있으므로 객체직렬화클래스다! - API에서 확인 가능
String string = (String)in.readObject();
Date date = (Date)in.readObject();
@SuppressWarnings("unchecked") // 나 검사안할거야~
List<String> list = (List<String>)in.readObject();
//3.
//클래스의 toString() 메소드가 자동 호출되어 객체에 저장된 값이 문자열로 반환되어 출력
System.out.println("string = "+ string);
System.out.println("date = "+ date);
System.out.println("list = "+ list);
//4.
//파일 입력스트림 제거
in.close();
}
}
반응형
'java > java.io' 카테고리의 다른 글
[java.io] 5. ✏️텍스트 파일 편집기 프로그램 - 메모장 (0) | 2024.07.01 |
---|---|
[java.io] 4. 객체 직렬화(Object Serialization) 클래스 (1) | 2024.07.01 |
[java.io] 2. File(파일)클래스 (0) | 2024.06.30 |
[java.io] 1. 입출력스트림(원시데이타기반 | 문자데이타기반) (0) | 2024.06.30 |