黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java的IO流讀寫文件需要注意的幾點

Java的IO流讀寫文件需要注意的幾點

更新時間:2020-08-24 16:55:32 來源:動力節點 瀏覽2156次

平時寫IO相關代碼機會挺少的,但卻都知道使用BufferedXXXX來讀寫效率高,沒想到里面還有這么多陷阱,這兩天突然被其中一個陷阱折騰一下:讀一個文件,然后寫到另外一個文件,前后兩個文件居然不一樣?

解決這個問題之后,總結了幾個注意點。

public?void?copyFile1()?{
		File?srcFile?=?new?File("E://atest//atest.txt");
		File?dstFile?=?new?File("E://btest//btest.txt");
		BufferedReader?in?=?null;
		BufferedWriter?out?=?null;
		try?{
			in?=?new?BufferedReader(new?FileReader(srcFile));
			out?=?new?BufferedWriter(new?FileWriter(dstFile));
			
			String?line?=?null;
			while((line?=?in.readLine())?!=?null)?{
				out.write(line+"/r/n");
			}
		}catch?(Exception?e)?{
			//?TODO:?handle?exception
			e.printStackTrace();
		}finally?{
			if(in?!=?null)?{
				try?{
					in.close();
				}catch?(Exception?e)?{
					//?TODO:?handle?exception
					e.printStackTrace();
				}
			}
			
			if(out?!=?null)?{
				try?{
					out.close();
				}catch?(Exception?e)?{
					//?TODO:?handle?exception
					e.printStackTrace();
				}
			}
		}

上面代碼使用BufferedReader一行一行地讀取一個文件,然后使用BufferedWriter把讀取到的數據寫到另外一個文件中。如果文件是ASCCII形式的,則內容還是能夠正確讀取的。但如果文件是二進制的,則讀寫后的文件與讀寫前是有很大區別的。當然,把上面的readLine()換成read(char[])仍然不能正確讀寫二進制文件的。讀寫二進制文件請接著看下面注意點。

注意點二:read(byte[]b,int offset,int length)中的offset不是指全文件的全文,而是字節數組b的偏移量

現在已經知道使用Reader/Writer不能正確讀取二進制文件,這是因為Reader/Writer是字符流,那就改用字節流ufferedInputStream/BufferedOutputStream,網上搜索到的例子大概是這樣的:

public?void?copyFile()?{
		File?srcFile?=?new?File("E://atest//atest.gif");
		File?dstFile?=?new?File("E://atest//btest.gif");
		BufferedInputStream?in?=?null;
		BufferedOutputStream?out?=?null;		
		try?{
			in?=?new?BufferedInputStream(new?FileInputStream(srcFile));
			out?=?new?BufferedOutputStream(new?FileOutputStream(dstFile));
			
			byte[]?b?=?new?byte[1024];
			while(in.read(b)?!=?-1)?{
				out.write(b);
			}
		}catch?(Exception?e)?{
			//?TODO:?handle?exception
			e.printStackTrace();
		}finally?{
			if(in?!=?null)?{
				try?{
					in.close();
				}catch?(Exception?e)?{
					//?TODO:?handle?exception
					e.printStackTrace();
				}
			}
			if(out?!=?null)?{
				try?{
					out.close();
				}catch?(Exception?e)?{
					//?TODO:?handle?exception
					e.printStackTrace();
				}
			}
		}
	}

每次讀1024字節,然后寫1024字節。這看似挺正確的,但實際寫出來的文件與原文件是不同的。這樣就懷疑可能是讀寫沒有接上,因而把代碼改成下面的形式:

byte[]?b?=?new?byte[1024];
			int?offset?=?0;
			int?length?=?-1;
			while((length?=?in.read(b,?offset,?1024))?!=?-1)?{
				out.write(b,?offset,?length);
				offset?+=?length;
			}

這是誤以為:先讀一段,寫一段,然后改變偏移量,然后使用新的偏移量再讀一段、寫一段,直到文件讀寫完畢。但這是錯誤的,因為使用BufferedXXX后,里面已經實現了這個過程。而read(byte[] b, int offset, int length)中的offset實際指的是把讀到的數據存入到數組b時,從數組的哪個位置(即offset)開始放置數據;同理,write(byte[] b, int offset, int length)就是把b中的數據,從哪個位置(offset)開始寫到文件中。

java的io流讀寫文件

以上就是動力節點java培訓機構的小編針對“Java的IO流讀寫文件需要注意的幾點”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 澳门一级毛片手机在线看 | 国产综合日韩伦理 | 亚洲国产亚洲综合在线尤物 | 国产特黄一级一片免费 | 一级黄色大片免费 | 黄视频网址 | 免费日韩毛片 | 欧美在线视频免费播放 | 韩剧伦理片在线观看 | 全免费a级毛片免费毛视频 全免费毛片在线播放 | 国产成人精品免费视频大全五级 | 成人福利免费观看体验区 | 国产精品久久久久影院色老大 | 成人综合在线视频免费观看 | 中文在线日韩 | 特大一级aaaaa毛片 | 77788色淫免费网站视频 | 在线观看一级毛片 | 一级黄色在线视频 | 久久久青草青青亚洲国产免观 | 午夜影湿院 | 国产欧美日韩专区 | 亚洲综合成人在线 | 国产成+人+综合+亚洲专 | 欧美午夜春性猛交xxxx | 亚洲欧美精品中文字幕 | h在线观看视频 | 久久久久国产精品免费免费 | 国产成人小视频在线观看 | 天堂网色| tk视频丨vk| 欧美性xxxx极品高清3d | 国产亚洲精品自在线亚洲情侣 | 天天澡天天摸天天爽免费 | 性欧美极品另类 | 国产91精品一区 | 中文字幕日韩精品中文区 | 亚洲欧洲日产国码久在线观看 | 黄色三级毛片网站 | 国产精品视频全国免费观看 | 亚洲人成网站色7799在线播放 |