반응형
InputStream 객체를 File 객체로 변환해야 할 경우가 있다. 예를 들어, 네트워크를 통해 읽은 데이터를 File 객체를 입력으로 받는 라이브러리에 사용하고 싶을 때 이런 변환이 필요하다.
우선 InputStream에서 데이터를 읽어 로컬 파일 시스템의 임시파일로 저장해 두자.
public static File convertInputStreamToFile(InputStream in) {
File tempFile = File.createTempFile(String.valueOf(inputStream.hashCode()), ".tmp");
tempFile.deleteOnExit();
copyInputStreamToFile(inputStream, tempFile);
return tempFile;
}
File.createTempFile() 메소드를 이용해 임시 파일을 생성한다. deleteOnExit() 메소드를 이용해 이 임시파일이 JVM 종료시 지워지도록 설정해 놓는다. 그래야 깔끔하게 정리가 된다.
copyInputStreamToFile() 메소드를 이용해 InputStream에서 데이터를 읽어 임시 파일로 써주고, 파일을 리턴하면 된다. 이제 copyInputStreamToFile() 메소드를 구현해보자.
우선 1024 바이트의 버퍼를 두고 임시 파일에 쓰는 가장 단순한 코드다.
private static void copyInputStreamToFile(InputStream inputStream, File file) {
try (FileOutputStream outputStream = new FileOutputStream(file)) {
int read;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
}
}
위 코드는 Apache Commons I/O 라이브러리를 이용해서 내용을 복사 할 수 있다.
private static void copyInputStreamToFile(InputStream inputStream, File file) {
FileUtils.copyInputStreamToFile(inputStream, file);
}
이 라이브러리를 쓰기 위해서는 다음과 같은 Maven Dependency가 필요하다
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
<dependency>
Java 1.7 이상 버전을 사용하는 경우 NIO를 사용할 수도 있다.
private static void copyInputStreamToFile(InputStream inputStream, File file) {
Files.copy(inputStream, file.toPath());
}
반대로 File 객체를 InputStream 객체로 변경하는 코드는 다음과 같다.
File file = new File ("path");
InputStream inputStream = new FileInputStream(file);
반응형
댓글