프로그래밍/Java 공부

입출력 스트림과 파일 입출력

개발계발게발 2020. 12. 29. 22:28
반응형
  • 스트림

스트림(Stream) : 연속적인 데이터의 흐름 또는 데이터를 전송하는 소프트웨어 모듈

1. 스트림의 양끝에는 입출력 장치와 자바 응용프로그램이 연결된다

: 자바 응용프로그램은 입력 스트림과 출력 스트림과만 연결하고, 입출력 스트림이 입출력 장치를 제어하고 실질적인 입출력을 담당한다.

2. 스트림은 단방향이다.

3. 스트림을 통해 흘러가는 기본 단위는 바이트나 문자이다

: 자바의 스트림 객체 = 바이트 스트림(byte stream = 이름 + Stream)(상관 x) / 문자 스트림(character stream = 이름 + Reader/Writer)(문자만 다룸)

4. 스트림은 선입선출, 즉 FIFO 구조이다

∴ 입출력 스트림 = 입출력 장치 ~ 프로그램 사이의 일련의 데이터 흐름

  • 문자스트림

Reader/Writer를 붙여 구분

: 유니코드로 된 문자 단위의 데이터가 흐르는 스트림

문자 입력 스트림 )

- Reader ,Writer

 

- InputStreamReader : 바이트 스트림을 전달받아 문자 정보로 변환하는 스트림 객체

(∵ 바이트 파일 입력 스트림을 먼저 생성해야 함 = FileInputStream)

- FileReader : txt 파일을 찾아 열고, 파일과 스트림을 연결

문자 출력 스트림 )

- InputStreamReader

- FileWriter

  • 바이트 스트림

이름 뒤에 Stream을 붙여 구분

: 8비트 바이트 단위의 데이터가 흐르는 스트림

: 텍스트 파일, 이미지, 동영상 파일 입출력 모두 가능 (이미지나 동영상과 같은 바이너리 데이터 입출력에 더 적합)

바이트 입력 스트림)

- InputStream, FileInputStream, DataInputStream

바이트 출력 스트림)

- OutputStream, FileOutputStream, DataOutputStream

 

  • 스트림 연결

 

System.in과 InputStreamReader 스트림 객체를 연결하는 코드

 

InputStreamReader rd = new InputStreamReader(System.in);

 

int c = rd.read(); // 입력 스트림으로부터 키 입력. c는 입력된 키의 문자 값

EX) a, ? 키를 순서대로 입력하면 System.in은 a 와 ? 키를 읽고 바이트 정보를 내보낸다

 

rd는 연속적으로 들어오는 바이트들을 문자로 변호나하고 'a'. '?' 문자를 응용프로그램에게 전달한다.

 

스트림은 몇개라도 연결 가능

 

 

  • 문자 스트림과 파일 입출력

 

2바이트의 유니코드 문자를 단위로 입출력하는 스트림.

문자화되지 않는 바이너리 바이트 값들은 문자 스트림 클래스에서 처리 X

 

- 파일 입력 스트림 생성

FileReader fin = new FileReader("c:\\test.txt");

FileReader의 생성자는 c:\test.txt 파일을 찾아 열고, 파일과 스트림을 연결한다.(문자들로만 구성된 텍스트 파일)

 

 - 파일 읽기

 

int c;
while((c = fin.read()) != -1){	// 문자 하나를 c에 읽어 들인디. 파일 끝까지 반복
	System.out.print((char)c);	// 문자 c를 화면에 출력한다.
}

 

자바는 '\'를 특수문자에 사용하므로 문자열에 '\' 문자를 사용하고자 하면 '\\' 같이 백슬래시를 두번 사용

 

파일이 큰 경우 한 문자씩 읽으면 읽는 속도가 너무 느리기 때문에 

한번에 한 블록(버퍼크기) 만큼 읽는 read()를 이용하면 된다.

char [] buf = new char [1024];	// 1024는 1KB
int n = fin.read(buf);			// 한 번에 1024개 문자를 읽어 buf[]에 저장하고 실제 읽은 문자수 리턴

 

 - 스트림 닫기

fin.close();

 

 - 파일 입출력과 예외 처리

 

