亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

大神們,來新問題了

為什么這樣可以復制成功文件但是字節數目卻變了,如下
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();即可??磥聿魂P閉流會出現莫名其妙的問題,就是指的這個啊。

????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流
  • 參與學習       133821    人
  • 解答問題       1060    個

為您介紹IO流的使用,以及對象的序列化和反序列化的內容

進入課程

大神們,來新問題了

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號