20일차 보조스트림과 입출력!

FileInputStream

파일로부터 바이트 단위로 읽어 들일 때 사용
그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일을 읽을 수 있음
InputStream 하위 클래스

FileOutputStream

파일에 바이트 단위로 데이터를 저장할 때 사용
그림, 오디오, 비디오, 텍스트 등 모든 종류의 데이터를 파일로 저장
OutputStream 하위 클래스

FileReader

텍스트 파일로부터 데이터를 읽어 들일 때 사용
Reader 하위 클래스

FileWriter

텍스트 파일에 문자 데이터를 저장할 때 사용
Writer 하위 클래스

보조 스트림

다른 스트림과 연결 되어 여러 가지 편리한 기능을 제공해주는 스트림
보조 스트림 체인: 다른 보조 스트림과 연결되어 역할 수행

-문자 변환 보조 스트림

소스 스트림이 바이트 기반 스트림이지만 데이터가 문자일 경우 사용

문자셋의 종류를 지정할 수 있기 때문에 다양한 문자 입출력 가능

-------------------------------------------입력 문자변환 보조스트림 ------------------------------
	public static void main(String[] args) throws Exception {
		InputStream is = System.in;
		
		Reader reader = new InputStreamReader(is); // 보조스트림으로 연결 보조스트림은 자식중 하나다
		
		int readCharNo;
		
		char[] cbuf = new char[100]; // 보조스트림 연결해서 byte로 안해도 된다.
		
		System.out.println("prompt >>>");
		while ((readCharNo = reader.read(cbuf)) != -1 ) {
			
			String data = new String(cbuf, 0 ,readCharNo);
			
			System.out.println(data);
		} // while

		
	}//main
	
-------------------------------------------출력 문자변환 보조스트림---------------------------------
	public static void main(String[] args) throws Exception {

		FileOutputStream fos = new FileOutputStream("C:/Temp/file.txt");
		
		// 바이트기반의 OutputStream => 문자기반의  Writer로 변환해주는 보조스트림 
		Writer writer = new OutputStreamWriter(fos);
//		Writer writer = new OutputStreamWriter(fos, "UTF-8");
//		Writer writer = new OutputStreamWriter(fos, Charset s);  <<이 부분


		// Charset 타입의 객체를 얻는 방법 :
		Charset charset1 = Charset.defaultCharset();  // MS949 (windows)
		Charset charset2 = Charset.forName("UTF-8");  // UTF-8
		Charset charset3 = StandardCharsets.UTF_8;  // UTF-8
		
		
		
		
		String data = "바이트 출력 스트림을 문자 출력 스트림으로 변환 ";
		
		writer.write(data);
		
		writer.flush();
		
		writer.close();
		
		System.out.println("파일 저장이 끝났습니다.");	
	} //main

-성능 향상 보조 스트림

(1)입출력 성능에 영향을 미치는 입출력 소스

입출력 소스와 직접 작업하지 않고 버퍼(buffer)와 작업
버퍼라는 것은 속도차가 큰 두 대상이 입출력을 수행할 때 효율성을 위해 사용하는 임시 저장공간

>설명:

버퍼는 CPU 내부에 있는 캐시메모리 보다는 느리지만 보조 기억 장치보다 훨씬 빠른 주기억 장치(RAM)를 이용합니다. 보조기억장치는 주기억장치의 버퍼로 마련해둔 공간에 데이터를 열심히 보내 쌓아 둡니다. CPU는 처리가 빠르므로 밀려있는 다른일을 처리한 후 시간이 남을때 가끔 버퍼를 확인하여 데이터가 모두 쌓였는지 확인하고 모두 쌓였다면 가져다 한꺼번에 처리합니다.

(2)BufferedInputStream, BufferedReader

(버퍼사용 전과 후 227배 정도 차이났다.)

(3)BufferedOutputStream과 BufferedWriter

-기본 타입 입출력 보조 스트림

-프린터 보조 스트림

-print f 사용법

-PrintStream


조별과제가 있었다.


public class FileOutputStreamExample3 {

	// 파일 복사 예제
	public static void main(String[] args) throws Exception {
		
		while (true) {
	         
	         // 1. 폴더 만들기
	         // 날짜로 폴더이름
	         Date now = new Date();
	         String format = "yyyy-MM-dd HH.mm";
	         DateFormat df = new SimpleDateFormat(format);
	         String fileName = df.format(now);

	         // 폴더 새로 생성
	         File dir = new File("C:/Temp/" + fileName);
	         if (dir.exists() == false) {
	            dir.mkdirs();
	         }
	         
	        
	         Calendar now2 = Calendar.getInstance();
	         int second = now2.get(Calendar.SECOND);
	         if(dir.exists() == true && (second == 1 || second == 31)) {
	            // 2. 파일 복사
	            // 파일 이름 랜덤으로 바꿔줌.
	            UUID uuid = UUID.randomUUID();
	            
	            String sourceFileName = "C:/Temp/source.pdf";
	            String targetFileName = "C:/Temp/" + fileName + "/" + uuid + ".pdf";
	            
	            FileInputStream fis = new FileInputStream(sourceFileName);
	            FileOutputStream fos = new FileOutputStream(targetFileName);
	            
	            int readByteNo;
	            
	            byte[] readBytes = new byte[40];
	            
	            while ((readByteNo = fis.read(readBytes)) != -1) {
	               fos.write(readBytes, 0, readByteNo);         
	            } // while
	            
	            fos.flush();
	            fos.close();
	            fis.close();
	   
	         } //if
	         
	      } // while
		
	}//main 
    ```
    
    쓰레드를 사용한 방법도 있었지만 내 기준에서는 아직 우리는 쓰레드 진도를 나가지 않았기에 이것이 괜찮다고 생각했다. 
    이렇게 의견을 서로 주고받으면서도 내가 정리가 안되고 막던지는 의견 속에 받아들여지는 것도 있고 아닌 것도 있지만 대체로 걸러진다ㅋ..ㅋ
    나는 내 의견 들으려조차 않는 모습이 보여도 물론 시간이 없으니까.. 
    but 나 여기서 포기하지 않아 더 공부해서 내가 옳다는 것을 예쁘게 정리해서 보여주겠어 
    그래도 우리조 다들 너무 열심히하고 좋다! 나도 더 열심히하고 더 열심히 해서 축구발전에 이바지할 수 있는 컨텐츠를 만들거야 프로그래밍은 도구! 
    도구를 가장 잘사용해서 목적을 이룬다.
   

좋은 웹페이지 즐겨찾기