1. 파일의 경로명이 틀린 경우 FileNotFoundException 예외 발 생

FileReader fin = new FileReader("c:\\test.txt");	// FileNotFoundException 발생 가능

 

2. 파일 읽기, 쓰기, 닫기를 하는 동안 입출력 오류가 발생하면​ read(), write(), close() 메소드는 IOExcception 예외 발생

int c = fin.read();	// IOException 발생 가능

 

예외 처리로 파일 입출력 코드에 try-catch 블록이 필요

try{
FileReader fin = new FileReader("c:\\test.txt");
..
int c = fin.read();
..
fin.close();

} catch(FileNotFoundException e) {
 System.out.println("파일을 열 수 없음"); // 생략 가능 FileNotFoundException은 
                                          // IOException을 상속 받기때문에 아래 catch 블록으로 대체 가능

} catch(IOException e) {
 System.out.println("입출력 오류");
}

 

import java.io.*;

public class FileReaderEx {
	public static void main(String[] args) {
		FileReader fin = null;
		try {
			fin = new FileReader("c:\\windows\\system.ini");	// 문자 입력 스트림 생성
							   //Unix 스타일의 경로방식
                               //"c:/windows/system.ini" 가능
        	int c; 
			while ((c = fin.read()) != -1) { // 한 문자씩 파일 끝까지 읽는다.
				System.out.print((char)c);
			}
			fin.close();
		}
		catch (IOException e) {
			System.out.println("입출력 오류");			
		}	
	}
}

 

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

 

InputStreamReader는 스트림에 입력되는 바이트 데이터를 문자 집합을 통해 문자로 변환

InputStreamReader의 생성자에 문자 집합을 지정해야 한다.

읽어 들인 바이트들이 문자 집합에 속하지 않는 경우 해독할 수 없는 글자가 된다.

 

- InputStreamReader로 문자 입력 스트림 생성

 

FileInputStream fin = new FileInputStream("c:\\Temp\\hangul.txt");

 

InputStreamReader in = new InputStreamReader(fin, "MS949");

윈도우에서 디폴트로 사용하는 문자 집합은 MS949

import java.io.*;

public class FileReadHangulSuccess {
	public static void main(String[] args) {
		InputStreamReader in = null;
		FileInputStream fin = null;
		try {
			fin = new FileInputStream("c:\\Temp\\h.txt");
			in = new InputStreamReader(fin, "MS949");	// 올바른 문자 집합 지정
			int c;
			
			System.out.println("인코딩 문자 집합은 " + in.getEncoding());
			while((c = in.read()) != -1) {
				System.out.print((char)c);
			}
			in.close();
			fin.close();			
		} catch (IOException e) {
			System.out.println("입출력 오류");
		}

	}

}

 

틀린 문자 집합 지정시 문자 깨짐

 

 

 

#버퍼

버퍼 입출력(Buffered I/O) : 입출력 스트림 ~ 프로그램 사이에 버퍼를 두어 입출력 장치의 속도 + 프로그램의 처리 속도의 완충 작용을 수행

= 효율적으로 입출력 처리

이유 ) 버퍼를 가지고 있으면 운영체제에 대한 호출횟수를 줄이고, 하드디스크 등 하드웨어에 대한 작동 횟수를 줄이기 때문

바이트 버퍼 스트림 ) BufferedInputStream, BufferedOutputStream

문자 버퍼 스트림 ) BufferedReader, BufferedWriter

5 |

#File

File 클래스 ) 파일, 디렉터리 경로명의 추상적 표현

- 파일 삭제, 파일 이름 변경, 디렉터리 생성 등과 같은 파일 관리 작업 수행

- 파일 입출력을 위한 기능 제공 x

[출처] [명품 JAVA Programming] 제8장 입출력 스트림과 파일 입출력|작성자 varyeun

반응형

'프로그래밍 > Java 공부' 카테고리의 다른 글

연산자, 조건문(if, else if)  (0) 2021.05.20
변수, 데이터 타입, 형변환  (0) 2021.05.19
제네릭과 컬렉션  (0) 2020.12.22
모듈과 패키지 개념, 자바 기본 패키지  (0) 2020.12.13
JAVA 상속  (0) 2020.12.12