public static void main(String[] args) {
try{
byte[] buffer=new byte[1024];
FileInputStream fileInputStream=new FileInputStream(new File(args[0]));
FileOutputStream fileOutputStream=new FileOutputStream(new File(args[1]));
System.out.println(fileInputStream.available());
while(true){
if(fileInputStream.available()<1024){
int remain=-1;
while(((remain=fileInputStream.read())!=-1))
{
fileInputStream.read(buffer);
fileOutputStream.write(buffer);
}
break;//离开当前for while swtich
}
else{
fileOutputStream.flush();
fileInputStream.read(buffer);
fileOutputStream.write(buffer);
}
}
fileInputStream.close();
fileOutputStream.close();
System.out.println("复制完成");
}
catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println("USING 中文");
e.printStackTrace();
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
try{
byte[] buffer=new byte[1024];
FileInputStream fileInputStream=new FileInputStream(new File(args[0]));
FileOutputStream fileOutputStream=new FileOutputStream(new File(args[1]));
System.out.println(fileInputStream.available());
while(true){
if(fileInputStream.available()<1024){
int remain=-1;
while(((remain=fileInputStream.read())!=-1))
{
fileInputStream.read(buffer);
fileOutputStream.write(buffer);
}
break;//离开当前for while swtich
}
else{
fileOutputStream.flush();
fileInputStream.read(buffer);
fileOutputStream.write(buffer);
}
}
fileInputStream.close();
fileOutputStream.close();
System.out.println("复制完成");
}
catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println("USING 中文");
e.printStackTrace();
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
byte[] buffer=new byte[1024];FileInputStream fileInputStream=new FileInputStream(new File(args[0]));
FileOutputStream fileOutputStream=new FileOutputStream(new File(args[1]));while((i = fileInputStream.read(buffer,0,1024)) != -1) {
fileOutputStream.write(buffer,0,i);
}
...
close();
每次都是读取1024再写入,这会出现问题,假如最后一个循环他只读取到20个字节,这时候你写入的还是1024字节,其中有1004个字节是空字节。
while(((remain=fileInputStream.read())!=-1))
{
fileInputStream.read(buffer);
fileOutputStream.write(buffer);
}
这段代码有问题,.read()读取了一个字节然后在read(buffer)这里就少了一个byte,然后你的buffer数组里面不够1024位,多的是上次read的垃圾数据然后你都写入到文件里面了,肯定会多出来很多数据。改成这样既可int remain = -1;
while (((remain = fileInputStream.read(buffer)) != -1)) {
fileOutputStream.write(buffer,0,remain)
}
byte流不用显示调用flush。楼主这种循环第一次看到感觉很混乱byte[] byteArray = new byte[1024];
int temp = 0;
while((temp = fileStream.read(byteArray))!=-1){
System.out.println(temp);
fileOutStream.write(byteArray,0,temp);
}
fileStream.close();
fileOutStream.close();
这种的看着很简洁。
fileInputStream.read(buffer);//这里buffer被赋值了里面写满了数组
fileOutputStream.write(buffer);
当你数据少于1024时,buffer里面只有部分被覆盖了,其他都是以前的垃圾数据写入,所以文件写入之后变大了。