처음부터 시작하는 프로그래밍
파일 입출력 본문
파일 입출력
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 |