開心一笑
【媽媽:“寶寶,你已經(jīng)四歲了击你,你可以自己睡了司训。”
孩子:“爸爸都那么大了独郎,為什么不自己睡踩麦?”】
視頻教程
大家好,我錄制的視頻《Java之優(yōu)雅編程之道》已經(jīng)在CSDN學(xué)院發(fā)布了氓癌,有興趣的同學(xué)可以購買觀看谓谦,相信大家一定會收獲到很多知識的。謝謝大家的支持……
視頻地址:http://edu.csdn.net/lecturer/994
提出問題
項目中IO流贪婉,序列化需要注意的幾點反粥???
解決問題
前言
在工作中才顿,寫IO流的代碼比較少莫湘,一般是在文件上傳,下載郑气,excel文件導(dǎo)入導(dǎo)出等等才會使用到幅垮。但是一旦系統(tǒng)在IO流出現(xiàn)問題,后果是不堪設(shè)想的尾组,可能會造成整個系統(tǒng)直接掛掉忙芒。因此,寫好IO流讳侨,序列號和反序列話就顯的尤為重要呵萨。
1.序列化類新增屬性時,請不要修改serialVersionUID字段避免反序列失敗
2.及時關(guān)閉流跨跨,先開后關(guān)潮峦,后開先關(guān)
我們在io操作完成后,需要及時關(guān)閉流釋放資源勇婴,因為這樣的對象不主動關(guān)閉忱嘹,將會占用系統(tǒng)資源,會增大系統(tǒng)的開銷咆耿。
@Override
public void downloadAttachment(SysAttachment sysAttachment, HttpServletRequest request, HttpServletResponse response) throws Exception {
//sysAttachmentService.download(attachmentId,request,response);
String fileName = sysAttachment.getName() + "." + sysAttachment.getType();
String dfileName = new String(fileName.getBytes("gb2312"), "iso8859-1");
String fullPath = sysAttachment.getPath();
//先開后關(guān)
OutputStream out = response.getOutputStream();
File file = new File(fullPath);
if (file.exists()) {
if(sysAttachment.getSubModule().equals("android")){
response.setContentType("application/vnd.androi3d.package-archive");
}
else {
response.setContentType("APPLICATION/OCTET-STREAM");
}
response.addHeader("Content-Disposition", "attachment;filename=" + dfileName);
//后開先關(guān)
FileInputStream in = null;
try {
out = response.getOutputStream();
in = new FileInputStream(fullPath);
byte[] b = new byte[1024];
int i = 0;
while ((i = in.read(b)) > 0) {
out.write(b, 0, i);
}
out.flush();
} finally {
if (in != null) {
in.close();
in = null;
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
out = null;
response.flushBuffer();
}
}
} else {
throw new ResourceNotFoundException("文件: \"" + fileName + "\"不存在!");
}
**3.文件中的分隔符使用類中常量 **
在window和linux中的分隔符等可能會不同德谅,使用類中的分割常量將會根據(jù)系統(tǒng)自動生成。如File.pathSeparator萨螺、File.separator等
4.盡量使用緩存流
在軟件系統(tǒng)中窄做,IO速度比內(nèi)存速度慢,IO讀寫在很多情況下會是系統(tǒng)的瓶頸慰技。
在java標準IO操作中椭盏,InputStream和OutputStream提供基于流的IO操作,以字節(jié)為處理單位吻商;Reader和Writer實現(xiàn)了Buffered緩存掏颊,以字符為處理單位。
從Java1.4開始艾帐,增加NIO(New IO)乌叶,增加緩存Buffer和通道Channel,以塊為處理單位柒爸,是雙向通道(可讀可寫准浴,類似RandomAccessFile),支持鎖和內(nèi)存映射文件訪問接口捎稚,大大提升了IO速度乐横。
java緩沖流本身不具IO功能求橄,只是在別的流上加上緩沖提高效率,像是為別的流裝上一種包裝葡公。當(dāng)對文件或其他目標頻繁讀寫或操作效率低罐农,效能差。這時使用緩沖流能夠更高效的讀寫信息催什。因為緩沖流先將數(shù)據(jù)緩存起來涵亏,然后一起寫入或讀取出來。所以說蛆楞,緩沖流還是很重要的溯乒,在IO操作時記得加上緩沖流提升性能夹厌。
緩沖流分為字節(jié)和字符緩沖流
- 字節(jié)緩沖流為:
BufferedInputStream—字節(jié)輸入緩沖流
BufferedOutputStream—字節(jié)輸出緩沖流
- 字符緩沖流為:
BufferedReader—字符輸入緩沖流
BufferedWriter—字符輸出緩沖流
下面主要介紹這四種緩沖流的使用豹爹。
一. 字節(jié)緩沖流
1.BufferedOutputStream—字節(jié)輸出緩沖流
BufferedOutputStream類實現(xiàn)緩沖的輸出了,通過設(shè)置這種輸出流矛纹,應(yīng)用程序就可以將各個字節(jié)寫入底層輸出流中臂聋,而不必每一個字節(jié)寫入都調(diào)用底層系統(tǒng)。
示例代碼:
public static void main(String[] args) {
try {
//創(chuàng)建字節(jié)輸出流實例
OutputStream out=new FileOutputStream("L:\\test.txt");
//根據(jù)字節(jié)輸出流構(gòu)建字節(jié)緩沖流
BufferedOutputStream buf=new BufferedOutputStream(out);
String data="好好學(xué)習(xí),天天向上";
buf.write(data.getBytes());//寫入緩沖區(qū)
buf.flush();//刷新緩沖區(qū)或南,即把內(nèi)容寫入
//關(guān)閉流
buf.close();//關(guān)閉緩沖流時,也會刷新一次緩沖區(qū)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
結(jié)束語
IO流 和 序列化反序列化的課程孩等,我們今天就講到這里。跟多深入的知識采够,大家可以查閱書籍等資料去學(xué)習(xí)肄方。
讀書感悟
來自七堇年《被窩是青春的墳?zāi)埂?/p>
- 被窩是青春的墳?zāi)埂?/li>
- 我生命中的溫暖就那么多,全部給了你蹬癌,叫我以后怎么再對別人微笑权她。
- 我們要有最樸素的生活,與最遙遠的夢想 逝薪。即使明日天寒地凍隅要,路遠馬亡。
- 生命若給我無數(shù)張臉董济,我永遠選擇最疼痛的一張去觸摸步清。
- 我知道有些人是無法忘記的,即使在你成長之初他們就已經(jīng)消失虏肾。但是他們被鐫刻在你的生命線上廓啊,無法磨滅。讓我們終其一生為了這些印記做兩件事情:懷念封豪,或者尋找谴轮。
- 無奈的是,語言這東西撑毛,在表達愛意的時候如此無力书聚;在表達傷害的時候唧领,卻又如此鋒利。
- 寂寞雌续,就是你有話說的時候沒人聽斩个,有人聽的時候你卻無話可說。
經(jīng)典故事
【有一個歐巴桑在首飾店里看到二只一模一樣的手環(huán)驯杜。
一個標價五百五十元受啥,另一個卻只標價二百五十元。
她大為心喜鸽心,立刻買下二百五十元的手環(huán)滚局,得意洋洋的走出店門。
臨出去前顽频,聽到里面的店員悄悄對另一個店員說:「看吧藤肢,這一招屢試不爽。
(學(xué)習(xí)啦:試探如餌糯景,可以輕而易舉的使許多人顯露出貪婪的本性嘁圈,然而那常常是吃虧受騙的開始。)】
大神文章
無
其他
如果有帶給你一絲絲小快樂蟀淮,就讓快樂繼續(xù)傳遞下去最住,歡迎點贊、頂怠惶、歡迎留下寶貴的意見涨缚、多謝支持!