본문 바로가기

JAVA/명품 자바 프로그래밍

자바 기초 문법 정리- 8장 입출력 스트림과 파일 입출력

728x90

#명품 자바 프로그래밍 8장 입출력 스트림과 파일 입출력

#모든 코드와 사진은 <명품 자바 프로그래밍>

 

 

1. 스트림 : 연속적인 데이터의 흐름 or 데이터를 전송하는 소프트웨어 모듈 

2. 입출력 스트림 : 입출력 장치와 응용 프로그램을 연결하는 소프트웨어 모듈

 -> 자바 응용 프로그램은 입출력 장치를 직접 제어하는 대신, 입출력 스트림 객체와 연결하여 쉽게 데이터 입출력을 실행함.   

3. 입출력 스트림의 특징

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

  2) 스트림은 단방향이다. (입출력을 동시에 하는 스트림은 없다)

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

  4) 스트림은 선입선출 구조이다. 

 


4. 자바의 입출력 스트림 종류 

  1) 바이트 스트림- 문자이든 이미지 바이트든 상관없이 흘려보냄 

  2) 문자 스트림- 문자가 아니면 엉뚱한 문자가 전달됨!(이미지와 같은 바이너리 정보 처리x)

 

5. 스트림 연결- 몇개의 스트림이든 연결 가능

InputStreamReader rd = new InputStreamReader(System.in);
int c = rd.read();  //사용자가 입력한 문자를 읽을 수 있음

- rd는 문자 스트림

- System.in은 표준 입력 스트림(바이트 입력 스트림)

 


6. 파일 읽기

import java.io.*;

public class FileReaderEx{
	public static void main(String[] args){
    	FileReader fin = null;  //파일 입력 스트림 생성
        try{   //파일이 업거나, 입출력 오류가 날 수 있으므로 예외처리 구문 사용
        	fin = new FileReader("C:\\wwindows\\system.ini");  //입력 스트림을 파일과 연결
            int c;
            while((C=fin.read()) != -1){    //문자 하나를 리턴하다가 파일의 끝(떌) 를 만나면 -1리턴
            	System.out.print((char)c);
            }
            fin.close();    //파일 입출력 스트림 닫기
        }catch(IOException e){
        	System.out.print("입출력 오류);
        }
     }
}

1) 파일 주요 명령어

FileReader(File file) 파일 입력 스트림 생성
int read() 한 개의 문자를 읽어 정수형으로 리턴
void.close() 입력 스트림을 닫고 관련된 시스템 자원 해제

 

2) 파일에서의 예외

FileNoutFoundException 파일의 경로명이 틀린 경우
IOException read()., write(), close() -> 입출력 오류 

★ read()는 한 바이트나 한 문자를 리턴하는데 왜 int형으로 선언했을까?

 : read()는 파일의 끝을 만나면 -1을 리턴하는데 파일에 -1이 있을 경우 구분이 어렵다. 이때, int형으로 받을 경우 이 문제를 해결할 수 있다. 자세한 내용은 p.453

 


7. InputStreamReader() : 스트림에 입력되는 바이트 데이터를 문자 정보로 변환하는 스트림 객체. 

import java.io.*;

//main
InputStreamReader in = null;
FileInputStream fin = null;
try{
 fin = new FileInputStream("C://Temp//hangul.txt"); //텍스트 파일을 읽기 위해 바이트 파일 입력 스트림 생성
 in = new InputStreamReader(fin, "MS949");  //바이트 스트림을 전달받아 문자 정보로 변환하는 스트림 객체
 int c;
 System.out.println("인코딩 문자 집합은 " + in.Encoding());
 while((c=in.read()!=-1){
  System.out.print((char)c);
  }
 in.close();
 fin.close();
 }catch(IOException e){
  System.out.println("입출력 오류");
}
FileInputStream  텍스트 파일을 읽기 위해 바이트 파일 입력 스트림 생성
InputStreamReader 바이트 스트림을 전달 받아 문자 정보로 변환하는 스트림 객체

 


8. FileWriter : 텍스트를 파일에 저장

import java.io.*;
import java.util.*;

//main
Scanner s = new Scanner(System.in);
FileWriter fout = null;  //파일에 텍스트를 쓰는 출력 스트림 생성
int c;
try{
 fout = new FileWriter("D:\\new\\test.txt");
 whilt(true){
  String line = s.nextLine();
  if(line.length() == 0) break;
  fout.write(line, 0, line.length());  //읽은 문자열을 파일에 저장
  fout.wirte("\r\n", 0, 2);
 }
 fout.close();
}cathch(IOException e){
 System.out.printlne("입출력 오류");
}
s.close();
}
FileWriter 파일에 텍스트를 쓰는 출력 스트림 생성
fout.write() 문자 단위로 파일에 저장
char [] buf = new char[1024];
fout.write(buf, 0, buf.length)
buf[] 배열의 처음부터 배열 크기(1024)만큼 쓰기

 


9. 바이트 스트림 클래스 

 - 바이트 스트림 : 바이트 단위로 바이너리 데이터가 흐르는 스트림

 -> 바이너리 데이터를 있는 그대로 입출력하기 때문에 이미지나 동영상 파일 입출력, 텍스트 파일 입출력 가능

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

 

 


10. 버퍼 입출력 스트림

 1) 버퍼 스트림 

   - 버퍼를 가진 스트림 

   - 입출력 데이터를 일시적으로 저장하는 버퍼를 이용하여 입출력 효율 개선

   - 입출력시 운영체제의 API의 호출 횟수를 줄여 입출력 효율을 개선함. 

 

 2) 버퍼 스트림 종류

   - 바이트 버퍼 스트림 : 바이트 단위의 바이너리 데이터를 처리하는 버퍼 스트림 

 

 3) flush() : 버퍼에 남아 있는 데이터 출력

BufferedInputStream  
BufferedOutputStream  

 

   - 문자 버퍼 스트림 : 유티코드의 문자 데이터만 처리하는 버퍼 스트림

BufferedReader  
BufferedWriter  

 


11. File 클래스

 1) 기능

  - 파일의 경로명을 다루는 클래스

  - 파일 관리 기능 : 파일 이름 변경, 삭제, 디렉터리 생성, 크기 등 파일 관리

  - 파일 객체는 파일 읽고 쓰기 기능 없음

length() 파일이나 디렉토리의 크기
getName() 파일명
getPath() 완전 경로명
getParent() 부모 디렉토리
isFile() 경로명이 파일인가 true/false
isDirectory() 경로명이 디렉터리인가 true/false
listFiles() 디렉터리에 있는 파일 리스트 얻기