스퐁지송 개발노트

22.12.07(수) 입출력 스트림(Stream) 본문

JAVA 입문 시작

22.12.07(수) 입출력 스트림(Stream)

강준석 2022. 12. 7. 14:13
728x90

입출력 스트림 (단방향)

큐-> FIFO  (Fisrt IN First Out) 저장장치가 있을 때 들어오고 나가는 것을 저장하는 장치 

먼저들어온것들이 먼저 나가는것

제일 많이 비유하는게 프링글스 통에 밑에 구멍난 경우!

 

스택-> FILO LIFO 

프링글스 통에 넣어서 쌓게함 스택은 밑에 구멍이 안 뚫려있음. 그래서 먼저들어간게 나중에 나옴 

 

단방향 

반이중

전이중 

 

스트림 처리방법

바이트 기반 처리 (1byte 단위로 처리(2진수 형태로 되어있음) ): 영상, 음악, 그림 ,사진

InputStream, OutputStream 

InputStream: fileinputstream, 

 

문자 기반 처리 : 문자열 

~Reader, ~Writer 


package 입출력스트림;

import java.io.IOException;
import java.io.InputStream;

public class Sample01 {

	public static void main(String[] args) {

		try {
			InputStream in = System.in;
			int data = 0;

			while ((data = in.read()) != -1) {				//read 자체가 1byte씩 읽어 오지만 정수형태로 읽어오게 되고
//데이터올 데이터가 없다 알려주는 -1를 리턴 data가 -1를 리턴받고 (!=-1)식이 false가 되므로 while문 탈출 
                System.out.print((char) data);				// 그냥 출력해버리면 읽어오면 숫자로 나옴
			}
		} catch (IOException e) {
		
		}
	}
}

Sample01을 1번방식 불러오게하기 ↓

.read() 에 그냥 아무것도 없음  -1에 끝나게 됨.

package 입출력스트림;

import java.io.FileInputStream;

public class Sample02 {

   public static void main(String[] args) {
      
      try { //괄호안에 경로를 설정하면 경로에 있는 데이터를 가져와서 fis 변수에 저장됨
         FileInputStream fis = new FileInputStream("src/입출력스트림/Sample01.java");
               
            int data = 0; //종료시키게 하기 위한 변수 하나 선언
            
            while((data=fis.read()) != -1) {
//데이터올 데이터가 없다 알려주는 -1를 리턴 data가 -1를 리턴받고 (!=-1)식이 false가 되므로 while문 탈출 
               System.out.print((char)data);
            }
      } catch(Exception e) {
         
      }

   }

}

Sample01을 2번방식 불러오게하기 

.read(byte[])b: 배열 b의 크기만큼만 읽음  더 읽을 배열이 없으면 -1리턴 시키고 종료 

바이트 형식에 맞춰서 불러오게끔 read를 함 

배열 크기를 메서드로 설정함

 

package 입출력스트림;

import java.io.FileInputStream;

import com.sun.org.apache.bcel.internal.generic.NEW;

public class Sample02 {

   public static void main(String[] args) {
      
      try { //괄호안에 경로를 설정하면 경로에 있는 데이터를 가져와서 fis 변수에 저장됨
         FileInputStream fis = new FileInputStream("src/입출력스트림/Sample01.java");
               
            int data = 0; //종료시키게 하기 위한 변수 하나 선언
            
            byte[] buf = new byte[fis.available()]; 
            
            while((data=fis.read(buf)) != -1) {
 //데이터올 데이터가 없다 알려주는 -1를 리턴 data가 -1를 리턴받고 (!=-1)식이 false가 되므로 while문 탈출 
               System.out.print(new String(buf,0,data));
            }
      } catch(Exception e) {
         
      }

   }

}

 

한글이 안깨지는 결과값 도출 

 

Sample01을 3번방식 불러오게하기 ↓

.read(bytep[]b, int off, int len) : 최대 len(길이)만큼 바이트를 읽음  배열 b[off]에서 부터 저장 

 

.close()  처리할 거 다 처리하고 스트림 연결 끊어버리는 메서드 

연결 끊어버리는 .close를 이용할때는 대부분 finally 사용!! 

 

package 입출력스트림;

import java.io.FileInputStream;

import com.sun.org.apache.bcel.internal.generic.NEW;

public class Sample02 {

