ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] #8 입출력(Input/Output)
    Software engineer/Java 2023. 5. 3. 21:50

    입출력(Input/Output)

    Java I/O(Input/Output)는 Java에서 데이터를 읽고 쓰는 기능을 제공하는 API입니다. Java I/O는 java.io 패키지를 통해 제공되며, 파일, 네트워크, 키보드, 마우스 등 다양한 소스에서 데이터를 읽고 쓸 수 있습니다.

     

    Java I/O는 다음과 같은 종류의 스트림(Stream)을 제공합니다.

    • 바이트 스트림: 바이트 단위로 데이터를 처리하는 스트림으로, InputStream과 OutputStream 클래스를 사용합니다.
    • 문자 스트림: 문자 단위로 데이터를 처리하는 스트림으로, Reader와 Writer 클래스를 사용합니다.
    • 객체 스트림: 객체를 직렬화하여 데이터를 처리하는 스트림으로, ObjectInputStream과 ObjectOutputStream 클래스를 사용합니다.

    Java I/O에서 가장 기본적인 클래스는 File 클래스입니다. File 클래스는 파일 시스템에서 파일이나 디렉터리를 참조할 수 있는 클래스이며, 파일 생성, 삭제, 이름 변경, 디렉터리 생성 등의 작업을 수행할 수 있습니다.

     

    Java I/O에서 파일을 읽고 쓰기 위해서는 FileInputStreamFileOutputStream 클래스를 사용합니다. FileInputStream은 파일로부터 데이터를 읽어오는 스트림이며, FileOutputStream은 파일에 데이터를 쓰는 스트림입니다.

     

    다음은 FileInputStream을 사용하여 파일로부터 데이터를 읽어오는 예제 코드입니다.

    try (FileInputStream fis = new FileInputStream("input.txt")) {
        int data;
        while ((data = fis.read()) != -1) {
            System.out.print((char) data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    위 코드에서 FileInputStream은 "input.txt" 파일로부터 데이터를 읽어오는 스트림입니다. read() 메서드는 파일에서 데이터를 읽어오며, 읽어온 데이터가 없으면 -1을 반환합니다. while 루프를 사용하여 파일 끝까지 데이터를 읽어옵니다.

     

    다음은 FileOutputStream을 사용하여 파일에 데이터를 쓰는 예제 코드입니다.

    try (FileOutputStream fos = new FileOutputStream("output.txt")) {
        String text = "Hello, World!";
        byte[] bytes = text.getBytes();
        fos.write(bytes);
    } catch (IOException e) {
        e.printStackTrace();
    }

    위 코드에서 FileOutputStream"output.txt" 파일에 데이터를 쓰는 스트림입니다. getBytes() 메소드를 사용하여 문자열을 바이트 배열로 변환한 후, write() 메소드를 사용하여 파일에 데이터를 씁니다.

     

     

    버퍼(Buffer)

    Java I/O에서 입출력 작업은 내부적으로 파일 디스크나 네트워크와 같은 외부 자원과 통신합니다. 이러한 작업은 시스템 자원을 많이 사용하기 때문에, 매번 입출력 작업을 할 때마다 시스템 자원을 소모하는 것은 비효율적입니다. 따라서 Java I/O에서는 버퍼(Buffer)를 사용하여 입출력 성능을 향상합니다.

     

    버퍼는 메모리 상에 데이터를 임시로 저장하는 공간으로, 입출력 작업 시 매번 시스템 자원을 사용하는 것이 아니라 버퍼에 데이터를 쌓아두었다가 한 번에 입출력 작업을 수행합니다. 이를 통해 입출력 작업의 횟수를 줄이고, 시스템 자원을 효율적으로 사용할 수 있습니다.

     

    Java I/O에서는 BufferedInputStream과 BufferedOutputStream 클래스를 사용하여 각각 InputStream과 OutputStream을 버퍼링 하여 입출력 성능을 향상시킵니다. 이들 클래스는 내부에 버퍼를 가지고 있으며, 데이터를 읽거나 쓸 때마다 버퍼에 저장합니다. 이를 통해 입출력 작업의 횟수를 줄이고 성능을 향상시킵니다.

     

    예를 들어, 파일에서 데이터를 읽어오는 경우, 매번 디스크에서 데이터를 읽어오는 것은 시스템 자원을 많이 사용하므로 성능이 저하될 수 있습니다. 따라서 BufferedInputStream을 사용하여 파일을 버퍼링하여 한 번에 읽어온 다음, 버퍼에서 데이터를 읽어오는 것이 좋습니다. 이를 통해 파일 입출력 성능을 향상할 수 있습니다.

     

    다음은 BufferedInputStream을 사용하여 파일로부터 데이터를 읽어오는 예제 코드입니다.

    try (FileInputStream fis = new FileInputStream("input.txt");
         BufferedInputStream bis = new BufferedInputStream(fis)) {
        int data;
        while ((data = bis.read()) != -1) {
            System.out.print((char) data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    위 코드에서 BufferedInputStream은 FileInputStream의 버퍼링 버전입니다. FileInputStream과 달리 BufferedInputStream은 내부에 버퍼를 가지고 있으며, read() 메서드를 호출할 때마다 버퍼에서 데이터를 읽어옵니다. 이를 통해 파일 입출력 성능을 향상시킬 수 있습니다.

     

    다음은 BufferedOutputStream을 사용하여 파일에 데이터를 쓰는 예제 코드입니다.

    try (FileOutputStream fos = new FileOutputStream("output.txt");
         BufferedOutputStream bos = new BufferedOutputStream(fos)) {
        String text = "Hello, World!";
        byte[] bytes = text.getBytes();
        bos.write(bytes);
    } catch (IOException e) {
        e.printStackTrace();
    }

    위 코드에서 BufferedOutputStreamFileOutputStream의 버퍼링 버전입니다. FileOutputStream과 달리 BufferedOutputStream은 내부에 버퍼를 가지고 있으며, write() 메소드를 호출할 때마다 버퍼에 데이터를 씁니다. 이를 통해 파일 입출력 성능을 향상시킬 수 있습니다.

     

     

    DataInputStream/DataOutputStream

    Java I/O에서는 DataInputStream과 DataOutputStream 클래스를 사용하여 기본 자료형(primitive data type)을 읽고 쓸 수 있습니다. 이들 클래스는 바이트 스트림에 대한 래퍼 클래스(wrapper class) 역할을 하며, 각각의 기본 자료형에 대한 read()와 write() 메소드를 제공합니다.

     

    다음은 DataOutputStream을 사용하여 기본 자료형을 파일에 쓰는 예제 코드입니다.

    try (FileOutputStream fos = new FileOutputStream("output.dat");
         DataOutputStream dos = new DataOutputStream(fos)) {
        int value = 123;
        double pi = 3.14;
        dos.writeInt(value);
        dos.writeDouble(pi);
    } catch (IOException e) {
        e.printStackTrace();
    }

    위 코드에서 DataOutputStreamFileOutputStream에 대한 래퍼 클래스로, writeInt()writeDouble() 메소드를 사용하여 각각의 기본 자료형을 파일에 씁니다.

     

     

     

Designed by Tistory.