처음부터 시작하는 프로그래밍

파일 입출력 본문

Java

파일 입출력

강병준 2021. 11. 18. 23:30

 파일 입출력

 

 

IO 클래스

1) byte stream 계열: 1 byte 단위로 데이터 입출력

 

스트림에 들어오고 나가는 정보를 단순 바이너리(비트들)로 다루므로 문자, 이미지든 무엇이든 흘려보냄

즉, 입출력되는 모든 데이터를 단순 바이트로 처리


대표(슈퍼) 클래스 2가지
   - InputStream : 1 byte 단위로 데이터를 reading. 추상화 클래스
   - OutputStream : 1 byte 단위로 데이터를 writing. 추상화 클래스

 

   => 추상화 클래스이기 때문에 슈퍼 클래스로 파일 입출력 불가능

 

파일입출력을 위한 클래스

   - FileInputStream : 1 byte 단위로 파일에서 데이터를 reading
   - FileOutputStream : 1 byte 단위로 파일에 데이터를 writing

 

   => 바이너리 값을 파일에 쓰거나, 읽을 수 있음

 

Q) 일반적으로 바이너리 파일입출력을 사용하더라도 문자자체는 바로 저장을 할 수 있다. 하지만 한글을 저장하는 경우 예를들어 '가나다'를 저장하는 경우에는 바로 넣으면 데이터를 writing하지 못한다. 그렇기 때문에 한글을 바이너리 값으로 변환 후 파일에 저장하기 위해서는 반드시 string을 byte로 변환해 주어야 한다.

import java.io.FileOutputStream;
import java.io.IOException;

public class test {
	public static void main(String[] args) throws IOException {

		// 바이너리 파일에 한글 쓰기
		String str = "가나다";

		byte[] b;
		b= str.getBytes();

		try {
			FileOutputStream fos = new FileOutputStream("C:\\Users\\82108\\Desktop\\file.txt");
			
			fos.write(b);
			
			System.out.println("저장 성공");
			fos.close();
		} catch(IOException e) {
			System.out.println("저장 실패");
		}
	}
}

 

성능향상을 위한 클래스
   - BufferedInputStream : 데이터 reading의 효율을 개선하기 위한 buffer stream
   - BufferedOutputStream : 데이터 writing의 효율을 개선하기 위한 buffer stream

   => 바이너리, 일반 파일에 대해 관계없이 입출력 데이터를 일시적으로 저장하는 버퍼를 이용하여 입출력 효율 개선

   목적: 입출력 시 운영체제의 API 호출 횟수를 줄여 입출력 성능 개선

           출력시 여러 번 출력되는 데이터를 버퍼에 모아두고 한 번에 장치로 출력

           입력시 입력 데이터를 버퍼에 모아두고 한번에 프로그램에게 전달

 

Q) 만약 한글파일로 저장된 파일을 버퍼를 이용해 읽는다고 한다면 어떻게 하여야 할까?

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

public class test {
	public static void main(String[] args) throws IOException {

		FileInputStream fos = new FileInputStream("C:\\Users\\82108\\Desktop\\file.txt"); // 바이트 스트림 계열 파일 입출력 사용
		BufferedInputStream bos = new BufferedInputStream(fos); // 속도향상을 위해 버퍼를 사용

		int n = 0, c; // n: 배열의 카운트, c: 버퍼를 이용해 읽을 데이터
		int size = 100; // 최초 바이트의 크기
		byte[] b = new byte[size]; // text파일의 byte를 읽어오기 위한 byte배열 선언
		String stb;
		
		while((c = bos.read()) != -1) { // text파일이 NULL일때 까지 읽기
			b[n] = (byte)c; // text파일의 정보를 byte로 변환해 c에 저장
			n++;
			
			if(n >= size) size += 100; // byte배열의 크기보다 커지게 된다면 byte배열의 최대 크기 증가
		}
		
		String str = new String(b); // byte배열의 값을 읽기위해 string으로 변환
		System.out.println(str); // text파일의 내용을 출력
		
		bos.close(); // 사용이 종료된 파일입출력 클래스에 대해 종료
		fos.close();
	}
}

 

2) char stream 계열: char 단위로 데이터 입출력

 

문자 스트림에 대해서만 처리가 가능하기 때문에 바이너리 데이터에 대해서는 처리하지 못한다.

그렇기 때문에 보이지 않거나, 문자가 아닌 정보(엉뚱한 문자, 기호)가 입력되면, 엉뚱한 문자가 전달되는 오류 발생

 

파일입출력을 위한 클래스

   - FileReader : 문자, char 단위로 파일에 데이터 reading

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

public class test {
	public static void main(String[] args) throws IOException {

		// 파일 읽기
		FileReader fin = null;
		
		try {
			fin = new FileReader("C:\\Users\\82108\\Desktop\\file.txt");
			
			int c;
			while((c = fin.read()) != -1) {
				System.out.print((char) c);
			}
			
			fin.close();
		} catch(IOException e) {
			System.out.println("입출력 오류");
		}
	}
}

 

   - FileWriter : 문자, char 단위로 파일에 데이터 writing

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class test {
	public static void main(String[] args) throws IOException {

		// 파일 쓰기
		Scanner sc = new Scanner(System.in);
		FileWriter fout = null;
		
		try {
			fout = new FileWriter("C:\\Users\\82108\\Desktop\\file.txt");
			
			while(true) {
				String line = sc.nextLine();
				
				if(line.length() == 0) break;
				fout.write(line, 0, line.length()); // 문자열 입력받고 파일에 쓰기
				fout.write("\r\n", 0, 2); //
//				fout.write('A'); // 문자 하나씩 입력
			}
			fout.close();
		} catch (IOException e) {
			System.out.println("입출력 오류");
		}
		sc.close();

	}
}

'Java' 카테고리의 다른 글

multithread program  (0) 2021.11.30
컬렉션  (0) 2021.11.30
제네릭  (0) 2021.11.23
Exception Class  (0) 2021.11.16
패키지  (0) 2021.11.09