InputStream을 Java의 파일 객체로 변환
-
일반 Java를 사용하여
InputStream
을File
객체로 변환 -
Files.copy()
메서드를 사용하여 Java에서InputStream
을File
개체로 변환 -
InputStream.transferTo()
메서드를 사용하여 Java에서InputStream
을File
객체로 변환 -
Apache Commons IO API를 사용하여
InputStream
을 Java의File
객체로 변환
파일을 만들고 콘텐츠를 추가해야 하는 경우가 많습니다. 예를 들어 네트워크를 통해 받은 바이트나 문자열 요소를 파일에 저장해야 합니다.
각각의 경우에 데이터는 InputStream
으로 존재하며 파일에 기록되어야 합니다. 오늘의 튜토리얼에서는 Java에서 InputStream
을 File
객체로 변환하는 방법에 대해 설명합니다.
이를 위해 Java 버전에 따라 InputStream
을 File
개체로 변환하는 다양한 방법을 사용하여 다양한 예제 코드를 작성할 것입니다. 접근 방식 중 일부는 다음과 같습니다.
일반 Java를 사용하여 InputStream
을 File
객체로 변환
예제 코드:
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.txt
및 test-plainJava-output.txt
파일을 열고 두 파일의 내용이 동일한지 확인합니다. 정보를 읽거나 쓰는 동안 문제가 발생하면 IOException
이 발생할 수 있음을 기억하십시오.
Files.copy()
메서드를 사용하여 Java에서 InputStream
을 File
개체로 변환
예제 코드:
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에서 InputStream
을 File
객체로 변환
예제 코드:
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
파일에서 파싱된 데이터를 볼 수 있습니다.