为了账号安全,请及时绑定邮箱和手机立即绑定

大神们,来新问题了

为什么这样可以复制成功文件但是字节数目却变了,如下
package InputStreamUtil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class InputRaderDemo {

	public static void main(String[] args) throws IOException {
		
		Long start = System.currentTimeMillis();
		File file = new File("G:/深渊党专属补丁套装/file.txt") ;
		File file1 = new File("G:/深渊党专属补丁套装/file1.txt") ;
		if(!file1.isFile()){
			file1.createNewFile();
		}
		InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file1));
	
		char []buffer = new char[8*1024];
		isr.read(buffer,0,buffer.length);
			String s = new String(buffer,0,buffer.length);
			System.out.println(s);
		
		osw.write(buffer,0,buffer.length);
		Long end = System.currentTimeMillis();
		isr.close();
		System.out.println("花费了"+(end - start)+"毫秒");
	}
}

而这样却只是创建了文件,而没有复制成功,如下

package InputStreamUtil;


import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;


public class InputRaderDemo {


public static void main(String[] args) throws IOException {

Long start = System.currentTimeMillis();

File file = new File("G:/深渊党专属补丁套装/file.txt") ;

File file1 = new File("G:/深渊党专属补丁套装/file1.txt") ;

if(!file1.isFile()){

file1.createNewFile();

}

InputStreamReader isr = new InputStreamReader(new FileInputStream(file));

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file1));

char []buffer = new char[8*1024];

int x ;

while((x = isr.read(buffer,0,buffer.length))!=-1){

String s = new String(buffer,0,buffer.length);

System.out.println(s);

   osw.write(buffer,0,x);

}

Long end = System.currentTimeMillis();

isr.close();

System.out.println("花费了"+(end - start)+"毫秒");

}

}

来吧,都来看看,共同进步

正在回答

1 回答

第一个问题:代码第30行,osw.write(buffer,0,buffer.length);这句话会把整个buffer数组里面的内容全部写到file1.txt中去。buffer数组的内容有两部分构成,一部分是在代码26行,通过输入流isr.read(buffer,0,buffer.length)读入的源文件内容,另一部分是buffer数组的剩余空间填充的无意义的内容(因为buffer数组比你的源文件要大,肯定有剩余空间)。所以在输出流写文件的时候,除了写入了源文件内容,还把buffer数组里面的剩余空间的那些东西也写进文件里面了。所以最终的结果就是file1.txt比file.txt的字节数要大


第二个问题:下面的代码确实是解决拷贝完文件,两个文件大小不一致的一个好的写法。但是之所以拷贝失败,是因为你没有关闭输出流而已。。。加上osw.close();即可。看来不关闭流会出现莫名其妙的问题,就是指的这个啊。

    public static void main(String[] args) throws IOException {
        Long start = System.currentTimeMillis();
        File file = new File("G:/深渊党专属补丁套装/file.txt") ;
        File file1 = new File("G:/深渊党专属补丁套装/file1.txt") ;

        if(!file1.isFile()) {
            file1.createNewFile();
        }

        InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file1));
        char []buffer = new char[8*1024];
        int x ;
        while((x = isr.read(buffer,0,buffer.length))!=-1) {
            String s = new String(buffer,0,buffer.length);
            System.out.println(s);
            osw.write(buffer,0,x);
        }

        Long end = System.currentTimeMillis();

        isr.close();
        osw.close();
        System.out.println("花费了"+(end - start)+"毫秒");
    }


2 回复 有任何疑惑可以回复我~
#1

怒放的生命012 提问者

非常感谢!
2016-07-02 回复 有任何疑惑可以回复我~
#2

怒放的生命012 提问者

非常感谢,刚开始确实没有发现问题,听你一说顿时清楚了,也明白了,关闭流的重要性
2016-07-02 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
文件传输基础——Java IO流
  • 参与学习       133755    人
  • 解答问题       1030    个

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

进入课程

大神们,来新问题了

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信