-
[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에서 파일을 읽고 쓰기 위해서는 FileInputStream과 FileOutputStream 클래스를 사용합니다. 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(); }위 코드에서 BufferedOutputStream은 FileOutputStream의 버퍼링 버전입니다. 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(); }위 코드에서 DataOutputStream은 FileOutputStream에 대한 래퍼 클래스로, writeInt()와 writeDouble() 메소드를 사용하여 각각의 기본 자료형을 파일에 씁니다.
'Software engineer > Java' 카테고리의 다른 글
[Java] #10 Java 8에서 추가된 기능 소개 - 현대적인 개발 경험을 위한 힘든 시간에서 효율적인 코드 작성으로! (0) 2023.06.28 [Java] #9 네트워크(Network) (1) 2023.05.04 [Java] #7 스레드(Thread) (2) 2023.05.02 [Java] #6 람다(Lambda), 스트림(Stream) (1) 2023.05.02 [Java] #5 제네릭(Generics), 이넘(Enum), 어노테이션(@, Annotation) (3) 2023.05.01