Эффективный способ записи InputStream в файл в Java 6
Я получу входной поток из сторонней библиотеки в мое приложение. Я должен записать этот входной поток в файл.
Ниже приведен фрагмент кода, я пробовал:
private void writeDataToFile(Stub stub) {
OutputStream os = null;
InputStream inputStream = null;
try {
inputStream = stub.getStream();
os = new FileOutputStream("test.txt");
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
os.write(bytes, 0, read);
}
} catch (Exception e) {
log("Error while fetching data", e);
} finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
log("Error while closing input stream", e);
}
}
if(os != null) {
try {
os.close();
} catch (IOException e) {
log("Error while closing output stream", e);
}
}
}
}
есть ли лучший подход для этого ?
3 ответов
поскольку вы застряли с Java 6, Сделайте себе одолжение и используйте Guava и его Closer
:
final Closer closer = Closer.create();
final InputStream in;
final OutputStream out;
final byte[] buf = new byte[32768]; // 32k
int bytesRead;
try {
in = closer.register(createInputStreamHere());
out = closer.register(new FileOutputStream(...));
while ((bytesRead = in.read(buf)) != -1)
out.write(buf, 0, bytesRead);
out.flush();
} finally {
closer.close();
}
если бы вы использовали Java 7, решение было бы так же просто, как:
final Path destination = Paths.get("pathToYourFile");
try (
final InputStream in = createInputStreamHere();
) {
Files.copy(in, destination);
}
и yourInputStream
был бы закрыт автоматически для вас в качестве "бонуса"; Files
справились бы destination
все само по себе.
Если вы не на Java 7 и не можете использовать решение fge, вы можете обернуть свой OutputStream в BufferedOutputStream
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream("xx.txt"));
такой буферизованный выходной поток будет записывать байты в блоки в файл, что более эффективно, чем запись байта на байт.
он может стать чище с OutputStreamWriter:
OutputStream outputStream = new FileOutputStream("output.txt");
Writer writer = new OutputStreamWriter(outputStream);
writer.write("data");
writer.close();
вместо того, чтобы писать строку, Вы можете использовать сканер на вашем inputStream
Scanner sc = new Scanner(inputStream);
while (sc.HasNext())
//read using scanner methods