1. 입출력(I/O) - File 클래스를 활용한 예제
예제1) 실행 파일(.exe) 복사하기
예제2) 지정된 파일을 지정된 크기로 잘라서 여러 개의 파일로 저장하기
2. 바이트기반 스트림
- 바이트 배열을 다루는 메모리 스트림
- 메모리에 스트림을 만드면 읽기, 쓰기 성능이 빨라진다
1) InputStream과 OutputStream
- 모든 바이트기반의 스트림의 조상
[InputStream 메서드]
[OutputStream 메서드]
2) ByteArrayInputStream과 ByteArrayOutputStream
- 메모리, 즉 바이트배열에 데이터를 입출력 하는데 사용되는 스트림
- 주로 다른 곳에 입출력하기 전에 데이터를 임시로 바이트배열에 담아서 변환 등의 작업에 사용
예제)
3) FileInputStream과 FileOutputStream
- 파일을 읽고 쓰는 바이트 스트림
- 실행파일, 이미지, 동영상 파일, 텍스트 파일 등 (+ 네트워크 = 전송, ex) 카톡)
[FileInputStream과 FileOutputStream 생성자]
3. 바이트기반 보조스트림
1) FilterInputStream과 FilterOutputStream
- 모든 보조스트림의 조상
2) BufferedInputStream과 BufferedOutputStream
- 바이트 스트림의 입출력 효율을 높이기 위해서 사용하는 보조스트림
[BufferedInputStream 생성자]
[BufferedOutputStream 생성자와 메서드]
3) DataInputStream과 DataOutputStream
- 데이터를 읽고 쓰는데 byte 단위가 아닌 [기본형]으로 읽고 쓸 수 있는 장점을 가진 바이트 보조 스트림
[DataInputStream 생성자와 메서드]
[DataOutputStream 생성자와 메서드]
[FileOutputStream과 DateOutputStream 활용 예제]
FileOutputStream과 DateOutputStream 사용하기 전)
public class Ex04 {
public static void main(String[] args) {
String name = "꼬여사";
int kor = 98, eng = 78, mat = 88;
int tot = kor + eng + mat;
double avg = (double)tot / 3;
boolean gender = false;
// 텍스트 파일 읽기/쓰기 -> 바이트 스트림말고 문자 스트림 사용하면 됌
// FileReader(읽기), [FileWriter(쓰기(출력))]
// 위의 한 학생의 성적 정보를 파일로 저장
String fileName =".\\src\\days28\\student.txt";
try(FileWriter fw = new FileWriter(fileName, true); // boolean append 매개변수에 값을 주면 파일에 새로운 데이터를 추가 OR 새로운 파일 생성
BufferedWriter bw = new BufferedWriter(fw); ) { // 보조스트림 8196 byte 버퍼(기본값)
/*
fw.write(name + "\r\n"); // 스트림에 쓰는 작업
fw.write(kor + "\r\n");
fw.write(eng + "\r\n");
fw.write(mat + "\r\n");
fw.write(avg + "" + "\r\n");
fw.write(gender + "" + "\r\n");
*/
String data = String.format("%s, %d, %d, %d, %d, %.2f, %b\n", name, kor, eng, mat, tot, avg, gender);
// fw.write(data);
// fw.flush(); // 스트림에 있는 데이터를 저장
bw.write(data);
bw.flush();
} catch (Exception e) {
e.printStackTrace();
} // try
System.out.println("END");
} // main
} // class
FileOutputStream과 DateOutputStream 사용)
[FileInputStream과 DateInputStream 활용 예제]
FileInputStream과 DataInputStream 사용 전)
FileInputStream과 DataInputStream 사용)
4) SequenceInputStream
- Sequence(순차적) + InputStream(읽기용도의 바이트 스트림) : 순차적으로 바이트 스트림을 읽기 위한 것
- 여러 개의 입력 스트림을 연속적으로 연결해서 하나의 스트림으로 처리하고자 할 때 사용한다.
( 분리된 파일을 하나로 합칠 때 사용 - SequenceInputStream sis = new SequenceInputStream(en); )
[SequenceInputStream 생성자와 메서드]
[개념 설명 예제]
public class Ex05 {
public static void main(String[] args) {
// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf
// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.1
// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.2
// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.3
// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.4
// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.5 .. 11번까지
try {
FileInputStream fis1 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.1");
/*
int b;
while ((b = fis1.read()) != -1) {
// 읽어와서 출력 또는 파일로 저장 작업 코딩...
}
*/
FileInputStream fis2 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.2");
/*
while ((b = fis2.read()) != -1) {
// 읽어와서 출력 또는 파일로 저장 작업 코딩...
}
*/
FileInputStream fis3 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.3");
/*
while ((b = fis3.read()) != -1) {
// 읽어와서 출력 또는 파일로 저장 작업 코딩...
}
*/
FileInputStream fis4 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.4");
FileInputStream fis5 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.5");
FileInputStream fis6 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.6");
FileInputStream fis7 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.7");
FileInputStream fis8 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.8");
FileInputStream fis9 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.9");
FileInputStream fis10 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.10");
FileInputStream fis11 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.11");
// 순서가 있는 List 인터페이스를 구현한 컬랙션 클래스 사용 + 동기화처리유무 판단
// ArrayList
Vector<FileInputStream> vt = new Vector<FileInputStream>();
vt.addElement(fis1);
vt.addElement(fis2);
vt.addElement(fis3);
vt.addElement(fis4);
vt.addElement(fis5);
vt.addElement(fis6);
vt.addElement(fis7);
vt.addElement(fis8);
vt.addElement(fis9);
vt.addElement(fis10);
vt.addElement(fis11);
Enumeration<FileInputStream> en = vt.elements();
// [분리된 파일을 합치는 코딩을 할 때 SequenceInputStream 사용하면 편리!]
// SequenceInputStream sis = new SequenceInputStream(Enumeration <? extends InputStream> e);
SequenceInputStream sis = new SequenceInputStream(en);
int b;
while((b = sis.read()) != -1) {
// 읽어와서 출력 또는 파일로 저장하는 코딩...
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} // main
} // class
[SequenceInputStream 활용 예제]
- 연속적인 바이트 배열을 SequenceInputStream 사용하여 처리
- SequenceInputStream 사용하려고하니 InputStream 타입의 Enumeration(열거형)을 달라고 함
- 그래서 바이트 배열을 ByteArrayInputStream으로 바꾸고 Vector(또는 ArrayList) 컬렉션 클래스를 생성해 add() 메서드로 추가
- elements() 메서드로 요소를 가져와 Enumeration 생성하여 SequenceInputStream의 매개변수로 할당
5) PrintStream 바이트 스트림
- print(), println(), printf() 메서드가 오버로딩 되어져 있다.
- JDK 1.1에서부터 PrintStream보다 향상된 스트림 : PrintWriter
향상된 기능은? 다양한 언어로 출력이 가능하다.
[PrintStream 생성자와 메서드]
[날짜와 시간에 사용되는 옵션]
[PrintStream 활용 예제]
4. 문자기반 스트림
1) Reader와 Writer
- 문자 기반 스트림의 부모(최상위)
- char 배열을 다루는 스트림
[Reader 메서드]
[Writer 메서드]
2) FileReader와 FileWriter
- 파일로부터 텍스트 데이터를 읽고, 쓰는데 사용
- 사용방법은 FileInputStream/FileOutputStream과 다르지 않음
3) PipedReader와 PipedWriter
- 프로세스 간의 데이터 전송 -> 쓰레드 배워야 테스트 가능해서 이정도만 알고 넘어가기
4) StringReader와 StringWriter 메모리 스트림
- 문자열을 다루는 메모리 스트림
- StringBuffer getBuffer() : StirngWriter에 출력한 데이터가 저장된 StringBuffer를 반환
- String toString() : StirngWriter에 출력된(StringBuffer 저장된) 문자열을 반환
[StringReader 활용 예제]
String source = "package days28;\r\n"
+ "\r\n"
+ "import java.io.File;\r\n"
+ "import java.io.FileInputStream;\r\n"
+ "import java.io.FileOutputStream;\r\n"
+ "import java.io.PrintStream;\r\n"
+ "\r\n"
+ "/**\r\n"
+ " * @author Yelin\r\n"
+ " * @date 2022. 3. 29. - 오전 9:03:19\r\n"
+ " * @subject 실행파일 복사하기(교재에는 없음)\r\n"
+ " * @content 실행파일은 문자 스트림으로 읽으면 안됨X 2바이트씩 읽으면 데이터를 못가져옴\r\n"
+ " * int read(), 읽을게 없으면 -1 반환\r\n"
+ " * \r\n"
+ " * \r\n"
+ " */\r\n"
+ "public class Ex01 {\r\n"
+ " \r\n"
+ " public static void main(String[] args) {\r\n"
+ " String pathname = \"C:\\\\Program Files (x86)\\\\CBT\\\\CBT.exe\";\r\n"
+ " String copyPathname = \"C:\\\\Users\\\\Yelin Park\\\\Documents\\\\CBT.exe\";\r\n"
+ " \r\n"
+ " fileCopy_byteStream(pathname, copyPathname);\r\n"
+ "\r\n"
+ " } // main\r\n"
+ "\r\n"
+ " private static void fileCopy_byteStream(String pathname, String copyPathname) {\r\n"
+ " long start = System.nanoTime();\r\n"
+ " \r\n"
+ " File f1 = new File(pathname);\r\n"
+ " PrintStream ps = System.out; // 화면에 출력하는 스트림 객체, 바이트 스트림\r\n"
+ " try(FileInputStream fis = new FileInputStream(f1);\r\n"
+ " FileOutputStream fos = new FileOutputStream(copyPathname); ) {\r\n"
+ " int b;\r\n"
+ " while( (b = fis.read()) != -1) {\r\n"
+ " // ps.write(b);\r\n"
+ " // ps.print(b); // 한바이트씩 출력\r\n"
+ " fos.write(b); // 파일로 복사\r\n"
+ " }\r\n"
+ " } catch (Exception e) {\r\n"
+ " e.printStackTrace();\r\n"
+ " }\r\n"
+ " \r\n"
+ " long end = System.nanoTime();\r\n"
+ " System.out.println(\"> 처리 시간 : \" + (end-start) + \"ns - 파일(\" + f1.length() + \"bytes) 복사 완료!!\");\r\n"
+ " \r\n"
+ " } // fileCopy_byteStream\r\n"
+ "\r\n"
+ "} // class";
[문제1] source 문자열의 11번째 라인의 문자열 출력
[문제2] source 문자열의 11번째 라인의 5번째 문자 출력
5. 문자기반 보조스트림
1) BufferedReader와 BufferedWriter
- 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할
- 데이터를 라인단위( readLine() )로 읽을 수 있고, 줄바꿈( newLine() ) 해주는 메서드를 가지고 있음
2) InputStreamReader와 OutputStreamWriter
- 바이트스트림 + 문자스트림을 연결해주는 역할의 문자스트림 -> 즉, 바이트스트림을 문자스트림으로 변환해준다.
- 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업 수행
- 키보드로부터 입력 시 System 클래스 필요 -> in : 입력 / out : 출력 스트림
입력 : System.in / 출력 : System.out
[InputStreamReader 생성자와 메서드]
[OutputStreamReader 생성자와 메서드]
- 인코딩 관련 내용
[InputStreamReader 활용 예제] 한글 한 글자를 받아서 출력하기 / 문자열 출력하기
InputStreamReader 사용 전) 한글이 아닌 한 문자 출력가능
다른 방식 풀이) 한글 한 문자를 받아서 출력
InputStreamReader 사용1) 한글 한 문자를 받아서 출력
- 'a' 엔터 -> System.in으로 바이트스트림 반환 -> InputStreamReader으로 문자열 스트림 반환 -> ['a'][][][] BufferedReader 보조스트림이 라인 단위로 가져옴
InputStreamReader 사용2) 문자열 읽는 방법 포함
6. 표준 입출력
1) System.in / System.out / System.err
- 표준 입력장치(키보드) -> 표준 입력 == System.in == InputStream
- 표준 출력장치(모니터, 프린터기) -> 표준 출력 == System.out == PrintStream
(1) System.in - 콘솔로부터 데이터를 입력받는데 사용
(2) System.out - 콘솔로부터 데이터를 출력하는데 사용
(3) System.err - 콘솔로부터 데이터를 출력하는데 사용
코드 예시)
2) RandomAccessFile
- 파일을 다루는 스트림
- 파일의 어느 위치에나 읽기/쓰기 작업 가능한 스트림
- 읽기 + 쓰기 가능
[RandomAccessFile 생성자와 메서드]
[RandomAccessFile 활용 예제1]
[RandomAccessFile 활용 예제2]
<위치 확인>
'TIL > Java' 카테고리의 다른 글
[Java] StringUtils 클래스 (0) | 2022.10.04 |
---|---|
[SIST] Java_days29 (0) | 2022.03.31 |
[SIST] Java_days27 (0) | 2022.03.28 |
[SIST] Java_days26 (0) | 2022.03.25 |
[SIST] Java_days25 (0) | 2022.03.24 |