IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當前位置:首頁 > 學習資源 > 講師博文 > Java字節(jié)流使用方法

Java字節(jié)流使用方法 時間:2018-03-01      來源:未知

在java中我們使用輸入流來向一個字節(jié)序列對象中寫入,使用輸出流來向輸出其內容。C語言中只使用一個File包處理一切文件操作,而在java中卻有著60多種流類型,構成了整個流家族。看似龐大的體系結構,其實只要使用適合的方法將其分門別類,就顯得清晰明了了。而我準備將其按照處理文件類型的不同,分為字節(jié)流類型和字符流類型。

基類流

其實始終有人搞不清楚到底InputStream是讀還是OutputStream是讀。其實很簡單就可以記住,你把你自己想象為是一個程序,InputStream對你來說是輸入,也就是你要從某個地方讀到自己這來,而OutputStream對你來說就是輸出,也就是說你需要寫到某個地方。這樣就可以簡單的區(qū)分輸入輸出流。InputStream是一個輸入流,也就是用來讀取文件的流,抽象方法read讀取下一個字節(jié),當讀取到文件的末尾時候返回 -1。如果流中沒有數(shù)據(jù)read就會阻塞直至數(shù)據(jù)到來或者異常出現(xiàn)或者流關閉。這是一個受查異常,具體的調用者必須處理異常。除了一次讀取一個字節(jié),InputStream中還提供了read(byte[]),讀取多個字節(jié)。read(byte[])其實默認調用的還是read(byte b[], int off, int len)方法,表示每讀取一個字節(jié)就放在b[off++]中,總共讀取len個字節(jié),但是往往會出現(xiàn)流中字節(jié)數(shù)小于len,所以返回的是實際讀取到的字節(jié)數(shù)。

接下來是一些高級的用法,skip方法表示跳過指定的字節(jié)數(shù),來讀取。調用這種方法需要知道,一旦跳過就不能返回到原來的位置。當然,我們可以看到還有剩下的三種方法,他們一起合作實現(xiàn)了可重復讀的操作。mark方法在指定的位置打上標記,reset方法可以重新回到之前的標記索引處。但是我們可以想到,它一定是在打下mark標記的地方,使用字節(jié)數(shù)組記錄下接下來的路徑上的所有字節(jié)數(shù)據(jù),直到你使用了reset方法,取出字節(jié)數(shù)組中的數(shù)據(jù)供你讀取(實際上也不是一種能夠重復讀,只是用字節(jié)數(shù)組記錄下這一路上的數(shù)據(jù)而已,等到你想要回去的時候將字節(jié)數(shù)組給你重新讀取)。

OutputStream是一種輸出流,具體的方法和InputStream差不多,只是,一個讀一個寫。但是,他們都是抽象類,想要實現(xiàn)具體的功能還是需要依賴他們的子類來實現(xiàn),例如:FileInputStream/FileOutputStream等。

Java字節(jié)流

文件字節(jié)流

FileInputStream繼承與InputStream,主要有以下兩個構造方法:

public FileInputStream(String name)

public FileInputStream(File file)

第一種構造方法傳的是一個字符串,實際上是一個確定文件的路徑,內部將此路徑封裝成File類型,調用第二種構造方法。第二中構造方法,直接綁定的是一個具體的文件。FileInputStream 的內部方法其實和父類InputStream中定義的方法差不多,我們通過一個讀文件的實例來演示用法。

FileInputStream fin = new FileInputStream("hello.txt");

byte[] buffer = new byte[1024];

int x = fin.read(buffer,0,buffer.length);

String str = new String(buffer);

System.out.println(str);

System.out.println(x);

fin.close();

結果意料之中,調用了read方法將hello.txt中的內容讀到字節(jié)數(shù)組buffer中,然后通過String類構造方法將字節(jié)數(shù)組轉換成字符串。返回實際上讀取到的字節(jié)數(shù)13。(10個字母+兩個空格+一個字符串結束符)FileOutputStream繼承父類OutputStream,主要方法代碼如下:

private final boolean append;

public FileOutputStream(String name)

public FileOutputStream(String name, boolean append)