   public static void main(String[] args) {
	   FileInputStream fis =null;
      
	   
	   try { //괄호안에 경로를 설정하면 경로에 있는 데이터를 가져와서 fis 변수에 저장됨
         fis = new FileInputStream("src/입출력스트림/Sample01.java");
               
            int data = 0; //종료시키게 하기 위한 변수 하나 선언
            
            byte[] buf = new byte[fis.available()]; 
            
            while((data=fis.read(buf,0,buf.length)) != -1) {
//데이터올 데이터가 없다 알려주는 -1를 리턴 data가 -1를 리턴받고 (!=-1)식이 false가 되므로 while문 탈출 
               System.out.print(new String(buf,0,data));
            }
      } catch(Exception e) {
         
      } finally {
		try {
			fis.close();
		} catch (Exception e2) {
			// TODO: handle exception
		}
	}

   }

}

이 Java 코드는 ↑  FileInputStream을 사용하여 파일을 읽는 간단한 예입니다. FileInputStream은 파일에서 이진 데이터를 읽는 데 사용되며, 프로그램이 파일에서 읽는 것을 마칠 때 스트림이 제대로 닫히도록 하는 데 사용됩니다. 코드는 파일의 내용을 바이트 배열로 읽은 다음 배열을 문자열로 변환하여 콘솔에 인쇄합니다.

 


문자스트림

Reader로 가져옴

 

.read()

.read(char[] c)

.read(char[] c.int off, int len) : 문자배열,배열의방,배열의길이

2byte(한글이 2byte임) 씩 읽을 수 있음

 

 

한글을 신경쓰지않고 불러올 수 있다.

package 입출력스트림;

import java.io.FileReader;

public class Sample03 {

	public static void main(String[] args) {

		FileReader fr = null;

		try {
			fr = new FileReader("src/입출력스트림/Sample01.java");

			int data = 0;

			while ((data = fr.read()) != -1) {
				System.out.print((char) data);
			}
		} catch (Exception e) {
			   //Exception e 란 예외발생된 이유를 변수 e에 저장
		} finally {
			
			try {
				
				fr.close();
				
			} catch (Exception e) {

			}
		}

	}

}

버퍼스트림

BufferedReader

다른 스트림을 보조해준는 역할(원활하게,빠르게)

다른 스트림과 같이 사용해야함

 

package 입출력스트림;

import java.io.BufferedReader;
import java.io.FileReader;

public class Sample04 {

	public static void main(String[] args) {

		FileReader fr = null;
		BufferedReader br = null; //보조 스트림 ,속도향상등 
		
		try {
			fr = new FileReader("src./입출력스트림/Sample01.java");
			br = new BufferedReader(fr);
			//보조할 스트림을 넣음, 순서도 보조할 스트림 아래에 위치해야함
			
			String txt = null;	//버퍼스트림은 빠르게 줄단위로 읽어오기떄문
			
			while( ( txt=br.readLine() ) !=null ) {	
				//버퍼스트림은 빠르게 줄단위로 읽어오기떄문 .readLine사용
				System.out.println(txt);
			}
		} catch (Exception e) {
			
		}finally {
			try {
				br.close();	//.close();는 try/catch문 안에 사용해야함
				fr.close();	//.close();는 입력된 순서의 역순으로 끝내야함 (조립과 분해로 생각)
			}catch (Exception e) {
				
			}
		}

	}

}

바이트 출력 스트림-내보내기

OutputStream

 

???OutputStream

 

package 입출력스트림;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Sample05 {

	public static void main(String[] args) {


		FileOutputStream fos = null;
		
		try {
			fos = new FileOutputStream("test.txt");
			
			fos.write(97);
			fos.write(98);
			fos.write(99); //abc로 txt파일 출력 안의 내용을 바꿔도 새로운 txt파일이 생성되는게 아니라 기존의 내용을 덮어씌움
			
		}catch (Exception e) {
			
		}finally {
			try {
				fos.flush(); //스트림에 남은 내용을 다 내보냄
				fos.close();
			}catch (Exception e) {
				
			}
		}

	}

}

내용은 ABC이다

워크스페이스폴더 선택후 새로고침(f5) 입력시 출력된 txt파일을 볼수 있음.

 

 

실행마다 출력값 누적시키기

true만 쓰면됨

