JAVA

[JAVA] 튜터링 11일차!(2021-08-09)

HJ39 2021. 8. 11. 00:37

튜터링 11일 차에는 파일 입출력에 대해서 공부하게 되었다.

학교에서 배울 때는 거의 뒷부분에 해당하는 부분이라 시험에 급급해 자세하게 알려주지 않았던 부분이고 나중에 많이 쓰일지 모른다는 생각에 평소보다 더 집중해서 공부했었던 것 같다.

스트림

바이트 스트림

문자 스트림

버퍼 스트림

File 클래스

예제

 

 


 

 

  • 스트림

컴퓨터와 사용자 사이에서 입출력을 도와주는 부분이다

입력장치 → 입력 스트림 → 프로그램 → 출력 스트림 → 출력 장치 순으로 입출력이 이루어진다

선입선출 구조를 이룬다

 

바이트 스트림 , 문자 스트림으로 구성되어 있다

바이트 스트림 : 바이트, 파일 입력 시 바이너리 파일을 읽을 수 있다.

문자 스트림 : 문자(자바에서 문자 1개 : 2바이트)만 읽을 수 있다 , 파일 입력 시 텍스트 파일을 읽을 수 있다.

 

  • 바이트 스트림

입력 : InputStream , FileInputStream , FilterInputStream , etc..

출력 : OutputStream , FileOutputStream , FilterOutputStream , etc...

바이트 스트림의 공통적인 특징은 뒷부분이 Stream으로 끝난다는 특징이 있다

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamEx {
	public static void main(String[] args) {
		byte b[] = new byte [6]; // 비어 있는 byte 배열
		
		try {
			FileInputStream fin = new FileInputStream("파일 경로");
			
			int n=0, c;
			
			while((c = fin.read())!= -1) {
				b[n] = (byte)c; 
				n++;
			}			
			System.out.println("(파일 경로) 에서 읽은 배열을 출력합니다.");
			for(int i=0; i<b.length; i++) System.out.print(b[i] + " ");
			System.out.println();
			
			fin.close();			
		} catch(IOException e) {
			System.out.println( "(파일 경로) 에서 읽지 못했습니다. 경로명을 체크해보세요");
		}
	}
}

 

위 코드는 바이너리 파일을 읽어 들여 콘솔 창에 출력하는 코드 예제이다.

 

  • 문자 스트림

입력 : Reader , InputStreamReader , BufferedReader ,  etc...

출력 : Wrtier , OutputStreamWriter , BufferedWriter , etc...

문자 스트림의 특징으로는 뒷부분이 Reader/Writer로 끝난다.

문자 스트림에서  이미지 , 동영상과 같은 바이너리 파일을 읽을 시 입출력을 할 수 없다.

 

import java.io.FileReader;
import java.io.IOException;

public class FileReadEx {
	public static void main(String[] args) {
		FileReader fin = null;
		
		try {
		fin = new FileReader("파일 경로");
		
		int c;
		while((c= fin.read()) != -1) {
			System.out.print((char)c);
		}
		
		fin.close();		
		}catch(IOException e) {
			System.out.println("오류발생");
		}			
	}
}

위 코드는 텍스트 파일을 읽고 콘솔 창에 출력하는 예제이다

 

  • 버퍼 스트림

버퍼를 가진 스트림

스트림을 통해 입력된 데이터를 일시적으로 버퍼에 저장하여 입출력 효율을 개선한다.

입출력 시 운영체제의 API 호출 횟수를 줄여 입출력 성능을 개선한다.

Scanner를 통해 입출력을 하는 것보다 Buffer를 통해 입출력을 하면 약 6배 정도 속도가 더 빠르다.

 

  • 바이트 버퍼 스트림

바이트 스트림과 같이 바이너리 파일을 입출력할 때 사용한다.

BufferedInputStream , BufferedOutputStream

  • 문자 버퍼 스트림

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

문자 스트림과 같이 텍스트 파일만 입출력할 때  사용한다.

BufferedReader , BufferedWriter 

 

import java.io.BufferedOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class BufferedIOEx {
	public static void main(String[] args) {
		FileReader fin = null;
		int c;
		try {
			fin = new FileReader("파일 경로");
			BufferedOutputStream out = new BufferedOutputStream(System.out, 5);
			
			while ((c = fin.read()) != -1) {
				out.write(c);
				
			}
			//123456789101112
			// 파일 데이터가 모두 출력된 상태
			new Scanner(System.in).nextLine();
			out.flush(); // 버퍼에 남아 있던 문자 모두 출력
			
			fin.close();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

위 코드는 문자 버퍼를 통해 읽어서 콘솔 창에 출력하는 코드이다.

 

 


 

 

  • File 클래스

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

File을 효율적으로 다룰 수 있다

파일 이름을 변경 , 삭제 , 디렉터리 생성 , 크기 등 파일 관리할 수 있다

import java.io.File;

File src = new File("파일 경로");

 

 


 

 

  • 예제

문제 : 파일을 바이너리 형식으로 입력받아 텍스트 문서로 출력하시오

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Binary_Change_Text {
	public static void main(String[] args) {

		File src = new File("before.bmp");
		File dest = new File("after.txt");

		try {
			FileInputStream fi = new FileInputStream(src);
//			FileReader fi = new FileReader(src);
			FileWriter fo = new FileWriter(dest);

			byte[] buf = new byte[10]; // 10KB 버퍼

			while (true) {
				int n = fi.read(buf); // 버퍼 크기만큼 읽기. n은 실제 읽은 바이트
				
				for(int i=0;i<n;i++) {
					fo.write(buf[i]);
				}
				
				if (n < buf.length)
					break;
			}

			System.out.println("before.bmp 변환 성공.");
			System.out.println();
			fi.close();
			fo.close();
		} catch (IOException e) {
			System.out.println("before.bmp에서 읽지 못했습니다. 경로명을 체크해보세요");
		}

	}

}

바이너리 파일을 읽고 텍스트 파일로 변환하는 예제이다.

위 파일 경로들은 실제로 절대 경로를 이용했지만 개인정보이므로 파일 이름으로 변경하였다.

맨 위로