public FileOutputStream(File file)

public FileOutputStream(File file, boolean append)

private native void writeBytes(byte b[], int off, int len, boolean append)

public void write(byte b[]) throws IOException

FileOutputStream的一些基本的操作和FileInputStream類似,只是一個是讀一個是寫。我們主要要知道,append屬性是指定對于文件的操作是覆蓋方式(false),還是追加方式(true)。下面通過一個實例演示其用法:

FileOutputStream fou = new FileOutputStream("hello.txt");

String str = "Walker_YAM";

byte[] buffer = str.getBytes("UTF-8");

fou.write(buffer,0 ,buffer.length);

fou.close();

如我們所料,字符串"Walker_YAM"將會被寫入hello.txt,由于沒有指定append,所以將會覆蓋hello.txt中的所有內容。

動態(tài)字節(jié)數(shù)組流

在我們上述的文件讀取流中,我們定義 byte[] buffer = new byte[1024];,buffer數(shù)組為1024,如果我們將要讀取的文件中的內容有1025個字節(jié),buffer是不是裝不下?當然我們也可以定義更大的數(shù)組容量,但是從內存的使用效率上,這是低效的。我們可以使用動態(tài)的字節(jié)數(shù)組流來提高效率。

ByteArrayInputStream的內部使用了類似于ArrayList的動態(tài)數(shù)組擴容的思想。

protected byte buf[];

protected int count;

public ByteArrayInputStream(byte buf[])

public ByteArrayInputStream(byte buf[], int offset, int length)

public synchronized int read()

public synchronized int read(byte b[], int off, int len)

ByteArrayInputStream內部定義了一個buf數(shù)組和記錄數(shù)組中實際的字節(jié)數(shù),read方法也很簡單,讀取下一個字節(jié),read(byte b[], int off, int len) 將內置字節(jié)數(shù)組讀入目標數(shù)組。實際上,整個ByteArrayInputStream也就是將一個字節(jié)數(shù)組封裝在其內部。為什么這么做?主要還是為了方便參與整個InputStream的體系,復用代碼。ByteArrayOutputStream的作用要比ByteArrayInputStream更加的實際一點:

protected byte buf[];

protected int count;

public ByteArrayOutputStream() { this(32); }

public ByteArrayOutputStream(int size)

private void ensureCapacity(int minCapacity)

public synchronized void write(byte b[], int off, int len)

public synchronized void writeTo(OutputStream out)

public synchronized byte toByteArray()[]

public synchronized String toString()

和ByteArrayInputStream一樣,內部依然封裝了字節(jié)數(shù)組buf和實際容量count,通過構造方法可以指定內置字節(jié)數(shù)組的長度。主要的是write方法,將外部傳入的字節(jié)數(shù)組寫到內置數(shù)組中,writeTo方法可以理解為將自己內置的數(shù)組交給OutputStream 的其他子類使用。toByteArray和toString則會將內置數(shù)組轉換成指定類型返回。下面我們利用他們解決剛開始說的效率問題。

FileInputStream fin = new FileInputStream("hello.txt");

ByteArrayOutputStream bou = new ByteArrayOutputStream();

int x = 0;

while((x = fin.read()) !=-1){

bou.write(x);

}

System.out.println(bou.toString());

從hello文件中每讀取一個字節(jié)寫入ByteArrayOutputStream 中,我們不用擔心hello文件太大而需要設置較大的數(shù)組,使用ByteArrayOutputStream 動態(tài)增加容量,如果添加字節(jié)即將超過容量上限,進行擴充(往往是指數(shù)級擴充)

裝飾者字節(jié)流

上述的流都是直接通過操作字節(jié)數(shù)組來實現(xiàn)輸入輸出的,那如果我們想要輸入一個字符串類型或者int型或者double類型,那還需要調用各自的轉字節(jié)數(shù)組的方法,然后將字節(jié)數(shù)組輸入到流中。我們可以使用裝飾流,幫我們完成轉換的操作。我們先看DataOutputStream。

public DataOutputStream(OutputStream out)

public synchronized void write(byte b[], int off, int len)

