"파일 입력/출력을 위한 스트림부터 시작하겠습니다. 하지만 가장 먼저 해야 할 일이 있습니다."

파일 읽기 및 쓰기를 위한 두 가지 클래스가 있습니다: FileInputStreamFileOutputStream . 이미 짐작하셨겠지만 FileInputStream은 파일에서 바이트를 순차적으로 읽을 수 있고 FileOutputStream은 파일에 바이트를 순차적으로 쓸 수 있습니다. 다음은 이러한 클래스의 메서드입니다.

방법 메서드가 수행하는 작업
FileInputStream(String fileName);
— 생성자입니다. 생성된 개체가 데이터를 읽을 디스크의 파일 이름을 지정할 수 있습니다.
int read();
— 이 메서드는 파일에서 한 바이트를 읽고 반환합니다. 반환 값은 int로 확장됩니다.
int available();
— 이 메서드는 읽지 않은(사용 가능한) 바이트 수를 반환합니다.
void close();
— 이 메서드는 스트림을 «닫습니다». 스트림 작업을 마치면 이것을 호출합니다.
그런 다음 개체는 파일 등을 닫는 데 필요한 관리 작업을 수행합니다.
이 시점에서 스트림에서 더 이상 데이터를 읽을 수 없습니다.

재미삼아 파일에 있는 모든 바이트의 합계를 계산해 보겠습니다. 코드는 다음과 같습니다.

파일의 모든 바이트 합계
public static void main(String[] args) throws Exception
{
 //Create a FileInputStream object bound to «c:/data.txt».
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 long sum = 0;

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); //Read the next byte
  sum +=  data; //Add it to the running total
 }
 inputStream.close(); // Close the stream

 System.out.println(sum); // Display the sum on the screen.
}

"우리는 이미 이와 같은 것을 조사했습니다. FileOutputStream은 어떻게 구성되어 있습니까?"

"좋아. 이것 좀 봐:"

방법 메서드가 수행하는 작업
FileOutputStream (String fileName);
"이것은 생성자입니다. 생성된 개체가 데이터를 쓸 디스크의 파일 이름을 지정할 수 있습니다."
void write(int data);
"이 메서드는 다음 바이트를 쓰고 데이터를 1바이트로 자릅니다."
void flush();
"기록할 데이터는 먼저 메모리의 큰 블록에 수집된 다음 디스크에만 기록되는 경우가 많습니다."

flush 명령은 저장되지 않은 모든 정보를 강제로 디스크에 기록합니다.

void close();
"이 메서드는 스트림을 «닫습니다». 스트림 작업을 마치면 이 메서드를 호출합니다."
그런 다음 개체는 파일 등을 닫는 데 필요한 정리 작업을 수행합니다.

더 이상 스트림에 데이터를 쓸 수 없으며 플러시가 자동으로 호출됩니다.

"그게 다야?"

"네, 실제로 쓰는 방법은 단 하나뿐입니다. 바로 write()입니다. 한 번에 한 바이트만 씁니다. 하지만 파일에 원하는 만큼 많은 정보를 쓸 수 있습니다."

프로그래밍은 하나의 크고 복잡한 작업을 여러 개의 작은 작업으로 나누는 과정입니다. 기본적으로 동일한 프로세스가 여기에서 발생합니다. 큰 데이터 블록을 읽고 쓰는 작업은 한 번에 한 바이트씩 바이트 크기의 읽기 및 쓰기로 나뉩니다.

다음은 이러한 클래스를 사용하여 디스크의 파일을 복사하는 방법입니다.

디스크에 파일 복사
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); // Read the next byte into the data variable
  outputStream.write(data); // and write it to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"고마워, Rishi. 드디어 이 코드가 실제로 어떻게 작동하는지 이해했어."