[8] 입출력 스트림과 파일 입출력

서희찬·2022년 12월 3일
0
post-thumbnail

스트림


  • 스트림 입출력

    버퍼를 가지고 순차적으로 이루어지는 입출력

  • 자바의 입출력 스트림

    응용 프로그램과 입출력 장치를 연결하는 소프퉤어 모듈

    • 입력 스트림 : 입력 장치로부터 자바 프로그램으로 데이터 전달
    • 출력 스트림 :출력 장치로 데이터 출력

자바의 입출력 스트림 특징

  • 스트림의 양끝에 입출력 장치와 자바 응용프로그램 연결
  • 스트림은 단방향
    - 입력과 출력을 동시에 하는 스트림 없음
  • 입출력 스트림기본 단위
    - 바이트 스트림 : 바이트
    • 문자 스트림 : 문자(자바 문자 1개 : 2byte)
  • 선입선출 구조

자바의 입출력 스트림 종류

  • 바이트 스트림과 문자 스트림
    바이트 스트림
    • 입출력되는 데이터를 단순 바이트로 처리
      - 예) 바이너리 파일을 읽는 입력 스트림
    문자 스트림
    • 문자만 입출력하는 스트림
    • 문자가 아닌 바이너리 데이터는 스트림에서 처리하지 못함
      - 예)텍스트파일을읽는입력스트림

JDK의 바이트 스트림 클래스 계층 구조

스트림은 연결될 수 있다!!!!

  • 표준 입력 스트림 System.in에 InputStreamReader stream을 연결한 사례

문자 스트림

  • 유니 코드(2바이트) 문자를 입출력 하는 스트림
    • 문자로 표현되지 않는 데이터는 다루지 못함
    • 이미지, 동영상과 같은 바이너리 데이터 입출력 불과
  • 문자 스트림을 다루는 클래스
    • Reader/Writer
    • InputStreamReader/OutputStreamWriter
    • FileReader/FileWriter

FileReader을 이용한 파일 읽기

  • 파일 전체를 읽어 화면에 출력하는 코드
		FileReader fin = new FileReader("txt 주소"); // 파일 열고 파일과 입력 바이트 스트림 객체 fin 연결
		int c;
		while((c = fin.read() != -1 )) // 파일의 끝까지 바이트씩 c에 읽어 들인다. 파일의 끝을 만나면 read()는 -1리턴
		{
			
			System.out.print((char)c); // 바이트 C를 문자로 변환하여 화면에 출력
		}
		fin.close(); // 스트림 닫기, 파일도 닫힘 => 스트림과 파일의 연결을 끊으로서 더이상 스트림으로부터 읽을 수 없음 

예제 8-1 : FileReader로 텍스트 파일 읽기

문자 집합과 InputStreamReader를 이용한 텍스트 파일 읽기

FileInputStream fin = new FileInputStream("c:\\Temp\\hangul.txt");
InputStreamReader in = new InputStreamReader(fin, "MS949"); // MS949 : 한글 완성형 확장형 문자 집합 

 while ((c = in.read()) != -1) { 
 System.out.print((char)c);
 } 

예제 8-2 : InputStreamReader로 한글 텍스트 파일 읽기

예제 8-3 : 한글 텍스트 파일 읽기(문자 집합 지정이 잘못 된 경우)

FileWriter 사용 예

FileWriter fout = new FileWriter("c:\\Temp\\test.txt"); // txt로의 문자 출력 스트림 생성

// 파일 쓰기
// 문자 단위 쓰기
fout.write(A); // 문자 ‘A’ 쓰기
fout.close();

// 블록 단위 쓰기
char [] buf new char[1024];


// buf[] 배열의 처음부터 배열 크기(1024개 문자)만큼 쓰기
fout.write(buf, 0, buf.length);

예제 8-4 : 키보드 입력을 파일로 저장하기

바이트 스트림 클래스

바이트 스트림

  • 바이트 단위의 바이너리 값을 읽고 쓰는 스트림

바이트 스트림 클래스

  • InputStream/OutputStream
    • 추상 클래스
    • 바이트 스트림을 다루는 모든 클래스의 슈퍼 클래스
  • FileInputStream/FileOutputStream
    • 파일로부터 바이트 단위로 읽거나 저장하는 클래스
    • 바이너리 파일의 입출력 용도
  • DataInputStream/DataOutputStream
    • 자바의 기본 데이터 타입의 값(변수)을 바이너리 값 그대로 입출력
    • 문자열도 바이너리 형태로 입출력

FileOutputStream을 이용한 파일 쓰기

예제 8-5 : FileOutputStream으로 바이너리 파일 쓰기

예제 8-6 : FileInputStream으로 바이너리 파일 읽기

버퍼 입출력 스트림과 버퍼 입출력의 특징

버퍼 스트림

  • 버퍼를 가진 스트림
  • 입출력 데이터를 일시적으로 저장하는 버퍼를 이용하여 입출력 효율 개선

버퍼 입출력의 목적

  • 입출력 시 운영체제의 API 호출 횟수를 줄여 입출력 성능 개선
    • 출력시 여러번 반복되는 데이터를 버퍼에 모아두고 한 번에 장치로 출력

버퍼 스트림의 종류

바이트 버퍼 스트림

  • 바이트 단위의 바이너리 데이터를 처리하는 버퍼 스트림
  • BufferedInputStream와 BufferedOutputStream

문자 버퍼 스트림

  • 유니코드의 문자 데이터만 처리하는 버퍼 스트림
  • BufferedReader와 BufferedWriter

20바이트 버퍼를 가진 BufferedOutputStream

예제 8-7 : 버퍼 스트림을 이용한 출력

File 클래스

  • 파일의 경로명을 다루는 클래스
  • 파일 관리기능

사용 예시

// 파일 객체 생성
	File f = new File("c:\\windows\\system.ini");

// 파일의 경로명 
	String filename = f.getName(); // "system.ini"
	String path = f.getPath(); // "c:\\windows\\system.ini" 
	String parent = f.getParent(); // "c:\\windows"

// 파일인지 디렉터리인지 구분 
	if(f.isFile()) // 파일인 경우 
		System.out.println(f.getPath() + "는 파일입니다.");
	else if(f.isDirectory()) // 디렉터리인 경우 
		System.out.println(f.getPath() + "는 디렉터리입니다.");
	
// 서브 디렉터리 리스트 얻기 
	File f = new File("c:\\Temp");
	File[] subfiles = f.listFiles(); // c:\Temp 파일 및 서브디렉터리 리스트 얻기
	for(int i=0; i<filenames.length; i++) { 
		System.out.print(subfiles[i].getName()); // 파일명 출력
		System.out.println("\t파일 크기: " + subfiles[i].length()); // 크기 출력 
		}
	}

예제 8-8 : File 클래스 활용한 파일 관리

예제 8-9 : 텍스트 파일 복사

예제 8-10 : 바이너리 파일 복사

예제 8-11 : 블록 단위로 바이너리 파일 고속 복사

profile
Developing For Our Lives, 세상에 기여하는 삶을 살고자 개발하고 있습니다

0개의 댓글