튜터링 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에서 읽지 못했습니다. 경로명을 체크해보세요");
}
}
}
바이너리 파일을 읽고 텍스트 파일로 변환하는 예제이다.
위 파일 경로들은 실제로 절대 경로를 이용했지만 개인정보이므로 파일 이름으로 변경하였다.
'JAVA' 카테고리의 다른 글
[JAVA] 마지막 튜터링 (2021- 08-11 , 2021-08-13) (0) | 2021.08.19 |
---|---|
[JAVA] 튜터링 10일차! (2021-08-04) (0) | 2021.08.06 |
[JAVA] 튜터링 9일차!(2021-08-02) (0) | 2021.08.03 |
[JAVA] 튜터링 8일차!!(2021-07-30) (0) | 2021.08.03 |
[JAVA] 공부 7일차! (2021-07-28) (0) | 2021.07.29 |