16楼说的很清楚了。不是复制多余的文本。而是在倒数第二次读入的数据是a和v两个字节的数组。最后一次读入到数组里面因为只有一个a字节了,然后就在数组的第一位读入a,第二位不变,还是v。主要因为你在循环外面共用了一个数组。16楼每次都new一个数组,第二位不变的话就是0。这个跟长度有关系,但是设置更大的不能解决问题。 byte[] buffer = new byte[2]; int len = 0 ; while ((len = input.read(buffer,0,2))!=-1) { output1.write(buffer,0,len); } 一般都这样写的。2随便设置。len嘛就是读取到的长度。也就是说能读取多长,我就写入多长。不明白为什么没人这样写。
FileInputStream input=new FileInputStream("C:\\users\\auxu\\desktop\\a.txt");
FileOutputStream output1=new FileOutputStream("C:\\users\\auxu\\desktop\\c.txt");
byte[] buffer=new byte[2];
int i=0;
while(input.read(buffer)>0){
//input.read(buffer);
//System.out.println(buffer[0]+"\t"+buffer[1]);
output1.write(buffer);
System.out.println(++i);
}
FileInputStream input=new FileInputStream("C:\\users\\auxu\\desktop\\a.txt");
FileOutputStream output1=new FileOutputStream("C:\\users\\auxu\\desktop\\c.txt");
int i=0;
while(input.available()>0){
byte[] buffer=new byte[2];
input.read(buffer);
//System.out.println(buffer[0]+"\t"+buffer[1]);
output1.write(buffer);
System.out.println(++i);
}试下
关键是我对那个目标文件会产生多余字符的问题觉得很奇怪
This a testing file for copying files by javav
如果文件中字符串的长度不是读取字节数的倍数,编译器还是会帮你读取剩下不足的字节!因为你原文件中的字符串是单数,最后肯定有一个字节不够2 byte,那么会帮你读取你原文件中没有的字符也就是系统中有的吧,因此多读出来了一个!你把你原文件中的字符串最后减少一个,你看看目标文件中有没有多输出!!!应该是没有的,因为2 byte刚好读得完整,不需要额外读取了!
This a testing file for copying files by javav恩,看来是需要在下次读取的时候清理一下array
最后一次读的时候,buffer[0]读的还是a,而buffer[1]没有读到内容,所以它还是前一次读取到的值即:v改了之后,每次读的时候都重新new一个byte数组,所以不会出现没有读到内容,就使用上次读取的结果这样的情况。
FileInputStream input=new FileInputStream("C:\\users\\auxu\\desktop\\a.txt");
FileOutputStream output1=new FileOutputStream("C:\\users\\auxu\\desktop\\c.txt");
byte[] buffer=new byte[2];
int i=0;
int size = 0;
while(input.available()>0){
size = input.read(buffer);
//System.out.println(buffer[0]+"\t"+buffer[1]);
output1.write(buffer,0,size);
System.out.println(++i);
}这样就不会有这个问题的啊。
byte[] buffer = new byte[2];
int len = 0 ;
while ((len = input.read(buffer,0,2))!=-1)
{
output1.write(buffer,0,len);
}
一般都这样写的。2随便设置。len嘛就是读取到的长度。也就是说能读取多长,我就写入多长。不明白为什么没人这样写。