在 Java 中将 InputStream 写入文件
Writing an InputStream to a File in Java
我正在编写此方法,它将 InputStream 转换为文件,但该方法适用于某些输入但不适用于所有输入(当我将 zip 文件作为 InputStream 传递时它有效)。它只是创建一个 0 字节的文件。
我知道之前有人问过这个问题,在任何人将其标记为重复之前,请检查我到目前为止所做的事情..
这是我目前尝试过的方法。大多数这些解决方案都是从 Whosebug 中找到的。
private void saveFile(String filename, InputStream input) throws IOException
{
if (filename == null) {
return;
}
File file = new File(filename);
//*************** 1st *****************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
System.out.println("This is inputStream:"+stringFromInputStream);
FileUtils.writeStringToFile(file, StringFromInputStream);
//********************2nd **********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
byte[] aByte = StringFromInputStream.getBytes();
FileOutputStream fos=new FileOutputStream(file);
IOUtils.write(aByte, fos);
//*******************3rd**********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
byte[] aByte = StringFromInputStream.getBytes();
FileOutputStream fos=new FileOutputStream(file);
fos.write(aByte);
//*********************4th*********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
FileWriter fr=new FileWriter(file);
BufferedWriter br=new BufferedWriter(fr);
br.write(StringFromInputStream);
br.flush();
fr.flush();
br.close();
fr.close();
//*************5th**********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
Files.write(Paths.get(filename), StringFromInputStream.getBytes());
//************************6th**************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
FileUtils.writeStringToFile(file, StringFromInputStream);
//******************7th*********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);
printWriter.print(StringFromInputStream);
fileWriter.flush();
fileWriter.close();
//**********************8th*************************
final Path destination = Paths.get(filename);
try (
final InputStream in = input;
) {
Files.copy(in, destination,StandardCopyOption.REPLACE_EXISTING);
}
// ************* This one works but not for all(Sometimes creats a file with 0 bytes) ****************
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
BufferedInputStream bis = new BufferedInputStream(input);
int aByte;
while ((aByte = bis.read()) != -1) {
bos.write(aByte);
}
bos.flush();
fos.flush();
bos.close();
fos.close();
bis.close();
........
}
你的大部分方法损坏文件是因为你将InputStream读入一个String变量(二进制文件会被损坏)。试试这个实现:
byte[] aByte = IOUtils.toByteArray(input);
FileOutputStream fos=new FileOutputStream(file);
IOUtils.write(aByte, fos);
或
FileOutputStream fos=new FileOutputStream(file);
IOUtils.copy(input, fos);
我正在编写此方法,它将 InputStream 转换为文件,但该方法适用于某些输入但不适用于所有输入(当我将 zip 文件作为 InputStream 传递时它有效)。它只是创建一个 0 字节的文件。
我知道之前有人问过这个问题,在任何人将其标记为重复之前,请检查我到目前为止所做的事情..
这是我目前尝试过的方法。大多数这些解决方案都是从 Whosebug 中找到的。
private void saveFile(String filename, InputStream input) throws IOException
{
if (filename == null) {
return;
}
File file = new File(filename);
//*************** 1st *****************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
System.out.println("This is inputStream:"+stringFromInputStream);
FileUtils.writeStringToFile(file, StringFromInputStream);
//********************2nd **********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
byte[] aByte = StringFromInputStream.getBytes();
FileOutputStream fos=new FileOutputStream(file);
IOUtils.write(aByte, fos);
//*******************3rd**********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
byte[] aByte = StringFromInputStream.getBytes();
FileOutputStream fos=new FileOutputStream(file);
fos.write(aByte);
//*********************4th*********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
FileWriter fr=new FileWriter(file);
BufferedWriter br=new BufferedWriter(fr);
br.write(StringFromInputStream);
br.flush();
fr.flush();
br.close();
fr.close();
//*************5th**********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
Files.write(Paths.get(filename), StringFromInputStream.getBytes());
//************************6th**************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
FileUtils.writeStringToFile(file, StringFromInputStream);
//******************7th*********************
String stringFromInputStream = IOUtils.toString(input, "UTF-8");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);
printWriter.print(StringFromInputStream);
fileWriter.flush();
fileWriter.close();
//**********************8th*************************
final Path destination = Paths.get(filename);
try (
final InputStream in = input;
) {
Files.copy(in, destination,StandardCopyOption.REPLACE_EXISTING);
}
// ************* This one works but not for all(Sometimes creats a file with 0 bytes) ****************
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
BufferedInputStream bis = new BufferedInputStream(input);
int aByte;
while ((aByte = bis.read()) != -1) {
bos.write(aByte);
}
bos.flush();
fos.flush();
bos.close();
fos.close();
bis.close();
........
}
你的大部分方法损坏文件是因为你将InputStream读入一个String变量(二进制文件会被损坏)。试试这个实现:
byte[] aByte = IOUtils.toByteArray(input);
FileOutputStream fos=new FileOutputStream(file);
IOUtils.write(aByte, fos);
或
FileOutputStream fos=new FileOutputStream(file);
IOUtils.copy(input, fos);