ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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();
    	}
    }

    '개발자 수업 > Java' 카테고리의 다른 글

    30. Review  (0) 2021.10.25
    29. 멀티스레드  (0) 2021.10.22
    27. 예외처리  (0) 2021.10.20
    26. 스트림  (0) 2021.10.19
    25. 람다식  (0) 2021.10.19

    댓글