웹기반 애플리케이션

JSP📃_보충_Stream정리

비비펄 2023. 3. 6. 19:10

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();
		}
		
		
		
	}