컴퓨터의 가장 중요한 기능은 데이터를 처리하는 것입니다. 유용한 컴퓨터 언어는 처리되지 않은 데이터가 프로그램으로 유입되고 처리된 데이터가 유출되도록 우수한 IO 기능을 가져야 합니다.
다른 언어에 비해 Java의 IO 기능은 복잡합니다. 다른 언어에서는 많은 IO 기능(예: 파일 읽기)이 캡슐화되어 한두 줄의 프로그램으로 구현될 수 있습니다. Java에서 프로그래머는 파일 읽기를 위해 여러 수준의 장식이 필요한 경우가 많습니다.
상대적인 복잡성의 이점은 IO의 유연성입니다. Java에서는 프로그래머가 IO의 전체 프로세스를 제어하여 최상의 IO 방법을 설계할 수 있습니다. 아래에서 더 자세히 살펴보겠습니다.
IO 예시
아래는 데모에 사용한 file.txt 파일입니다.
안녕하세요 세계!안녕 괴상한!
먼저 파일 읽기의 예를 살펴보겠습니다.
import java.io.*;public class Test{ public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader("file.txt")) String line = br.readLine(); while (line != null) { System.out.println(line); line = br.readLine() } br.close() } catch(IOException) e) { System.out.println("IO 문제") } }}
이 프로그램에는 try...catch...finally 예외 처리기가 포함되어 있습니다. 예외 처리에 대한 Java 고급 자습서를 참조하십시오.
데코레이터와 함수 조합
IO 프로그램의 핵심은 BufferedReader 객체 br를 생성하는 것입니다:
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
생성 과정에서 먼저 FileReader 객체를 생성했습니다. 이 객체의 기능은 "file.txt" 파일에서 바이트 스트림을 읽고 이를 텍스트 스트림으로 변환하는 것입니다. Java에서 표준 텍스트 인코딩은 유니코드입니다. BufferedReader()는 FileReader 객체를 수신하고, FileReader의 기능을 확장하고, 새로운 BufferedReader 객체를 생성합니다. 위에서 언급한 파일 읽기 및 변환 기능 외에도 이 개체는 캐시된 읽기(버퍼링) 기능도 제공합니다. 마지막으로 br 객체의 readLine() 메서드를 호출하여 파일을 한 줄씩 읽을 수 있습니다.
(캐시 읽기는 FileReader가 읽은 텍스트 스트림을 저장하는 캐시로 메모리 영역을 여는 것입니다. 캐시 내용을 읽을 때(예: readLine() 명령) 캐시는 후속 텍스트 스트림을 로드합니다.)
BufferedReader()는 기본 객체를 수신하고 더 복잡한 기능을 가진 장식된 객체를 반환하는 데코레이터입니다. 데코레이터의 장점은 다양한 객체를 장식하는 데 사용할 수 있다는 것입니다. 여기서 수정하는 것은 파일에서 읽은 텍스트 스트림입니다. 표준 입력, 네트워크 전송 스트림 등과 같은 다른 텍스트 스트림은 캐시된 읽기를 달성하기 위해 BufferedReader()로 수정될 수 있습니다.
아래 다이어그램은 데이터가 아래에서 위로 흐르는 방식으로 br이 작동하는 방식을 보여줍니다.
위의 데코레이션 프로세스는 Linux의 텍스트 스트림 아이디어와 매우 유사합니다. Linux에서는 함수형 접근 방식을 사용하여 텍스트 스트림을 처리하고 전달합니다. Java에서는 데코레이터를 사용합니다. 그러나 그들의 목적은 비슷합니다. 모듈화와 기능의 자유로운 결합을 달성하는 것입니다.
더 많은 조합
실제로 Java는 풍부한 데코레이터 세트를 제공합니다. FileReader는 읽기와 변환의 두 단계를 결합하고 인코딩을 위한 유니코드와 같이 일반적으로 사용되는 기본 설정을 채택합니다. FileInputStream + InputStreamReader의 조합을 사용하여 FileReader를 대체할 수 있으므로 바이트 읽기 및 변환의 두 단계를 분리하고 두 프로세스를 더 효과적으로 제어할 수 있습니다.
(물론 FileReader가 사용하기 더 편리합니다. InputStreamReader는 FileInputStream을 유니코드 텍스트 처리를 위한 Reader로 변환합니다.)
화살표는 데이터 흐름 방향을 나타냅니다.
스트림 읽기 및 쓰기는 4개의 기본 클래스(InputStream, OutputStream, Reader 및 Writer)에서 이루어집니다. InputStream과 Reader는 읽기 작업을 처리하고, OutputStream과 Writer는 쓰기 작업을 처리합니다. 둘 다 java.io 패키지에 있습니다. 상속관계는 다음과 같습니다.
java.io
또한 IOException에는 다음과 같은 파생 클래스가 있습니다.
IO예외
Reader 및 Writer와 해당 파생 클래스는 유니코드 텍스트를 처리합니다. Buffered Reader, InputStreamReader 또는 FileReader를 참조하세요.
InputStream 및 OutputStream과 해당 파생 클래스는 바이트 스트림을 처리합니다. 컴퓨터에 있는 데이터는 바이트 형식으로 간주할 수 있으므로, InputStream 및 OutputStream을 사용하여 더 넓은 범위의 데이터를 처리할 수 있습니다. 예를 들어, 다음 조합을 사용하여 압축 파일에 포함된 데이터(예: 정수)를 읽을 수 있습니다.
화살표는 데이터 흐름 방향을 나타냅니다.
압축된 파일에서 바이트 스트림을 읽은 다음 압축을 풀고 마지막으로 데이터를 읽습니다.
쓰다
쓰기 작업은 읽기 작업과 유사합니다. 데코레이션을 사용하여 복잡한 쓰기 기능을 구현할 수 있습니다. 다음은 텍스트 작성의 간단한 예입니다.
import java.io.*;public class Test{ public static void main(String[] args) { try { String content = "물고기 주셔서 감사합니다." File file = new File("new.txt") / / 존재하지 않는 경우 파일 생성 if (!file.exists()) { file.createNewFile() } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.close() } catch(IOException e) { System.out.println("IO 문제");
위에서 파일 경로 처리를 위해 파일 객체가 생성되었습니다.
요약
이것은 단지 Java IO에 대한 기본적인 소개입니다. Java의 IO는 비교적 복잡합니다. Java 프로그래머는 java.io의 클래스와 해당 기능에 익숙해지는 데 시간을 투자해야 합니다.