Stream
::일련의 연속성을 가진 순차적 데이터의 흐름. 데이터 전송을 위한 단방향 통로.
* 스트림의 종류
1. 전송 데이터 크기에 따른 분류
1) byte stream(1byte) : InputStream/OutputStream
ex) FileIn(Out)putStream, ByteArrayIn(Out)putStream, SocketIn(Out)putStream
2) char stream(2byte) : Reader/Writer
ex) FileReader(Writer), OracleClobReader(Writer), PrintWriter
2. 스트림 생성 방법과 필터링 여부에 따른 분류
1) 1차 스트림 : 매체를 대상으로 직접 생성 및 개방할 수 있는 스트림.
ex) FileIn(Out)putStream, FileReader(Writer)
2) 2차(연결형) 스트림 : 기본생성자가 없는 대신 또다른 스트림을 받아서 생성/1차 스트림을 대상으로 연결형으로 생성되는 스트림.
buffered : BufferedReader(Writer), BufferedIn(Out)pustream
filtered : DataIn(Out)putStream
직렬화/역직렬화 : (Serialization/Deserialization) : ObjectIn(Out)putStream
-Serializable 객체의 상태를 전송이나 저장을 위해 바이트 배열의 형태로 바꾸는 작업을 직렬화라고한다. (ObjectOutputStream)
- 매체 저장되어있거나 전송된 바이트 배열로부터 Serializable 객체의 상태를 복원하는 작업을 역직렬화라고한다.(ObjectInputStream)
** 스트림을 통해 데이터를 읽는 단계
1. 매체를 핸들링할 수 있는 형태의 객체로 생성. ex) new File("d:/contents/cat1.jpg");
2. 읽기위한, 혹은 쓰기위한 단방향 1차 스트림 객체 생성, 매체를 대상으로 생성. ex) new FileinputStream(File);
2-1. 필요시, 1차 스트림을 대상으로 2차 스트림 연결형으로 생성.
3. EOF(End Of File), EOS(End Of Stream) (-1, null이 될때까지) 반복적인 읽기
**매우중요*4. 반복종료 후, 2차에서 1차 순으로 stream 종료(close단계)
* 채널은 양방향
private static void case1_fileSystemResource() {
String realPath = "D:/00.medias/another day.txt";
//1.매체를 핸들링할 수 있는 형태의 객체로 생성.
File readfile = new File(realPath);
File writefile = new File("D:/00.medias/another day_bak.txt");
try(
//2.읽기위한, 혹은 쓰기위한 단방향 1차 스트림 객체 생성, 매체를 대상으로 생성.
FileReader reader = new FileReader(readfile);
FileWriter writer = new FileWriter(writefile);
//2-1.필요시, 1차 스트림을 대상으로 2차 스트림 연결형으로 생성.
BufferedReader br = new BufferedReader(reader);
BufferedWriter bw = new BufferedWriter(writer);
) {
String tmp = null;
while((tmp = br.readLine())!=null) {
System.out.println(tmp);
bw.write(tmp+"\n");
};
} catch (IOException e) {
e.printStackTrace();
}
}
private static void case2_classPathResource() {
String qualifiedName= "/kr/or/ddit/io/HypeBoy_utf8.txt";
String realPath = StreamDesc.class.getResource(qualifiedName).getPath();
//1.매체를 핸들링할 수 있는 형태의 객체로 생성.
File readfile = new File(realPath);
File writefile = new File("D:/00.medias/HypeBoy_utf8_bak.txt");
try(
//2.읽기위한, 혹은 쓰기위한 단방향 1차 스트림 객체 생성, 매체를 대상으로 생성.
FileReader reader = new FileReader(readfile);
FileWriter writer = new FileWriter(writefile);
//2-1.필요시, 1차 스트림을 대상으로 2차 스트림 연결형으로 생성.
BufferedReader br = new BufferedReader(reader);
BufferedWriter bw = new BufferedWriter(writer);
) {
String tmp = null;
while((tmp = br.readLine())!=null) {
System.out.println(tmp);
bw.write(tmp+"\n");
};
} catch (IOException e) {
e.printStackTrace();
}
}
private static void case3_clssPathResource() {
String qualifiedName= "/kr/or/ddit/io/HypeBoy.txt";
String realPath = StreamDesc.class.getResource(qualifiedName).getPath();
//1.매체를 핸들링할 수 있는 형태의 객체로 생성.
File readfile = new File(realPath);
File writefile = new File("D:/00.medias/HypeBoy_bak.txt");
try(
//2.읽기위한, 혹은 쓰기위한 단방향 1차 스트림 객체 생성, 매체를 대상으로 생성.
FileInputStream fis = new FileInputStream(readfile);
FileWriter writer = new FileWriter(writefile);
//2-1.필요시, 1차 스트림을 대상으로 2차 스트림 연결형으로 생성.(isr==젠더(연결용))
InputStreamReader isr = new InputStreamReader(fis, Charset.forName("ms949"));
BufferedReader br = new BufferedReader(isr);
BufferedWriter bw = new BufferedWriter(writer);
) {
String tmp = null;
while((tmp = br.readLine())!=null) {
System.out.println(tmp);
bw.write(tmp+"\n");
};
} catch (IOException e) {
e.printStackTrace();
}
}
public class StreamDesc{
public static void main(String[] args) {
String qualifiedName= "/kr/or/ddit/io/HypeBoy.txt";
URI readURI;
try {
readURI = StreamDesc.class.getResource(qualifiedName).toURI();
Path readPath= Paths.get(readURI);
// File writefile = new File("D:/00.medias/HypeBoy_bak.txt");
// Path writePath = writefile.toPath();
Path writePath = Paths.get("D:/00.medias/HypeBoy_ba2k.txt");
Files.copy(readPath, writePath);
} catch (URISyntaxException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
'웹기반 애플리케이션' 카테고리의 다른 글
JSP📃_HttpServletResponse (0) | 2023.03.08 |
---|---|
웹기반 애플리케이션JSP 9일차 📃_직렬화·역직렬화·마샬링·언마샬링 (0) | 2023.03.06 |
JSP 8일차 📃_RequestLine_RequestHeader_RequestBody (0) | 2023.03.02 |
JSP 7일차 📃_자원의 종류와 식별방법 (0) | 2023.02.27 |
JSP 6일차 📃_JSP?, JSP소스구성요소, JSP컨테이너의 역할, Servlet컨테이너의 역할 (0) | 2023.02.24 |