입출력 기본

2022. 12. 7. 23:41자바

728x90

java. io // java의 I/O 시스템으로 관련 API 제공

 

<스트림>

1. 특징

자바는 입출력을 스트림을 통해 처리

스트림: 정보를 순차적으로 접근하도록 추상화 , 선입선출 구조 

자바 I/O 시스템이 디바이스와 스트림으로 연결

자바 프로그램은 스트림을 통해 정보를 교환

 

2. 사용방법

데이터의 출발지와 목적지를 연결하여 사용

- 한번에 열수 있는 개수는 제한 

- 동일한 파일은 둘 이상의 스트림으로 열 수 없음

- 스트림은 사용 전 열고, 사용 후 닫아야 함

 

3. 종류

1) 바이트 스트림: 입출력을 바이너리 데이터로 다룰 때

바이너리 데이터? 컴퓨터가 이해하는 데이터

InputStream, OutputStream

2) 문자 스트림: 입출력을 문자 단위로 다룰 때

Reader, Writer

표준 입출력 스트림 : 콘솔 입출력 시 사용되는 스트림

- java.lang.System 클래스 사용

ex) System.out.println()

 

<콘솔 입력 용 버퍼>

*자바 초창기에는 바이트 스트림만 이용

-> 패치 후 문자 스트림으로 문자 단위 읽기 지원

어떻게? System.in을 InputStreamReader와 BufferedReader 클래스로 래핑

BufferedReader(Reader inputReader) // inputReader를 버퍼를 이용해 읽어들임

InputStreamReader(InputStream inputStream) //inputStream을 문자 스트림으로 변환

버퍼를 두는 이유? 버퍼는 스트림과 프로그램 간에 데이터를 효율적으로 전송하려고 사용하는 메모리

->입출력 장치와 프로그램 간 동작 속도가 크게 차이가 날 때 버퍼를 사용하면 매우 효율적 

<콘솔에서 문자 입력받기>

import java.io.*;

class BRRead {
    public static void main(String[] args) throws IOException {
        char c;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in,
                System.console().charset())); //콘솔 입력용 버퍼 생성
        System.out.println("Enter characters, 'q' to quit.");
        do {
            c = (char) br.read(); //BufferedReader에 입력된 문자를 읽음
            System.out.println(c);
        } while (c != 'q');
    }
}

*int read() throws IOException //입력된 문자의 유니코드 값을 리턴,

반환형이 int이므로 예제에서는 char로 변환

스트림이 끝나면 -1을 리턴 

문자를 입력하고 엔터를 치면 개행문자도 같이 읽음

 

*String readLine() throws IOException //입력된 문자열을 한줄 읽음 

개행문자는 읽지 않음 

 

<콘솔에 문자 출력 하기>

1. PrintStream 클래스 메서드 -print(), println()

   - write()로도 출력 가능

2. Printwriter 클래스 //문자 스트림을 이용한 출력 

System.out보다 추천되는 콜솔 출력 방법

PrintWriter pw = new PrintWriter(System.out,true); 
/**첫번째 인자는 OutputStream 오브젝트
두번째 인자는 println() 호출 시 버퍼에 있는 데이터를 처리할지 결정
입력한거 바로바로 출력->성능이 느려질 수 있음
정해진만큼 출력->성능이 빠르지만 동기화 느림**/
        pw.println("This is a string");
        int i = -7;
        pw.println(i);
        double d = 4.5e-7;
        pw.println(d);

 

<파일 I/O>

파일 읽어서 콘솔에 출력하는 예제

import java.io.*;

class ShowFile {
    public static void main(String[] args) {
        int i;
        FileInputStream fin;
        if (args.length != 1) {
            System.out.println("Usage: ShowFile filename");
            return;
        }
        try {
            fin = new FileInputStream(args[0]); 
            //입력받은 스트링이 없는 파일인 경우 FileNotFoundException 발생
        } catch (FileNotFoundException e) {
            System.out.println("Cannot Open File");
            return;
        }
        try {
            do {
                i = fin.read();//read() 메서드가 반환형이 int라 int i에 대입
                //입력 스트림에서 1바이트를 읽고 리턴,끝까지 다 읽으면 -1 반환함
                if (i != -1) 
                    System.out.print((char) i);
            } while (i != -1);
        } catch (IOException e) {
            System.out.println("Error Reading File");
        }
        try {
            fin.close(); 
            //파일 처리 이후에는 스트림을 닫아줘야함(try-with-resource 문 사용 시 자동으로 닫힘)
        } catch (IOException e) {
            System.out.println("Error Closing File");
        }
    }
}

파일 읽어서 다른 파일 생성 후,생성한 파일에 쓰는 예제

import java.io.*;

class CopyFile {
    public static void main(String[] args) throws IOException {
        int i;
        FileInputStream fin = null;
        FileOutputStream fout = null;
        if (args.length != 2) {
            System.out.println("Usage: CopyFile from to");
            return;
        }
        try {
            fin = new FileInputStream(args[0]);
            fout = new FileOutputStream(args[1]);
            do {
                i = fin.read();
                if (i != -1)
                    fout.write(i); //하위 1바이트를 출력 스트림에 쓰기
            } while (i != -1);
        } catch (IOException e) {
            System.out.println("I/O Error: " + e);
        } finally {
            try {
                if (fin != null) //다읽으면 -1이 저장되므로
                    fin.close();
            } catch (IOException e2) {
                System.out.println("Error Closing Input File");
            }
            try {
                if (fout != null)
                    fout.close();
            } catch (IOException e2) {
                System.out.println("Error Closing Output File");
            }
        }
    }
}

 

728x90

'자바' 카테고리의 다른 글

기타 자바 키워드  (0) 2022.12.08
try-with-resources문  (0) 2022.12.08
열거형, 박싱, 어노테이션  (0) 2022.12.07
디폴트 메서드  (0) 2022.12.07
(자바) valueOf()  (0) 2022.11.17