Bir java.io.Filenesneden bir nesne yaratmanın bir yolu var mı java.io.InputStream?
Benim ihtiyacım, Dosyayı bir RAR'dan okumak. Geçici bir Dosya yazmaya çalışmıyorum, RAR arşivinin içinde okumaya çalıştığım bir dosyam var.
Bir java.io.Filenesneden bir nesne yaratmanın bir yolu var mı java.io.InputStream?
Benim ihtiyacım, Dosyayı bir RAR'dan okumak. Geçici bir Dosya yazmaya çalışmıyorum, RAR arşivinin içinde okumaya çalıştığım bir dosyam var.
Yanıtlar:
Yeni dosya oluşturmanız ve içeriğini InputStreamo dosyaya kopyalamanız gerekir :
File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
// handle exception here
} catch (IOException e) {
// handle exception here
}
IOUtils.copy()Akışların manuel olarak kopyalanmasını önlemek için uygun kullanıyorum . Ayrıca yerleşik arabelleğe alma özelliğine sahiptir.
Tek satırda:
FileUtils.copyInputStreamToFile(inputStream, file);
(Org.apache.commons.io)
Önce bir geçici dosya oluşturun.
File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;
Java 7'den beri, herhangi bir harici kitaplık kullanmadan bile tek satırda yapabilirsiniz:
Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);
API belgelerine bakın .
Başka bir kitaplık kullanmak istemiyorsanız, burada dönüştürmek InputStreamiçin basit bir işlev var OutputStream.
public static void copyStream(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
}
Artık şunu kullanarak kolayca bir Inputstreamdosyaya yazabilirsiniz FileOutputStream-
FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();
public static void copyInputStreamToFile(InputStream input, File destination) {
try (OutputStream output = new FileOutputStream(destination)) {
input.transferTo(output);
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
java.io.InputStream # transferTo , Java 9'dan beri mevcuttur.
Java sürüm 7 veya daha yüksek kullanıyorsanız, kullanabileceğiniz deneyin-ile-kaynaklar düzgün yakın FileOutputStream. Aşağıdaki kod IOUtils.copy(), commons-io'dan kullanılır .
public void copyToFile(InputStream inputStream, File file) throws IOException {
try(OutputStream outputStream = new FileOutputStream(file)) {
IOUtils.copy(inputStream, outputStream);
}
}
tryBaşlatma bölümünde belirtilen kaynaklar , trybloktan çıkıldığında otomatik olarak kapatılır .