public final void writeBoolean(boolean v)

public final void writeByte(int v)

public final void writeShort(int v)

public final void writeInt(int v)

public final void writeDouble(double v)

簡單的列舉了一些方法,可以看到,DataOutputStream只有一個構造方法,必須傳入一個OutputStream類型參數(shù)。(其實它的內部還是圍繞著OutputStream,只是在它的基礎上做了些封裝)。我們看到,有writeBoolean、writeByte、writeShort、writeDouble等方法。他們內部都是將傳入的 boolean,Byte,short,double類型變量轉換為了字節(jié)數(shù)組,然后調用從構造方法中接入的OutputStream參數(shù)的write方法。

緩沖流

在這之前,我們讀取一個字節(jié)就要將它寫會磁盤,這樣來回開銷很大,我們可以使用緩沖區(qū)來提高效率,在緩沖區(qū)滿的時候,或者流關閉時候,將緩沖區(qū)中所有的內容全部寫會磁盤。BufferedInputStream和BufferedOutputStream也是一對裝飾流,我們先看看BufferedInputStream:

private static int DEFAULT_BUFFER_SIZE = 8192;

protected volatile byte buf[];

protected int pos;

protected int count;

public BufferedInputStream(InputStream in)

public BufferedInputStream(InputStream in, int size)

public synchronized int read()

public synchronized void mark(int readlimit)

public synchronized void reset()

一樣也是裝飾類流,第一種構造方法要求必須傳入InputStream類型參數(shù),DEFAULT_BUFFER_SIZE 指定了默認的緩沖區(qū)的大小,當然還可以使用第二種構造方法指定緩沖區(qū)的大小(當然不能超過上界),read方法讀取的時候會將數(shù)據(jù)讀入內部的緩沖區(qū)中,當然緩沖區(qū)也是可以動態(tài)擴容的。

BufferedInputStream bi = new BufferedInputStream(new FileInputStream("hello.txt"));

bi.read();

bi.read();

bi.read();

bi.read();

System.out.println(bi.available());

BufferedOutputStream和它是逆操作,不在贅述。這種緩沖字節(jié)流可以很大程度上提高我們的程序執(zhí)行的效率,所以一般在使用別的流的時候都會包裝上這層緩沖流。

上一篇:三層架構實現(xiàn)Java Web案例

下一篇:java抽象類的作用

戳我查看嵌入式每月就業(yè)風云榜

點我了解華清遠見高校學霸學習秘籍

猜你關心企業(yè)是如何評價華清學員的

