-
28. IO입출력개발자 수업/Java 2021. 10. 20. 17:56
1. 자바의 입출력을 위한 I/O 스트림
1) 입출력 스트림
- 네트워크에서 자료의 흐름이 물의 흐름과 같다는 비유에서 유래됨
- 자바는 다양한 입출력 장치에 독립적으로 일관성있는 입출력을 입출력 스트림을 통해 제공
- 입출력이 구현되는 곳 : 파일 디스크, 키보드, 마우스, 네트워크, 메모리 등 모든 자료가 입력되고 출력되는 곳
2) 입출력 스트림 구분
- 대상 기준 : 입력 스트림 / 출력 스트림
- 자료의 종류 : 바이트 스트림 / 문자 스트림
- 기능 : 기반 스트림 / 보조 스트림
2. 입력 스트림과 출력 스트림
1) 입력스트림 : 대상으로부터 자료를 읽어들이는 스트림
2) 출력스트림 : 대상으로 자료를 출력하는 스트림
3) 스트림 종류
- 입력스트림 : FileInputStream, FileReader, BufferedInputStream, BufferedReader ...
- 출력스트림 : FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter ...
3. 바이트 스트림과 문자 스트림
1) 바이트 단위 스트림 : 동영상, 음악 파일, 실행 파일 등의 자료를 읽고 쓸 때 사용
2) 문자 단위 스트림 : 바이트 단위로 자료를 처리하면 문자는 깨짐. 인코딩에 맞게 2바이트 이상으로 처리하도록 구현된 스트림
3) 스트림 종류
- 바이트 단위 스트림 : FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream ...
- 문자 단위 스트림 : FileReader, FileWriter, BufferedReader, BufferedWriter ...
4. 기반 스트림과 보조 스트림
1) 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
2) 보조 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림
3) 보조 스트림은 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개변수로 포함함
4) 스트림 종류
- 기반 스트림 : FileInputStream, FileOutputStream, FileReader, FileWriter ...
- 보조 스트림 : InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream ...
5. 표준 입출력 스트림
1) System 클래스의 표준 입출력 멤버
- System.out : 표준 출력 스트림 (모니터)
- System.in : 표준 입력 스트림 (키보드)
- System.err : 표준 에러 출력 스트림 (모니터)
6. 바이트 단위 입출력 스트림
1) InputStream
- 바이트 단위 입력 스트림 최상위 추상 클래스
- 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
- 주요 하위 스트림
- FileInputStream : 파일에서 바이트 단위로 자료를 읽어들임
- ByteArrayInputStream : byte배열 메모리에서 바이트 단위로 자료를 읽어들임
- FilterInputStream : 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스
- 주요 메서드
- int read() : 입력 스트림으로부터 한 바이트의 자료를 읽음. 읽은 자료의 바이트 수를 반환함import java.io.IOException; public class SystemInTest { public static void main(String[] args) { System.out.print("알파벳 하나를 쓰고 [Enter]를 누르세요 : "); int i; try { i = System.in.read(); System.out.println(i); System.out.println((char)i); } catch (IOException e) { e.printStackTrace(); } } }
import java.io.IOException; import java.io.InputStreamReader; public class SystemInTest2 { public static void main(String[] args) { System.out.print("문자 하나를 쓰고 [Enter]를 누르세요 : "); int i; try { InputStreamReader isr = new InputStreamReader(System.in); while((i = isr.read()) != '\n') { System.out.print((char)i); } } catch (IOException e) { e.printStackTrace(); } } }
/* test.txt 파일 만들기 */ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; public class InputStreamReadTest { public static void main(String[] args) throws IOException { // 다형성 적용 InputStream iStream = new FileInputStream("C:\\workspace-java\\Chap23(IO입출력)\\src\\test.txt"); int readByte; // 읽은 바이트 수를 리턴받는 변수 while(true) { readByte = iStream.read(); if(readByte == -1) // read()는 더이상 읽을 게 없다면 -1을 리턴함 break; System.out.println("읽은 데이터 (1바이트) : " + readByte); // 아스키 코드 값 System.out.println("읽은 문자 : " + (char)readByte); // 문자로 출력 System.out.println(); } System.out.println(Charset.defaultCharset()); // UTF-8에서는 한글 한 글자를 3바이트로 읽어들임 iStream.close(); } }
- int read(byte[] b) : 입력 스트림으로부터 b[] 크기의 자료를 b[]에 읽어들임. 읽은 자료의 바이트 수를 반환함
/* test2.txt 만들기 */ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class InputStreamReadTest2 { public static void main(String[] args) throws IOException { // 다형성 적용 InputStream iStream = new FileInputStream("C:\\workspace-java\\Chap23(IO입출력)\\src\\test2.txt"); int readByte; // 읽은 바이트 수를 리턴받는 변수 byte[] bytes = new byte[3]; while((readByte = iStream.read(bytes)) != -1) { System.out.println("읽은 데이터 수 : " + readByte); String str = new String(bytes); System.out.println("읽은 문자열 : " + str.toString()); } iStream.close(); } }
- int read(byte[] b, int off, int len) : 입력 스트림으로부터 b[] 크기의 자료를 b[]의 off변수 위치부터 저장하며 len만큼 읽어들임. 읽은 자료의 바이트 수를 반환함/* test3.txt 만들기 */ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class InputStreamReadTest3 { public static void main(String[] args) throws IOException { InputStream iStream = new FileInputStream("C:\\workspace-java\\Chap23(IO입출력)\\src\\test3.txt"); int count; byte[] readBytes = new byte[10]; count = iStream.read(readBytes, 2, 5); // 시작인덱스 2, 5개만 읽어들임 System.out.println("읽은 바이트 수 : " + count); for(byte b : readBytes) { System.out.println("읽은 바이트 : " + (char)b); } iStream.close(); } }
- void close() : 입력 스트림과 연결된 대상 리소스를 닫음. InputStream을 더이상 사용하지 않는 경우 호출(자원의 효율적 사용)import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamTest { public static void main(String[] args) { int i; try(FileInputStream fis = new FileInputStream("input.txt")){ while((i = fis.read()) != -1) { System.out.print((char)i); } } catch (IOException e) { System.out.println(e.getMessage()); // e.printStackTrace(); } // System.out.println("end"); } }
import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamTest2 { public static void main(String[] args) { int i; try(FileInputStream fis = new FileInputStream("input.txt")){ byte[] bs = new byte[10]; while((i = fis.read(bs)) != -1) { for(int ch : bs) { System.out.print((char)ch); } System.out.println(" : " + i + "바이트 읽음"); } } catch (IOException e) { System.out.println(e.getMessage()); // e.printStackTrace(); } // System.out.println("end"); } }
import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamTest3 { public static void main(String[] args) { int i; try(FileInputStream fis = new FileInputStream("input.txt")){ byte[] bs = new byte[10]; while((i = fis.read(bs, 1, 9)) != -1) { for(int j=0; j<i; j++) { System.out.print((char)bs[j]); } System.out.println(" : " + i + "바이트 읽음"); } } catch (IOException e) { System.out.println(e.getMessage()); // e.printStackTrace(); } // System.out.println("end"); } }
2) OutputStream
- 바이트 단위 출력 스트림 최상위 추상 클래스
- 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
- 주요 하위 스트림
- FileOutputStream : 파일에서 바이트 단위로 자료를 씀
- ByteArrayOutputStream : byte배열 메모리에서 바이트 단위로 자료를 씀
- FileOutputStream : 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스
- 주요 메서드
- void write(int b) : 한 바이트를 출력함
- void write(byte[] b) : b[] 크기의 자료를 출력함
- void write(byte[] b, int off, int len) : b[] 배열에 있는 자료의 off 위치부터 len 개수만큼 자료를 출력함
- void flush() : 출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력함
- void close() : 출력 스트림과 연결된 대상 리소스를 닫음. 출력 버퍼도 비워짐import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; public class OutputStreamTest01 { public static void main(String[] args) throws IOException { OutputStream oStream = new FileOutputStream("write.txt"); byte[] data = "ABC".getBytes(); System.out.println(Arrays.toString(data)); // 아스키코드가 출력됨 // 한 글자씩 보내기 때문에 3번 루핑함 for(int i=0; i<data.length; i++) { oStream.write(data[i]); } oStream.flush(); oStream.close(); } }
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class OutputStreamTest02 { public static void main(String[] args) throws IOException { OutputStream oStream = new FileOutputStream("write2.txt"); byte[] data = "ABC가나다".getBytes(); System.out.println("data 바이트 배열의 크기 : " + data.length); oStream.write(data); // 바이트 배열을 한 번에 스트림에 보냄 System.out.println("저장이 완료되었습니다."); oStream.flush(); InputStream iStream = new FileInputStream("write2.txt"); int count = 0; byte[] readBytes = new byte[3]; // UTF-8 한글 한 글자가 3바이트이므로 바이트배열을 3바이트로 생성 int i = 0; while((count = iStream.read(readBytes)) != -1) { i++; String str = new String(readBytes); System.out.println("읽은 값 : " + str); System.out.println("읽은 바이트 수 : " + count); } System.out.println("루핑 수 : " + i); iStream.close(); oStream.close(); } }
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class OutputStreamTest03 { public static void main(String[] args) throws IOException { OutputStream oStream = new FileOutputStream("write3.txt"); byte[] data = "ABC스프링이란".getBytes(); System.out.println("data 바이트 배열의 크기 : " + data.length); // 시작 인덱스 3이고, 15개의 길이만큼 파일로 보내시오 oStream.write(data, 3, 15); oStream.flush(); System.out.println("파일이 저장되었습니다."); oStream.close(); } }
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileCopyTest { public static void main(String[] args) throws IOException { FileInputStream fInputStream = new FileInputStream("write3.txt"); FileOutputStream fOutputStream = new FileOutputStream("write4_복사본.txt"); byte[] readBytes = new byte[1000]; int data = 0; while((data = fInputStream.read(readBytes)) != -1) { fOutputStream.write(readBytes); System.out.println("읽은 바이트 수 : " + data); } fOutputStream.flush(); System.out.println("C드라이브에 \"write4_복사본.txt 파일이 생성되었습니다."); fOutputStream.close(); fInputStream.close(); } }
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /* * flush()와 close() 메서드 * - 출력 버퍼를 비울 때 flush() 메서드를 사용 * - close() 메서드를 내부에서 flush()가 호출되므로 close() 메서드가 호출이 되면 출력 버퍼가 비워짐 */ public class FileOutputStreamTest { public static void main(String[] args) throws FileNotFoundException { FileOutputStream fos = new FileOutputStream("output.txt", true); // true로 하면 뒤에 덧붙여짐 try(fos){ byte[] bs = new byte[26]; byte data = 65; for(int i=0; i<bs.length; i++) { bs[i] = data++; } fos.write(bs); // fos.write(bs, 2, 10); 하면 CDEFGHIJKL } catch(IOException e) { System.out.println(e); } System.out.println("end"); } }
7. 문자 단위 입출력 스트림
1) Reader
- 문자 단위 입력 스트림 최상위 추상 클래스
- 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
- 주요 하위 클래스
- FileReader : 파일에 문자 단위로 읽는 스트림 클래스임
- InputStreamReader : 바이트 단위로 읽은 자료를 문자로 변환해주는 보조 스트림 클래스임
- BufferedReader : 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공하는 보조 스트림임
- 주요 메서드
- int read() : 입력 스트림으로부터 한 문자를 읽음. 읽은 문자를 반환함
- int read(char[] buf) : 입력 스트림으로부터 buf 배열에 문자를 저장하고 실제로 읽은 문자 수를 리턴함
- int read(char[] buf, int off, int len) : 입력 스트림으로부터 buf 배열의 off 위치부터 len 개수만큼 문자를 읽음
- close() : 입력 스트림과 연결된 대상 리소스를 닫음import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class ReaderTest01 { public static void main(String[] args) throws IOException { Reader reader = new FileReader("test4.txt"); int readData; while((readData = reader.read()) != -1) { System.out.println("읽은 문자 : " + (char)readData); System.out.println("읽은 문자 : " + readData); } reader.close(); } }
import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class ReaderTest2 { public static void main(String[] args) throws IOException { Reader reader = new FileReader("test4.txt"); int readData; char[] cArr = new char[2]; StringBuilder sBuilder = new StringBuilder(); while((readData = reader.read(cArr)) != -1) { sBuilder.append(cArr); System.out.println("읽은 문자 : " + readData); } // 문자열 출력 System.out.println(sBuilder); reader.close(); } }
import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class ReaderTest3 { public static void main(String[] args) throws IOException { Reader reader = new FileReader("test4.txt"); int readData; char[] cArr = new char[10]; readData = reader.read(cArr, 0, 10); System.out.println("읽은 문자 수 : " + readData); // 문자열 출력 for(int i=0; i<cArr.length; i++) { System.out.println(i + "번째 문자 : " + cArr[i]); } reader.close(); } }
2) writer
- 문자 단위 출력 스트림 최상위 추상 클래스
- 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
- 주요 하위 스트림
- FileWriter : 파일에서 문자 단위로 출력하는 스트림 클래스임
- OutputStreamWriter : 바이트 단위의 자료를 문자로 변환해 출력해주는 보조 스트림 클래스임
- BufferedWriter : 문자로 쓸 때 배열을 제공하여 한꺼번에 쓸 수 있는 기능을 제공하는 보조 스트림
- 주요 메서드
- void write(int c) : 출력 스트림으로 한 문자를 내보냄
- void write(char[] buf) : 문자 배열 buf의 내용을 내보냄
- void write(char[] buf, int off, int len) : 문자 배열 buf의 off 위치부터 len 개수의 문자를 내보냄
- void write(String Str) : 문자열 str을 출력함
- void write(String str, int off, int len) : 문자열 str의 off 위치부터 len 개수의 문자를 내보냄
- void flush() : 출력 버퍼에 있는 잔류하는 모든 문자열을 내보냄
- void close() : 스트림과 연결된 리소스를 닫음. 출력 버퍼도 비워짐import java.io.FileReader; import java.io.IOException; public class FileReaderTest { public static void main(String[] args) { try(FileReader fr = new FileReader("reader.txt")) { int i; while((i = fr.read()) != -1) { System.out.print((char)i); } } catch(IOException e) { } } }
import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Arrays; public class WriterTest01 { public static void main(String[] args) throws IOException { char[] str = "이순신".toCharArray(); System.out.println(Arrays.toString(str)); Writer writer = new FileWriter("test5.txt"); for(int i=0; i<str.length; i++) { writer.write(str[i]); System.out.println("루핑 수 : " + i); } writer.flush(); System.out.println("파일이 생성되었습니다."); writer.close(); } }
import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class WriterTest02 { public static void main(String[] args) throws IOException { Writer writer = new FileWriter("test6.txt"); char[] str = "신사임당".toCharArray(); writer.write(str); writer.flush(); System.out.println("파일이 생성되었습니다."); writer.close(); } }
import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class WriterTest03 { public static void main(String[] args) throws IOException { Writer writer = new FileWriter("test7.txt"); char[] str = "신사임당이다".toCharArray(); writer.write(str, 1, 4); writer.flush(); System.out.println("파일이 생성되었습니다."); writer.close(); } }
import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class WriterTest04 { public static void main(String[] args) throws IOException { Writer writer = new FileWriter("test8.txt"); String str = "안녕하세요. 여기는 신논현역입니다. 다음 역은 선정릉역입니다."; writer.write(str, 2, 10); writer.flush(); System.out.println("파일이 저장되었습니다."); writer.close(); } }
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; public class FileCopyReaderWriter { public static void main(String[] args) throws IOException { Reader reader = new FileReader("C:\\Temp\\FileCopyTest.java"); Writer writer = new FileWriter("C:\\Temp\\FileCopyTest_복사본.java"); String str = ""; int readBytes; char[] cArr = new char[1000]; int i = 0; while((readBytes = reader.read(cArr)) != -1) { i++; String str1 = new String(cArr); str += str1; System.out.println("루핑 수 : " + i); System.out.println("읽은 바이트 수 : " + readBytes); } writer.write(str); writer.flush(); System.out.println("C 드라이브에 FileCopyTest_복사본.java 파일이 생성되었습니다."); writer.close(); reader.close(); } }
8. File 클래스
1) 파일 시스템의 파일을 표현하는 클래스import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class FileTest { public static void main(String[] args) throws IOException { File directory = new File("C:\\Temp\\directory"); File file = new File("C:\\Temp\\file1.txt"); File file2 = new File("C:\\Temp\\file2.txt"); if(directory.exists() == false) { directory.mkdirs(); // 경로상에 없는 모든 디렉토리를 생성 } if(file.exists() == false) { file.createNewFile(); System.out.println("file1.txt가 생성되었습니다."); } if(file2.exists() == false) { file2.createNewFile(); System.out.println("file2.txt가 생성되었습니다."); } File directory2 = new File("C:\\Users\\sj031\\Desktop\\Download Files\\eclipse"); // eclipse 서브 디렉토리 및 파일을 배열로 만들어 리턴 File[] contents = directory2.listFiles(); System.out.println("날짜 \t\t 시간 \t 크기 \t 이름"); System.out.println("----------------------------------------------------"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm"); for(File file0 : contents) { System.out.print(sdf.format(new Date(file0.lastModified()))); if(file0.isDirectory()) { // 디렉토리 이름 출력 System.out.print("\t<DIR>\t\t" + file0.getName()); } else { // 파일의 크기와 이름을 출력 System.out.print("\t\t" + file0.length() + "\t" + file0.getName()); } System.out.println(); } } }
import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FileTest02 { public static void main(String[] args) throws IOException { File file = new File("C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\file\\FileTest02.java"); System.out.println("파일의 경로 : " + file.getPath()); System.out.println("부모 디렉토리 : " + file.getParent()); System.out.println("실행 가능 여부 : " + file.canExecute()); System.out.println("읽기 가능 여부 : " + file.canRead()); System.out.println("파일 숨김 여부 : " + file.isHidden()); System.out.println("쓰기, 수정 가능 여부 : " + file.canWrite()); System.out.println("파일 이름 : " + file.getName()); System.out.println("파일 크기 : " + file.length()); System.out.println("URI 출력 형태 : " + file.toURI()); FileInputStream fis = new FileInputStream(file); int data; int i=0; byte[] bArr = new byte[1000]; while((data = fis.read(bArr)) != -1) { System.out.write(bArr); i++; } System.out.println("루핑 수 : " + i); fis.close(); } }
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileTest03 { public static void main(String[] args) throws IOException { // 파일 복사를 하기 위한 경로 설정 // String originFileName = "C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\file\\earth_and_moon-Universe_Photography_Wallpaper_1366x768.jpg"; // String originFileName = "C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\file\\SampleData.xlsx"; String originFileName = "C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\file\\HAPPY NEW YEAR !...(Mariah Carey - AULD LANG SYNE (REMIX).webm"; // String targetFileName = "C:\\Temp\\earth.jpg"; // String targetFileName = "C:\\Temp\\SampleData2.xlsx"; String targetFileName = "C:\\Temp\\AULD LANG SYNE.webm"; File file = new File(originFileName); FileInputStream fis = new FileInputStream(file); // 파일로부터 데이터를 복사(입력) FileOutputStream fos = new FileOutputStream(targetFileName); // 복사한 파일 출력 // 바이트 배열을 크게 잡을수록 복사시간이 빨라짐 byte[] bArr = new byte[10000]; int readByteCount; int i = 0; // 현재 시점 저장 long startTime = System.currentTimeMillis(); while((readByteCount = fis.read(bArr)) != -1) { fos.write(bArr, 0, readByteCount); // 읽은 바이트 수만큼 출력 스트림으로 보내는 것 i++; } fos.flush(); // 복사의 종료 시점 long endTime = System.currentTimeMillis(); System.out.println("루핑 수 : " + i); System.out.println("복사 시간 : " + (endTime - startTime) + "ms"); System.out.println("복사한 파일의 크기 : " + (file.length()/1024) + "Kbyte"); fos.close(); fis.close(); System.out.println(file.getName() + "파일의 복사가 완료되었습니다."); } }
import java.io.File; import java.io.FileReader; import java.io.IOException; public class FileTest04 { public static void main(String[] args) throws IOException { File file = new File("C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\file\\android-1.txt"); FileReader fr = new FileReader(file); // System.out.println("파일크기 : " + file.length()); int readCharNo; char[] cArr = new char[200]; int i = 0; while((readCharNo = fr.read(cArr)) != -1) { String str = new String(cArr, 0, readCharNo); System.out.print(str); i++; } System.out.println(); System.out.println("루핑 수 : " + i); fr.close(); } }
9. 보조 스트림 클래스들
1) 실제 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림
2) FilterInputStream, FilterOutputStream이 보조 스트림의 상위 클래스들
3) 생성자의 매개변수로 또 다른 스트림(기반 스트림이나 다른 보조 스트림)을 가짐
4) 상위 클래스 생성자
- protected FilterInputStream(InputStream in) : 생성자의 매개변수로 InputStream을 받음
10. InputStreamReader와 OutputStreamWriter
1) 바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림
2) FileInputStream으로 읽은 자료를 문자로 변환해줌import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; public class InputStreamReaderTest { public static void main(String[] args) throws IOException { // 기반 스트림은 바이트 기반인 InputStream으로 설정함 InputStream iStream = System.in; // 콘솔로부터 입력을 받음 // 문자를 받기 위해 보조 스트림 reader를 iStream에 연결함 (문자 변환 보조 스트림) Reader reader = new InputStreamReader(iStream); int readCount; char[] cArr = new char[10000]; System.out.print("문자열을 입력하세요 : "); /* * 콘솔에서 입력을 받을 때는 -1을 리턴하는 경우 Ctrl+Z를 누르면 됨 * 콘솔창의 실행, 중지를 확인해 보면 됨 */ while((readCount = reader.read(cArr)) != -1) { String str = new String(cArr, 0, readCount); System.out.println("키보드로부터 읽은 문자열 : " + str); } reader.close(); } }
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; public class OutputStreamWriterTest { public static void main(String[] args) throws IOException { //주 스트림 생성 FileOutputStream fStream = new FileOutputStream("write5.txt"); //보조 스트림을 연결함 Writer writer = new OutputStreamWriter(fStream); // 저장할 데이터 String data = "문자데이터를 보조 출력 스트림으로 보내서 바이트 스트림 기반으로 변환되어 저장됨"; writer.write(data); writer.flush(); System.out.println("파일이 저장되었습니다."); writer.close(); } }
11.BufferedInputStream, BufferedReader | BufferedOutputStream, BufferedWriter
1) 성능 향상 보조 스트림
- 버퍼를 이용한 해결
- 입출력 소스와 직접 작업하지 않고 메모리 버퍼(buffer)와 작업하므로 실행 성능 향상
- 프로그램은 쓰기 속도 향상import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class BufferedInputStreamTest { public static void main(String[] args) throws IOException { long start = 0; long end = 0; File file = new File("C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\addedstream\\We Never Go Alone.mp4"); System.out.println("File 크기 : " + file.length()); FileInputStream fStream = new FileInputStream(file); System.out.println("바이트 기반 읽기 시작"); start = System.currentTimeMillis(); while(fStream.read() != -1) {} end = System.currentTimeMillis(); System.out.println("바이트 기반 읽기 종료"); System.out.println("버퍼를 사용하지 않았을 때(바이트 기반)" + (end-start) + "ms"); fStream.close(); System.out.println(); FileInputStream fStream2 = new FileInputStream(file); BufferedInputStream bStream = new BufferedInputStream(fStream2); System.out.println("버퍼 기반 읽기 시작"); start = System.currentTimeMillis(); while(bStream.read() != -1) {} end = System.currentTimeMillis(); System.out.println("버퍼 기반 읽기 종료"); System.out.println("버퍼를 사용했을 때(바이트 기반)" + (end-start) + "ms"); bStream.close(); } }
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class BufferedInputStreamTest { public static void main(String[] args) throws IOException { long start = 0; long end = 0; File file = new File("C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\addedstream\\We Never Go Alone.mp4"); System.out.println("File 크기 : " + file.length()); FileInputStream fStream = new FileInputStream(file); System.out.println("바이트 기반 읽기 시작"); start = System.currentTimeMillis(); while(fStream.read() != -1) {} end = System.currentTimeMillis(); System.out.println("바이트 기반 읽기 종료"); System.out.println("버퍼를 사용하지 않았을 때(바이트 기반)" + (end-start) + "ms"); fStream.close(); System.out.println(); FileInputStream fStream2 = new FileInputStream(file); BufferedInputStream bStream = new BufferedInputStream(fStream2); System.out.println("버퍼 기반 읽기 시작"); start = System.currentTimeMillis(); while(bStream.read() != -1) {} end = System.currentTimeMillis(); System.out.println("버퍼 기반 읽기 종료"); System.out.println("버퍼를 사용했을 때(바이트 기반)" + (end-start) + "ms"); bStream.close(); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; public class BufferedReaderTest { public static void main(String[] args) throws IOException { //주 스트림 : 바이트 기반 InputStream iStream = System.in; //보조 스트림1 : 바이트를 문자로 바꿔줌 Reader reader = new InputStreamReader(iStream); //보조 스트림2 : 속도 및 성능 향상 BufferedReader bReader = new BufferedReader(reader); //bReader = new BufferedReader(new InputStreamReader(System.in)); System.out.print("입력 : "); String lingString = bReader.readLine(); //한 줄 단위 읽어들임 System.out.println("출력 : " + lingString); bReader.close(); } }
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class BufferedOutputStreamTest { public static void main(String[] args) throws IOException { //File file = new File("C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\addedstream\\We Never Go Alone.mp4"); File file = new File("C:\\workspace-java\\Chap23(IO입출력)\\src\\kr\\co\\ezenac\\addedstream\\노르웨이 놀라운 아름다운 자연과 편안한 음악.mp4"); System.out.println("파일의 크기 : " + (file.length())/1024 + "kbyte"); System.out.println("파일의 크기 : " + ((file.length())/1024)/1024 + "Mbyte"); //주 스트림 FileInputStream fInputStream = null; FileOutputStream fOutputStream = null; //보조 스트림 BufferedInputStream bInputStream = null; BufferedOutputStream bOutputStream = null; int dataCount = 0; long start = 0; long end = 0; byte[] bArr = new byte[10000]; //주 스트림에 보조 스트림을 연결함(입력) fInputStream = new FileInputStream(file); bInputStream = new BufferedInputStream(fInputStream); //주 스트림에 보조 스트림을 연결함(출력) //fOutputStream = new FileOutputStream("C:\\Temp\\응원가.mp4"); fOutputStream = new FileOutputStream("C:\\Temp\\노르웨이 아름다운 자연.mp4"); bOutputStream = new BufferedOutputStream(fOutputStream); //읽고 저장하기 전 시간 저장 start = System.currentTimeMillis(); while((dataCount = bInputStream.read(bArr)) != -1) { fOutputStream.write(bArr, 0, dataCount); } fOutputStream.flush(); //읽고 저장한 후 시간 end = System.currentTimeMillis(); System.out.println("BufferedOutputStream을 사용하지 않았을 떄 : " + (end-start) + "ms"); System.out.println(); //BufferedOutputStream 사용했을 때 start = System.currentTimeMillis(); while((dataCount = bInputStream.read(bArr)) != -1) { bOutputStream.write(bArr, 0, dataCount); } bOutputStream.flush(); end = System.currentTimeMillis(); System.out.println("BufferedOutputStream을 사용했을 떄 : " + (end-start) + "ms"); //자원 해제 bOutputStream.close(); bInputStream.close(); fInputStream.close(); fOutputStream.close(); } }