JAVA IO 问题

yinan9 2013-10-18 04:50:49
使用 FileInputStream 和 FileOutputStream 进行文件复制
出现一个奇怪的问题,请大家解释一下

源文件文本:
This is test file for copying files by java

目标文件文本:
This is test file for copying files by javav

代码如下

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.available()>0){
input.read(buffer);
//System.out.println(buffer[0]+"\t"+buffer[1]);
output1.write(buffer);
System.out.println(++i);


}


为什么目标文件的文本会多出一个v呢?
如果在声明buffer的时候长度设为64(或者更大的2的N次幂),文本就会正确拷贝,后面的长度以NULL补充
...全文
666 24 打赏 收藏 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
rumlee 2013-10-22
  • 打赏
  • 举报
回复
只学过java的程序员,对这些很难理解,如果你是一个c程序员,每次new一个字符串的时候都要初始化,不初始化每次都可能出现不一样的随机值。
寻找IT之路 2013-10-21
  • 打赏
  • 举报
回复
引用
倒数第二次读的时候,buffer[0]=a,buffer[1]=v, 最后一次读的时候,buffer[0]读的还是a,而buffer[1]没有读到内容,所以它还是前一次读取到的值即:v 改了之后,每次读的时候都重新new一个byte数组,所以不会出现没有读到内容,就使用上次读取的结果这样的情况。
A18767101172 2013-10-21
  • 打赏
  • 举报
回复
程序多运行几次,是不是除了v之外还可能出现别的字符的情况;或者你改一改条件,改成(String str = input.read())!=null;再试试
白开水MD5 2013-10-21
  • 打赏
  • 举报
回复
倒数第二次读的时候,buffer[0]=a,buffer[1]=v, 最后一次读的时候,buffer[0]读的还是a,而buffer[1]没有读到内容,所以它还是前一次读取到的值即:v 改了之后,每次读的时候都重新new一个byte数组,所以不会出现没有读到内容,就使用上次读取的结果这样的情况。
yinan9 2013-10-21
  • 打赏
  • 举报
回复
还有大神帮忙解释一下吗
kiddo_boy 2013-10-21
  • 打赏
  • 举报
回复
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嘛就是读取到的长度。也就是说能读取多长,我就写入多长。不明白为什么没人这样写。
yinan9 2013-10-21
  • 打赏
  • 举报
回复
引用 21 楼 rumlee 的回复:

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

这样就不会有这个问题的啊。
非常感谢!但是我仍然对buffer会复制多余的文本感到不解,能不能解释一下为什么会出现那样的情况?
rumlee 2013-10-21
  • 打赏
  • 举报
回复

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

这样就不会有这个问题的啊。
沧偕chillax 2013-10-21
  • 打赏
  • 举报
回复
引用 16 楼 a470577391 的回复:
倒数第二次读的时候,buffer[0]=a,buffer[1]=v, 最后一次读的时候,buffer[0]读的还是a,而buffer[1]没有读到内容,所以它还是前一次读取到的值即:v 改了之后,每次读的时候都重新new一个byte数组,所以不会出现没有读到内容,就使用上次读取的结果这样的情况。
完全正解啊。或者你把缓冲区的阀值设置大一点
yinan9 2013-10-21
  • 打赏
  • 举报
回复
引用 17 楼 A18767101172 的回复:
程序多运行几次,是不是除了v之外还可能出现别的字符的情况;或者你改一改条件,改成(String str = input.read())!=null;再试试
就只会出现v
ganshenml 2013-10-19
  • 打赏
  • 举报
回复
引用 13 楼 yinan9 的回复:
[quote=引用 8 楼 ganshenml 的回复:] 你一次读取两个字节,原文件中的字节数是否有计算? 如果文件中字符串的长度不是读取字节数的倍数,编译器还是会帮你读取剩下不足的字节! 因为你原文件中的字符串是单数,最后肯定有一个字节不够2 byte,那么会帮你读取你原文件中没有的字符也就是系统中有的吧,因此多读出来了一个! 你把你原文件中的字符串最后减少一个,你看看目标文件中有没有多输出!!!应该是没有的,因为2 byte刚好读得完整,不需要额外读取了!
我也是这儿理解的,但是怎么会读到v呢?[/quote]不够自己添加的!具体看它是怎么设置的!
yinan9 2013-10-19
  • 打赏
  • 举报
回复
引用 8 楼 ganshenml 的回复:
你一次读取两个字节,原文件中的字节数是否有计算? 如果文件中字符串的长度不是读取字节数的倍数,编译器还是会帮你读取剩下不足的字节! 因为你原文件中的字符串是单数,最后肯定有一个字节不够2 byte,那么会帮你读取你原文件中没有的字符也就是系统中有的吧,因此多读出来了一个! 你把你原文件中的字符串最后减少一个,你看看目标文件中有没有多输出!!!应该是没有的,因为2 byte刚好读得完整,不需要额外读取了!
我也是这儿理解的,但是怎么会读到v呢?
_come 2013-10-18
  • 打赏
  • 举报
回复
引用 7 楼 yinan9 的回复:
[quote=引用 4 楼 a470577391 的回复:]

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);
			
			
		}
试下
这个没有多余的字符“v”拷贝进来了,可以解释下这个问题吗?[/quote] 正解
java_皮皮 2013-10-18
  • 打赏
  • 举报
回复
传智播客2013年8月javaEE+物联云就业班分享:http://pan.baidu.com/s/11NOyJ
soton_dolphin 2013-10-18
  • 打赏
  • 举报
回复
引用 6 楼 yinan9 的回复:
[quote=引用 2 楼 soton_dolphin 的回复:]

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);
             
             
        }
copy出来文件中仍然会多出一个字符来 This a testing file for copying files by javav[/quote] 恩,看来是需要在下次读取的时候清理一下array
ganshenml 2013-10-18
  • 打赏
  • 举报
回复
以上纯属个人臆测,如有错误,多多海涵!
ganshenml 2013-10-18
  • 打赏
  • 举报
回复
你一次读取两个字节,原文件中的字节数是否有计算? 如果文件中字符串的长度不是读取字节数的倍数,编译器还是会帮你读取剩下不足的字节! 因为你原文件中的字符串是单数,最后肯定有一个字节不够2 byte,那么会帮你读取你原文件中没有的字符也就是系统中有的吧,因此多读出来了一个! 你把你原文件中的字符串最后减少一个,你看看目标文件中有没有多输出!!!应该是没有的,因为2 byte刚好读得完整,不需要额外读取了!
yinan9 2013-10-18
  • 打赏
  • 举报
回复
引用 4 楼 a470577391 的回复:

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);
			
			
		}
试下
这个没有多余的字符“v”拷贝进来了,可以解释下这个问题吗?
yinan9 2013-10-18
  • 打赏
  • 举报
回复
引用 2 楼 soton_dolphin 的回复:

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);
             
             
        }
copy出来文件中仍然会多出一个字符来 This a testing file for copying files by javav
yinan9 2013-10-18
  • 打赏
  • 举报
回复
引用 3 楼 huxiweng 的回复:
buffer调大一点啊。1024吧
嗯,我觉得buffer调大遇到更大的文件也会有这样的问题。 关键是我对那个目标文件会产生多余字符的问题觉得很奇怪
加载更多回复(4)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