InputStream을 Java의 파일 객체로 변환

Mehvish Ashiq 2023년10월12일
  1. 일반 Java를 사용하여 InputStreamFile 객체로 변환
  2. Files.copy() 메서드를 사용하여 Java에서 InputStreamFile 개체로 변환
  3. InputStream.transferTo() 메서드를 사용하여 Java에서 InputStreamFile 객체로 변환
  4. Apache Commons IO API를 사용하여 InputStream을 Java의 File 객체로 변환
InputStream을 Java의 파일 객체로 변환

파일을 만들고 콘텐츠를 추가해야 하는 경우가 많습니다. 예를 들어 네트워크를 통해 받은 바이트나 문자열 요소를 파일에 저장해야 합니다.

각각의 경우에 데이터는 InputStream으로 존재하며 파일에 기록되어야 합니다. 오늘의 튜토리얼에서는 Java에서 InputStreamFile 객체로 변환하는 방법에 대해 설명합니다.

이를 위해 Java 버전에 따라 InputStreamFile 개체로 변환하는 다양한 방법을 사용하여 다양한 예제 코드를 작성할 것입니다. 접근 방식 중 일부는 다음과 같습니다.

일반 Java를 사용하여 InputStreamFile 객체로 변환

예제 코드:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class plainJava {
  public static void main(String[] args) {
    try {
      InputStream inputStream = new FileInputStream(new File("./files/test.txt"));

      byte[] buffer = new byte[inputStream.available()];
      inputStream.read(buffer);

      File destinationFile = new File("./files/test-plainJava-output.txt");

      OutputStream outputStream = new FileOutputStream(destinationFile);
      outputStream.write(buffer);

    } catch (FileNotFoundException exception) {
      exception.printStackTrace();
    } catch (IOException exception) {
      exception.printStackTrace();
    }
  }
}

파일 경로를 지정하여 위의 Java 프로그램에서 FileInputStream을 인스턴스화합니다. 파일이 존재하지 않거나 철자가 틀린 경우 FileNotFoundException 예외를 생성합니다.

주어진 파일에서 입력 바이트를 검색하기 위해 FileInputStream을 사용하고 있습니다. 그런 다음 byte 유형의 buffer라는 배열을 생성합니다. 여기서 inputStream.available() 메서드는 read() 호출이 프로그램의 실행 흐름을 차단할 때까지 읽을 수 있는 바이트 수를 알려줍니다.

그런 다음 File 클래스를 인스턴스화하여 test-plainJava-output.txt 파일을 만들고 해당 참조를 destinationFile 변수에 저장합니다. 다음으로 FileOutputStream 객체를 생성하고 이전 단계에서 생성한 대상 파일의 참조를 전달하고 byte 코드를 작성합니다.

이제 test.txttest-plainJava-output.txt 파일을 열고 두 파일의 내용이 동일한지 확인합니다. 정보를 읽거나 쓰는 동안 문제가 발생하면 IOException이 발생할 수 있음을 기억하십시오.

Files.copy() 메서드를 사용하여 Java에서 InputStreamFile 개체로 변환

예제 코드:

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Paths;

public class filesCopy {
  private static final String OUTPUT_FILE = "./files/test_filesCopy-output.txt";

