Programming/JAVA

[JAVA] IO(Input & Output, 입출력) / 스트림(Stream)

Jayna. 2024. 1. 12. 10:35
728x90

 

  프로그램 상의 데이터를 외부매체(모니터, 스피커, 파일)로 출력하거나
  입력장치(키볻, 마우스, 마이크, 파일)로 입력받는 과정
  => IO(Input & Output, 입출력)
  
  IO를 진행하고 싶다면
  우선적으로 "반드시" 프로그램과 외부매체와의 "통로"를 만들어야 한다.
   => 스트림(Stream)
  
  스트림의 특징
  - 단방향 : 입력이면 입력, 출력이면 출력
    입력용 스트림 따로, 출력용 스트림이 따로 존재
    동시에 입출력을 하고자 한다면?
       -> 하나의 스트림으로는 불가능
       -> 입력, 출력 스트림 둘다 가지고 있어야 함
  - 선입선출(FIFO) : 먼저 전달한 값이 먼저 나오게 됨 => 큐(Queue)
    ( 순서대로 들어가서 나온다.)
   시간이 지나면 문제가 발생할 수 있다.
 

728x90


   스트림의 구분
 - 통로의 사이즈 
    바이트 스트림 : 1Byte짜리가 이동할 수 있는 좁은 통로 => 입력(XXXInputStream) / 출력(XXXOutputStream)
    문자 스트림 : 2Byte짜리가 이동할 수 있는 넓은 통로  => 입력(XXXReader) / 출력(XXXWriter)
   
  - 외부매체와의 직접적인 연결여부
   기반 스트림 : 외부 매체와 직접적으로 연결되는 통로
   보조 스트림 : 기반 스트림만으로 부족한 성능을 향상시켜주는 용도의 스트림
      => 단독 사용 불가(기반스트림을 만들고 추가해주는 용도)
      => 속도향상, 자료형에 맞춰서 변환, 객체 단위로 입출력하게 도움

 

public class FileRun {

	public static void main(String[] args) {
		
		// 파일 클래스 객체 생성
		// 1. 별도의 경로지정을 하진 않고
		// 파일명만 제시해서 생성 =>
		// 현재 이 프로젝트 폴더 내에 파일이 생성됨
		// File 객체 생성
		try {
			File file1 = new File("test.txt");
			file1.createNewFile();
			// createNewFile() : 파일을 생성해주는 메소드
			
			
			// 2. 경로지정을 한 파일명을 제시해서 만들고 싶다
			//  => 실제 존재하는 경로를 제시해야 함
			// D:\IO실습폴더 
			File file2 = new File("D:\\IO실습폴더\\test.txt");
			// file2 객체 생성
			file2.createNewFile(); // 경로에 파일 생성
				
			// 3. 폴더를 생성하고 안에 파일도 생성
			// 별도의 경로 지정 x
			File forder = new File("ccc");
			forder.mkdir();		// make directory
			// mkdir() : 폴더를 생성해주는 메소드
			
			File file3 = new File("ccc\\test.txt");
			file3.createNewFile();

			// 4. 경로지정 후 폴더 생성 후 파일생성
			File forder2 = new File("D:\\IO실습폴더\\ddd");
			forder2.mkdir();
			
			File file4 = new File("D:\\IO실습폴더\\ddd\\test.txt");
			file4.createNewFile();
			
			// File 에서 제공하는 메소드들
			System.out.println("파일이세요? : " + file4.isFile());
			// 파일이면 true / 폴더면 false를 반환
			System.out.println("파일이세요? : " + forder2.isFile());
			
			System.out.println("파일이름 : " + file4.getName());               // 파일명 추출
			System.out.println("상위폴더 : " + file4.getParent());             // 상위폴더명 추출
			System.out.println("파일용량 : " + file4.length());                // 파일크기
			System.out.println("절대경로 : " + file4.getAbsolutePath());       // 절대경로 
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}
public void fileSave() {
		
		// FileWriter : 파일로 데이터를 2byte 단위로 출력하는 스트림
		FileWriter fw = null;
		
		try {
			// 1. 객체 생성 => 파일과 연결된 통로를 만들겠다.
			fw = new FileWriter("b_char.txt");
			
			
			// 2. 파일에 쓰기 => write()
			
		     fw.write("11/19 컴백 컴백 \n");
		     fw.write('A');
		     
		     char[] arr = {'B', 'C', 'D','E', 'F', 'G'};
		     fw.write(arr);  // 오버로딩
		     
		} catch (IOException e) {
			e.printStackTrace();
		} finally {  
			// 3. 자원반납 => close() 통로를 달아준다.
			try {
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		} 
			
		}
	}
	
	public void fileRead() {
		
		// FileRead : 파일로부터 데이터를 2byte단위로 입력받는 스트림
		// 0. 객체선언
		FileReader fr = null;
		
		try {
			// 1. 객체생성
			fr = new FileReader("b_char.txt");
			
			// 2. 파일을 읽기 => read()

			// 반복문 사용
			int value = 0;
			while((value = fr.read()) != -1) {
				System.out.print((char)value);
			}
		
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
728x90