Stream(스트림) : 입출력 장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스
모든 스트림은 단방향이며 각각의 장치마다 연결할 수 있는 스트림 존재
하나의 스트림으로 입출력을 동시에 수행할 수 없으므로 동시에 수행하려면 2개의 스트림 필요

 *스트림의 특징
  - 단방향 :출력이면 출력용 스트림/ 입력이면 입력용 스트림 
  - 선입선출 (FIFO): 먼저들어간 데이터가 먼저 나가게됨   => 시간 지연(delay) 발생될 수 있음

*스트림의 구분                                                                                   
 > 통로의 사이즈  (1byte / 2byte)                                                          
  -바이트 스트림: 1byte짜리 데이터만 왔다갔다 할수있는 좁은 통로(입력 InputStream/ 출력 OutputStream)         
  -문자 스트림: 2byte짜리 데이터도 왔다갔다 할 수있는 넓은 통로 (입력 Reader / 출력 Writer)                                                       
  >외부매체와 직접 연결하는 유무 
  -기반(기본)스트림: 외부매체와 직접적으로 연결되는 통로(필수)
  -보조 스트림: 보조역할만을 하는 통로 (속도 향상 도움, 그외에 유용한 기능 제공 )
            보조스트림 단독으로 사용 불가, 기반스트림 반드시 있어야함 
   

**바이트 기반 스트림"가지고 데이터 입출력 
 -바이트 스트림 : 데이터를 1byte단위로 전송하는 좁은 통로 
 -기반 스트림 : 외부매체와 직접적으로 연결되는 통로 (필수)

- xxxInputStream : xxx매체로부터 데이터를 입력받을 수 있는 통로 
- xxxOutputStream : xxx매체(외부매체)로 데이터를 출력시킬 수 있는 통로 


   1️⃣ FileSave( 프로그램 ---> 외부매체(파일) 출력시
FileOutputStream : 파일과 직접적으로 연결해서 1바이트 단위로 출력시킬 수 있는 스트림 
1. 스트림 생성(통로 만들기)
2. 스트림으로 데이터를 출력 (write)
3. 다 사용한 후 스트림 반납 

public void fileSave() {
		
		FileOutputStream fout = null;
		try {
			//1. FileOutPutStream 객체 생성(해당 파일과의 연결통로 만들어짐)
			/*
			 * true 미작성시 => 해당 파일이 존재할 경우 기존의 데이터 덮어 씌워짐 (기본값이 false)
			 * true 작성시 => 해당 파일이 존재할 경우 기존의 데이터에 이어서 작성됨 
			 */
			fout = new FileOutputStream("a_byte.txt"/*,true*/); 
			//매개변수 생성자(연결하고자하는 파일경로) -> 해당파일이 없으면 새로 만들어 준 후 통로연결 있으면 그냥 통로연결
		
			//2. 스트림으로 데이터 출력(메소드 활용)
			//   숫자(0~127), 문자(영문자 특수문자)
			fout.write(97); // 'a' 문자가 저장
			fout.write('b'); // 'b' 문자가 저장
			//fout.write('하'); // 한글 2byte데이터로 깨져서 저장 
			
			byte[] arr = {99,100,101};
			fout.write(arr); // 'c','d','e'문자가 저장 
			fout.write(arr,1,2); //arr배열의 1번 인덱스로 부터 2개 출력  -> 'd','e'문자가 저장 
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
            //3. 스트림 반납하기 (반드시 실행되어야함)
		} finally { // finally에 작성된 코드는 어떤 예외가 발생하던간에 마지막에 무조건 실행되고 빠져나감 
			try {
				fout.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

2️⃣ fileRead (프로그램 <--- 외부매체 (파일) 입력)
FileInPutStream: 파일로부터 데이터를 1byte단위로 입력받는 스트림
1. 스트림 생성(통로 만들기)
2. 스트림으로 데이터를 출력 (read)
3. 다 사용한 후 스트림 반납 

public void fileRead() {
		
		// FileInPutStream: 파일로부터 데이터를 1byte단위로 입력받는 스트림
		
		FileInputStream fin = null;
		
		// 1. FileInputStream 객체생성 -> 해달 파일과 연결통로 만들어짐
		try {
			fin = new FileInputStream("a_byte.txt");
		// 2. 스트림으로 데이터 입력받기 
			// read 메소드
			//실제로 파일에 얼마만큼의 데이터가 있는지 모를경우 => 반복문 활용 
			/* 오류 
 			while(fin.read() != -1) { //읽어들인 값이 -1이 아닐 경우에만 반복수행 
				System.out.println(fin.read()); //다시금 읽어들인 값을 출력 
			}
			*/ 
			
			//read()호출은 반복문 수행시 매번 한번씩 실행되도록 
			// 해결방법1. 무한반복
			/*
			while(true) {
				int value = fin.read();
				if(value == -1) { //파일의 끝을 만나는 순간 
					break;
				}
				System.out.println(value);
			}
			*/
			// 해결방법2. 
			int value = 0 ;
			while((value = fin.read()) != -1) {
				System.out.print((char)value);
			}
		} catch (FileNotFoundException e) { //파일이 존재하지 않으면 예외발생 
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fin.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

 

복사했습니다!