  public static void main(String[] args) {
    URI u = URI.create("https://www.google.com/");

    try (InputStream inputStream = u.toURL().openStream()) {
      // Java 1.7 onwards
      Files.copy(inputStream, Paths.get(OUTPUT_FILE));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

이 접근 방식은 Java 7 이상에서 사용할 수 있습니다. 위의 코드 펜스에서는 위에서 설명한 것처럼 InputStream 객체를 File 객체로 복사하는 데 사용되는 Java NIO API의 Files.copy()를 사용하고 있습니다.

filesCopy 프로그램에서 먼저 출력 파일의 경로를 포함하는 문자열 유형 개체를 만듭니다.

main() 메서드에서 create() 메서드를 사용하여 URI 개체를 만들고 다음 단계에서 사용할 u 변수에 해당 참조를 저장합니다. 지정된 문자열 값이 URI 개체로 구문 분석될 것이라고 확신할 때 create()를 사용합니다. 그렇지 않으면 프로그래머의 잘못으로 간주됩니다.

다음으로 URI 개체 u를 사용하여 toURL() 메서드를 호출하여 이 URI에서 URL을 구성하고 openStream() 메서드를 사용하여 java.io.InputSteam 개체를 가져옵니다. 그런 다음 Files.copy() 메서드를 사용합니다. 이 메서드는 inputStream 개체와 데이터를 복사하려는 파일의 경로라는 두 매개 변수를 사용합니다.

이제 출력 파일인 test_filesCopy-output.txt에서 구문 분석된 데이터를 볼 수 있습니다. 예외가 발생하면 try-catch 블록을 사용하여 예외를 처리합니다. 그렇지 않으면 프로그램이 실행을 종료합니다.

InputStream.transferTo() 메서드를 사용하여 Java에서 InputStreamFile 객체로 변환

예제 코드:

import java.io.*;
import java.net.URI;

public class inputStreamTransferTo {
  public static void main(String[] args) {
    URI u = URI.create("https://www.google.com/");

    try (InputStream inputStream = u.toURL().openStream()) {
      File outputFile = new File("./files/test_transferTo-output.txt");
      OutputStream outputStream = new FileOutputStream(outputFile, false);
      inputStream.transferTo(outputStream); // Java 9

    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Java 9 이상이 있는 경우 이 접근 방식을 사용할 수 있습니다. 이 코드 예제는 try 블록의 몇 가지 차이점을 제외하고 Files.copy() 메서드를 사용한 이전 예제와 유사합니다.

여기에서는 출력 파일인 test_transferTo-output.txt를 지정하여 File 클래스의 객체를 생성합니다. 그런 다음 이 File 개체를 사용하여 FileOutputStream 클래스를 인스턴스화하고 출력 파일(test_transferTo_output.txt)에 데이터를 쓰는 데 사용할 것입니다.

마지막으로 inputStream.transferTo() 메서드를 사용합니다. 이 메서드는 출력 스트림을 매개변수로 사용하고 inputStream을 지정된 outputSteam에 직접 복사합니다. 이제 출력 파일 test_transferTo_output.txt에 구문 분석된 데이터가 있습니다.

또한 프로그램 종료를 방지하기 위해 try-catch 블록 내에 이 코드를 포함했습니다.

Apache Commons IO API를 사용하여 InputStream을 Java의 File 객체로 변환

예제 코드:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import org.apache.commons.io.FileUtils;

public class apacheCommons {
  public static void main(String[] args) throws IOException {
    URI u = URI.create("https://www.google.com/");
    try (InputStream inputStream = u.toURL().openStream()) {
      File outputFile = new File("./files/test_apache_output.txt");
      // commons-io
      FileUtils.copyInputStreamToFile(inputStream, outputFile);
    }
  }
}

이 예제 코드는 이전 코드와 유사합니다. URI 객체를 생성하여 toURL을 호출합니다. 그러면 이 URI 객체를 통해 URL이 생성되고 openStream() 메서드를 사용하여 java.io.InputStream 객체를 가져오고 File을 인스턴스화합니다. 여기서 test_apache_output.txt인 출력 파일의 경로를 가리키는 클래스입니다.

그러나 우리는 Apache Commons IO API를 사용하여 Java에서 입력 스트림을 파일 객체로 변환하고 있습니다. 이 API는 매우 편리하며 다양한 파일 입력/출력 작업을 수행하는 다양한 기능을 제공합니다.

이 라이브러리를 사용하려면 먼저 다음과 같이 pom.xml 파일에 commons-io 종속성을 추가해야 합니다.

<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.7</version>
</dependency>

그런 다음 copyInputStreamToFile() 메서드를 사용하여 입력 스트림에서 바이트를 읽고 지정된 파일에 복사할 수 있습니다. 이제 출력 파일인 test_apache_output.txt 파일에서 파싱된 데이터를 볼 수 있습니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

관련 문장 - Java InputStream