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();
}
}

解决方案 »

  1.   

    比较习惯这种:int i = -1;
    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();
      

  2.   

    byte[] buffer=new byte[1024];
    每次都是读取1024再写入,这会出现问题,假如最后一个循环他只读取到20个字节,这时候你写入的还是1024字节,其中有1004个字节是空字节。
      

  3.   


    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();
    这种的看着很简洁。
      

  4.   

    你的代码里面是公用同一个数组buffer,而程序开始的时候如果文件过大超过1024会直接执行fileOutputStream.flush();
    fileInputStream.read(buffer);//这里buffer被赋值了里面写满了数组
    fileOutputStream.write(buffer);
    当你数据少于1024时,buffer里面只有部分被覆盖了,其他都是以前的垃圾数据写入,所以文件写入之后变大了。