try {
			fos = new FileOutputStream("test.txt",true); //true를 입력시 아래 fos.write();값을 계속 바꿔서 실행시 마다 출력값이 누적되서 저장
			
			fos.write(97);
			fos.write(98);
			fos.write(99); //abc로출력  출력시킬내용을 바꾸면 기존의 내용을 덮어씌움
			
		}catch (Exception e) {

 

 

배열을 출력시키기

package 입출력스트림;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Sample05 {

	public static void main(String[] args) {

		FileOutputStream fos = null;

		try {
			fos = new FileOutputStream("test.txt", true); // true를 입력시 아래 fos.write();값을 계속 바꿔서 실행시 마다 출력값이 누적되서 저장

			byte[] b = new byte[26];
			byte data = 65;	//아스키 코드로 "A"
			for (int i = 0; i < 26; i++) {
				b[i] = data;
				data++;
			}
			fos.write(b,0,5);	//b배열의 0번방부터 5번방까지 출력 //ABCDE만 출력

		} catch (Exception e) {

		} finally {
			try {
				fos.flush(); // 스트림에 남은 내용을 다 내보냄
				fos.close();
			} catch (Exception e) {

			}
		}

	}

}

보조스트림사용하기

 

BufferedReader (보조스트림)사용하는법

사용이유 -> 속도향상 

 

ex) br= new BufferedReader(fr); -> 버퍼가 어떤 것을 보조할지(fr을 보조하려고 괄호 안에 fr을 넣음)

 

package 입출력스트림;

import java.io.BufferedReader;
import java.io.FileReader;
import java.nio.Buffer;

public class Sample04 {

	public static void main(String[] args) {

		FileReader fr = null;
		BufferedReader br = null;

		try {
			fr = new FileReader("src/입출력스트림/Sample01.java");
			br = new BufferedReader(fr); // 버퍼가 어떤 것을 보조할지(fr을 보조하려고 fr을 넣음)

			String txt = null;

			while ((txt = br.readLine()) != null) {
				System.out.println(txt);
			}

		} catch (Exception e) {
		
		}finally {
			try {
				br.close();
				fr.close();
			} catch (Exception e2) {
			
			}
		}
	}

}

 


문자 출력 스트림

Writer

.writer(int i);

.writer(char[] c);

.writer(char[] b,int off, int len);

.writer(String str);    //문자열도 출력가능

.writer(String str, int off, int len);

 

package 입출력스트림;

import java.io.FileWriter;

public class Sample06 {

	public static void main(String[] args) {

		FileWriter fw = null;

		try {
			fw = new FileWriter("test2.txt");

			fw.write('A'); // 문자 하나 입력서 작은 따움표 ''

			char[] buf = { 'B', 'C', 'D' };
			fw.write(buf); // buf 배열 출력

			fw.write(buf, 1, 2); // buf배열의 1번방부터 2개출력

			String str = "가나다라";
			fw.write(str); //문자열 출력

			fw.write(str, 2, 2); //문자열에 2번방부터 2개출력
		} catch (Exception e) {

		} finally {
			try {
				fw.flush();
				fw.close();
			} catch (Exception e) {

			}
		}

	}

}

속도비교

 

package 속도비교;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Sample01 {

	public static void main(String[] args) throws Exception {

		FileInputStream fis = null;
		FileOutputStream fos = null;
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;

		int data = 0;
		long start = 0; //시작시간
		long end = 0;	//끝나는시간
		
		fis= new FileInputStream("src/속도비교/cat.gif");	//cat.gif 를 java로 넣기
		fos = new FileOutputStream("src/cat.gif");		//cat.gif 를 src로 내보내기
		
		start = System.currentTimeMillis();	//시작시간
		
		while((data=fis.read())!=-1) {	//.read fis의 파일을 불러온다, data는 fis
			fos.write(data);	//fos로 data를 보내기
		}
		
		fos.flush();
		
		end=System.currentTimeMillis();
		
		fos.close();
		fis.close();
		
		System.out.println("버퍼 사용 X : "+ (end-start));	
		
		
		
		fis = new FileInputStream("src/속도비교/cat.gif");
		bis = new BufferedInputStream(fis);
		fos = new FileOutputStream("cat.gif");
		bos = new BufferedOutputStream(fos);
		
		start = System.currentTimeMillis();
		
		while((data=bis.read())!=-1) {
			bos.write(data);
		}
		
		bos.flush();
		
		end = System.currentTimeMillis();
		
		fos.close();
		fis.close();
		
		System.out.println("버퍼 사용 o : "+ (end-start));	
		
		
		
		
		
	}

}

버퍼 사용 X : 493
버퍼 사용 o : 4

728x90
Comments