干貨分享
相關新聞
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2024 北京華清遠見科技發(fā)展有限公司 版權所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 黑料网 - 黑料大事记-黑料门 黑料社最新 今日黑料 热门黑料 最新反差免费-黑料网今日黑料首页_黑料网 - 黑料大事记-黑料门 黑料社最新 今日黑料 热门黑料 最新反差免费-黑料网今日黑料首页 | 康复器材,康复设备_常州市友邦医疗康复器材有限公司 | 河南省恒达锅炉制造有限公司 | 上海新航道学校官网_20年专注雅思_托福_SAT_ACT等出国语言培训机构. | 摩托车-摩托车配件-摩托车与配件_摩托车与配件行业权威的门户网站! | 塑料胶水|PVC胶水|PP胶水|橡胶胶水|强力胶水|透明胶水|胶粘剂|粘合剂|UV胶-聚力胶水厂家 | 金雷诺机柜,GLN机柜,户外机柜,电力机柜,服务器机柜 | 狠狠穞A片一區二區三區-免费网站在线观看人数更新时间-欧洲尺码日本尺码专线不卡顿,国产大尺度禁片未删减版,baomaav | 捷胜通运|超大件双清专线|欧美专线|订舱|订柜|订船|双清包税|纯电池运输|液体粉末专线| | 全彩LED显示屏厂家_室内户外电子屏-深圳华邦瀛光电有限公司 | 免费的PPT幻灯片演示制作软件,动画视频及课件制作软件 - Focusky万彩演示大师官网 | 无轴螺旋输送机_双无轴螺旋输送机_垃圾,污泥无轴螺旋输送机-新乡市大汉振动机械有限公司 | 久久黄色一级视频_视频一区精品自拍_理论片免费ā片在线观看_亚洲色视频在线播放网站_香港经典a毛片免费观看_亚州三级久久电影 | 污泥处理设备|污泥固化固液分离压泥机压滤机厂家-山东冠诚开山贸易 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 连云港机械手厂家_全自动焊接机械手_刀轴焊接机_智能轴类焊接机_连云港建博自动化设备有限公司 | 誉瑞仪器是全球知名检测仪器厂商RAE在华东地区的专业级产品销售及授权维修服务商- | 上海瀚广科技(集团)有限公司,上海瀚广,瀚广 | 合肥固化地坪-安徽耐磨地坪-合肥环氧地坪厂家-安徽玉平地坪工程有限公司 | 铜陵耐火砖|铜陵耐火浇注料|铜陵耐火材料|铜陵市金钟物资经营部【官网】 | 河北高新技术企业认定,沧州商标注册,沧州9001质量管理体系认证,沧州高新技术企业认定,沧州体系认证,沧州商标续展,沧州版权登记,河北国瑞企业管理咨询有限公司 | 苏州氮气弹簧厂家_江浙沪氮气弹簧价格_江苏氮气弹簧规格_BelleFlex碟形弹簧_昆山三虑五金机械有限公司 | 河南反渗透设备,河南纯净水设备,河南软化水设备,郑州EDI超纯水设备,郑州水处理设备厂家_河南江宇环保科技有限公司 | 万向轴承_福来轮_全向轮_双向转轮_万向球_算盘轮_塑料卷轴-宁津县正彤机械塑料有限公司 | 生态护坡砖_护坡砖_合肥植草砖-巢湖市华林新型建材有限公司 | 液压油缸生产厂家-常州辰佰液压机械有限公司 | 专业提供医疗器械,医疗设备,进口国产医疗设备,医疗耗材采购,医疗设备厂家等医疗器械信息-上海聚慕医疗器械有限公司 | 智慧环保大数据云平台_车载走航式扬尘/恶臭/噪声污染源在线监测管控信息系统平台_环保土壤/环境监测系统云平台-奥斯恩智能科技 | 康拓威技术(深圳)有限公司|Theia镜头代理商|安讯士AXIS摄像机|安讯士监控系统|博世BOSCH监控|博世会议系统|索尼SONY监控|松下PANASONIC监控|三星韩华SAMSUNG监控|霍尼韦尔Honeywell|海康|大华|华为监控|Theia无畸变镜头|AXIS监控|安讯视摄像机 | 西安生殖医学医院_陕西省老医协生殖医学医院【官方网站】 | 水处理设备厂家_纯净水设备_超纯水设备价格找西安瑞泉水处理 | 微米环境-餐厨/厨余/果蔬垃圾处理设备厂家-大型成套设备解决方案 | 英格索兰隔膜泵_ARO气动隔膜泵_英格索兰隔膜泵配件【原厂正品】连续五年无投诉_英格索兰隔膜泵代理-苏州瑞晟茂环保设备有限公司 印刷公司,北京印刷厂,宣传画册手册印刷厂-和智印彩页设计 | 心理咨询室设备_音乐放松椅_心理测评系统_情绪宣泄设备厂家 | 激光清洗机_激光除锈机_激光焊接机 - 上海锡昊激光科技有限公司 激光切管机_等离子切管机_相贯线切管机厂家|服务为先-山东美峰智能设备有限公司 | 直饮水设备-纯水设备-软化水设备 - 亿家清泉水处理设备厂家 | 武汉印刷厂_为企业提供宣传单页彩页印刷_武汉折页印刷_海报设计印刷与制作 - 武汉泽雅印刷公司 | 深圳专卖店设计,餐饮空间设计,酒店空间策划设计【左右高端人文空间设计公司】 | 气动球阀-气动蝶阀-电动蝶阀「厂家」-恒信流体控制有限公司 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 金属标牌,镍电铸,电铸铭牌,标牌定制-青岛大东电铸标牌制作厂家 |