java如何将一个InputStream写入文件啊?

public File file_put_contents(String file_name,InputStream is){
File file=new File(file_name);
OutputStream os=null;
try{
os=new FileOutputStream(file);
byte buffer[]=new byte[4*1024];
while((is.read(buffer))!=-1){
os.write(buffer);
}
os.flush();
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
os.close();
}
catch(Exception e){
e.printStackTrace();
}
}
return file;
}

方法没有报错,可是写的文件和原来不一样,导致不能用,如视频不能播放,原来是可以播放的。

while((is.read(buffer))!=-1){
os.write(buffer);
}
这几行有问题,,,is.read(buffer)方法的返回值表示读取的有效字节数,你的buffer数组长度是4*1024,但是每次读取不可能都是这么多字节,而os.write(buffer);则是每次都是写入4*1024个字节,所以新的文件肯定比旧的文件大,,,,改写方法如下:
int len = 0;
while((len = is.read(buffer)) != -1)
{
os.write(buffer,0,len);

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-27

基于流(Stream)的解决

    流是单向的有方向性的描述信息流的对象,InputStream是输入流的接口,对程序来说是入,是读,可以从文件读,缓存区读,网络节点读等等.

    写入文件,对程序来说是出,是写,就是FileOutputStream,可以写入int也可以byte[]

所以解决方案就是从InputStream中读出内存到byte[]中然后,使用FileOutputStream写入文件中.比如:其中一种写法

InputStream is = new FileInputStream("a.txt");

FileOutputStream fos = new FileOutputStream("b.txt");

byte[] b = new byte[1024];

while((is.read(b)) != -1){

fos.write(b);

}

is.close();

fos.close();

第2个回答  2018-03-31

java通过InputStream读取和写入文件操作实例代码

1. File to InputStream

File file = new File("file.xml");
InputStream inputStream = new FileInputStream(file);

2.InputStream to File

InputStream inputStream = new FileInputStream("file.xml");

OutputStream  outputStream = new FileOutputStream("file-new.xml");

int bytesWritten = 0;
int byteCount = 0;

byte[] bytes = new byte[1024];

while ((byteCount = inputStream.read(bytes)) != -1)
{
outputStream.write(bytes, bytesWritten, byteCount);
bytesWritten += byteCount;
}
inputStream.close();
outputStream.close();

本回答被网友采纳
第3个回答  2012-07-06
/**
* 描述:文件上传
* @param cFile CommonsMultipartFile
* @param dirPath String 保存文件夹的文件夹+文件名(不加后缀)
* @return String 文件名称
*/
public static String fileUpLoad(CommonsMultipartFile cFile,String dirPath,ServletContext servletContext){

String fileName=dirPath.substring(dirPath.lastIndexOf("/"),dirPath.length());

dirPath = dirPath.substring(0,dirPath.lastIndexOf("/"));

if(!cFile.isEmpty()){
File dir = new File(dirPath);

if(!dir.exists()){

boolean flag = dir.mkdirs();

}

String ext = cFile.getFileItem().getName();

ext=ext.substring(ext.lastIndexOf("."),ext.length());

String srcFile = dirPath + "/" + fileName + ext;

//String destFile = null;
File file = new File(srcFile);

try{

cFile.getFileItem().write(file);//将上传的文件写入文件夹中

fileName = file.getName();

return fileName;

}catch (Exception e) {

e.printStackTrace();

return null;

}

}else {

return null;

}

}
第4个回答  2012-07-06
一次读4K在末尾可能会出问题.
is.read(buffer) 可能没读满, 然後当成有读满写出去.
建议先改成一次读一个byte试试看.
成功後再试一次读4K.
相似回答