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);
}
基于流(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();
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();
/**
* 描述:文件羡扮配上传
* @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;
}
}
一启仔汪次读4K在末尾可能会出问题.
is.read(buffer) 可能没读满, 然後当成有读满写出去悄仔.
建议先改成一次读一个byte试戚拆试看.
成功後再试一次读4K.