最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

java文件字節(jié)流和字節(jié)緩沖流

2022-08-21 09:18 作者:虛云幻仙  | 我要投稿

/**
* 測試文件字節(jié)輸入流和文件字節(jié)輸出流
* FileInputStream/FileOutputStream是以字節(jié)為單位存取文件,可用于存取二進(jìn)制文件(圖片、視頻)和文本文件等,當(dāng)存取文本文件時(shí),由于每次只存取1byte內(nèi)容即8位二進(jìn)制數(shù),所顯示的字符僅能對應(yīng)0-255即ASCII碼的部分
* 對于文本文件使用字符流Reader/Writer可以支持unicode字符集
*/

public class TestFileStream {
? ?public static void main(String[] args) {
? ? ? ?long startTime = System.currentTimeMillis();
? ? ? ?try (FileInputStream fis = new FileInputStream("iostream/a.jpg");FileOutputStream fos = new FileOutputStream("iostream/c.jpg")){
? ? ? ? ? ?//創(chuàng)建文件字節(jié)輸入流對象,需要傳入相對路徑/絕對路徑,當(dāng)沒有找到該文件時(shí)會報(bào)異常
? ? ? ? ? ?//try-with-resource在try()內(nèi)用;號隔開多個(gè)聲明

? ? ? ? ? ?for (int i = fis.read();i!=-1;i = fis.read()){
? ? ? ? ? ? ? ?fos.write(i);
? ? ? ? ? ?}
? ? ? ? ? ?fos.flush();
? ? ? ? ? ?//.flush()方法使已緩存的字節(jié)bytes立刻寫入到目的地,如果目的地是底層操作系統(tǒng)的抽象abstraction比如文件file,則僅能將已緩存的字節(jié)傳遞給操作系統(tǒng)
? ? ? ? ? ?//.flush()的作用只是使寫入操作更優(yōu)先執(zhí)行,不使用flush程序也會完成寫入

? ? ? ?}catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?//文件的存儲都是使用二進(jìn)制實(shí)現(xiàn)的,所以即便是文本文件,每一個(gè)字符也是使用字節(jié)存儲的,所以read()方法返回的是字節(jié)即8位二進(jìn)制數(shù),這一步是沒有經(jīng)過任何解碼的,僅是將8位二進(jìn)制數(shù)轉(zhuǎn)化為int顯示出來,至于讀出的字節(jié)如何解釋、以及一個(gè)基礎(chǔ)單元是由幾個(gè)字節(jié)組成,都是在數(shù)據(jù)本身之外規(guī)定的
? ? ? ?long endTime = System.currentTimeMillis();
? ? ? ?System.out.println(endTime-startTime);
? ? ? ?//耗時(shí)3183ms
? ? ? ?//讀一個(gè)字節(jié)寫一個(gè)字節(jié)的方式需要頻繁調(diào)用io操作,io設(shè)備的速度相比cpu和內(nèi)存慢的多,頻繁調(diào)用會使程序頻繁等待io的響應(yīng)造成耗時(shí)


? ? ? ?startTime = System.currentTimeMillis();
? ? ? ?byte[] buffer = new byte[1024];
? ? ? ?//創(chuàng)建一個(gè)緩沖區(qū)用來緩存read()的字節(jié),每讀取1024字節(jié)即1kb后執(zhí)行一次write()
? ? ? ?try (FileInputStream fis = new FileInputStream("iostream/a.jpg");FileOutputStream fos = new FileOutputStream("iostream/b.jpg")){
? ? ? ? ? ?for (int len = fis.read(buffer);len!=-1;len = fis.read(buffer)){
? ? ? ? ? ? ? ?//.read(byte[])也會返回int,返回的數(shù)值為讀取到byte[]數(shù)組中字節(jié)的數(shù)量,當(dāng)文件沒有讀完時(shí)會將數(shù)組填滿返回buffer.length(),當(dāng)徹底讀完會返回-1,當(dāng)讀了一部分將文件讀完時(shí)返回實(shí)際讀取到的數(shù)量
? ? ? ? ? ? ? ?fos.write(buffer,0,len);
? ? ? ? ? ? ? ?//.write(byte b[],int off,int len) ,off即offset偏移量,從0位開始寫,寫入長度為數(shù)組實(shí)際存放bytes的長度
? ? ? ? ? ?}
? ? ? ? ? ?fos.flush();
? ? ? ?}catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?endTime = System.currentTimeMillis();
? ? ? ?System.out.println(endTime-startTime);
? ? ? ?//耗時(shí)6ms

? ? ? ?startTime = System.currentTimeMillis();
? ? ? ?try (FileInputStream fis = new FileInputStream("iostream/a.jpg");FileOutputStream fos = new FileOutputStream("iostream/d.jpg")){
? ? ? ? ? ?buffer = new byte[fis.available()];
? ? ? ? ? ?//.available()返回當(dāng)前讀取的剩余部分的預(yù)估長度,當(dāng)前沒有讀取過所以返回的是文件大小/總長度的預(yù)估
// ? ? ? ? ? ?System.out.println(buffer.length);
? ? ? ? ? ?//長度為517741
// ? ? ? ? ? ?System.out.println(new File("iostream/a.jpg").length());
? ? ? ? ? ?//長度為517741
? ? ? ? ? ?fis.read(buffer);
? ? ? ? ? ?fos.write(buffer);
? ? ? ? ? ?fos.flush();
? ? ? ?}catch (Exception e ){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?endTime = System.currentTimeMillis();
? ? ? ?System.out.println(endTime-startTime);
? ? ? ?//耗時(shí)2ms
? ? ? ?//將文件一口氣完全讀取到內(nèi)存,再一次性寫入到目的地,這樣做時(shí)間成本比分段拷貝更快,但需要占用更多內(nèi)存,當(dāng)文件過大時(shí)無法使用


? ? ? ?startTime = System.currentTimeMillis();
? ? ? ?try (FileInputStream fis = new FileInputStream("iostream/a.jpg");
? ? ? ? ? ? FileOutputStream fos = new FileOutputStream("iostream/e.jpg");
? ? ? ? ? ? BufferedInputStream bis = new BufferedInputStream(fis);
? ? ? ? ? ? BufferedOutputStream bos = new BufferedOutputStream(fos)){
? ? ? ? ? ?//BufferedInputStream/BufferedOutputStream緩沖字節(jié)流,內(nèi)置了緩沖數(shù)組byte[8192],不能直接連接數(shù)據(jù)源,用來包裝節(jié)點(diǎn)流或其他流,屬于處理流,將節(jié)點(diǎn)流傳入構(gòu)造器中,通過緩沖流對象調(diào)用讀寫方法
? ? ? ? ? ?for (int nextB = bis.read();nextB!=-1;nextB = bis.read()){
? ? ? ? ? ? ? ?bos.write(nextB);
? ? ? ? ? ? ? ?//不需要傳入數(shù)組,bis將文件內(nèi)容讀到內(nèi)置的數(shù)組中,每次.read()返回的是數(shù)組中緩存的下一個(gè)字節(jié),如果沒讀完返回0-255,如果讀完了即之后沒有內(nèi)容了返回-1
????????????????//bos.write(int)會將字節(jié)存到bos內(nèi)置的數(shù)組中,當(dāng)數(shù)組滿了或其他調(diào)用了flush的情況下會執(zhí)行數(shù)組的寫入.write(byte[],offset,len)

? ? ? ? ? ?}
? ? ? ? ? ?bos.flush();
? ? ? ? ? ?//對執(zhí)行寫入的對象調(diào)用flush
? ? ? ?}catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?endTime = System.currentTimeMillis();
? ? ? ?System.out.println(endTime-startTime);
? ? ? ?//結(jié)果22ms

? ?}
}

class CopyTool{
? ?//自定義拷貝工具類
? ?public static void copySrcToDes(String src,String des){
? ? ? ?//src數(shù)據(jù)源,des目的地
? ? ? ?FileInputStream fis = null;
? ? ? ?FileOutputStream fos = null;
? ? ? ?BufferedInputStream bis = null;
? ? ? ?BufferedOutputStream bos = null;
? ? ? ?try {
? ? ? ? ? ?fis = new FileInputStream(src);
? ? ? ? ? ?bis = new BufferedInputStream(fis);
? ? ? ? ? ?//先實(shí)例化節(jié)點(diǎn)流,再將節(jié)點(diǎn)流傳給處理流構(gòu)造器
? ? ? ? ? ?fos = new FileOutputStream(des);
? ? ? ? ? ?bos = new BufferedOutputStream(fos);

? ? ? ? ? ?for (int next = bis.read();next!=-1;next = bis.read()){
? ? ? ? ? ? ? ?bos.write(next);
? ? ? ? ? ?}
? ? ? ? ? ?bos.flush();
? ? ? ? ? ?System.out.println("拷貝完成");
? ? ? ?}catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}finally {
? ? ? ? ? ?try {
? ? ? ? ? ? ? ?if (bos != null) {
? ? ? ? ? ? ? ? ? ?bos.close();
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?if (fos != null) {
? ? ? ? ? ? ? ? ? ?fos.close();
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?//后進(jìn)先出
? ? ? ? ? ? ? ?if (bis != null) {
? ? ? ? ? ? ? ? ? ?bis.close();
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?if (fis != null) {
? ? ? ? ? ? ? ? ? ?fis.close();
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}catch (Exception e){
? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ?}
? ? ? ?}
? ?}

? ?public static void main(String[] args) {
? ? ? ?CopyTool.copySrcToDes("iostream/a.jpg","iostream/f.jpg");
? ?}
}

java文件字節(jié)流和字節(jié)緩沖流的評論 (共 條)

分享到微博請遵守國家法律
陵川县| 浠水县| 昭觉县| 洛浦县| 乌恰县| 东丰县| 长垣县| 宁海县| 上思县| 三明市| 安乡县| 江西省| 青铜峡市| 林甸县| 涡阳县| 临武县| 泗水县| 惠水县| 界首市| 鄂伦春自治旗| 徐闻县| 新营市| 如皋市| 威宁| 弥勒县| 双桥区| 嘉荫县| 承德市| 黄山市| 望谟县| 兴国县| 平江县| 华池县| 岳普湖县| 沙坪坝区| 鹤壁市| 类乌齐县| 福建省| 和硕县| 陵水| 贡觉县|