日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java使用FileInputStream流讀取文件示例詳解

瀏覽:23日期:2022-08-28 17:06:58

一、File流概念

JAVA中針對文件的讀寫操作設(shè)置了一系列的流,其中主要有FileInputStream,FileOutputStream,FileReader,FileWriter四種最為常用的流

二、FileInputStream

1)FileInputStream概念

FileInputStream流被稱為文件字節(jié)輸入流,意思指對文件數(shù)據(jù)以字節(jié)的形式進(jìn)行讀取操作如讀取圖片視頻等

2)構(gòu)造方法

2.1)通過打開與File類對象代表的實際文件的鏈接來創(chuàng)建FileInputStream流對象

public FileInputStream(File file) throws FileNotFoundException{}

若File類對象的所代表的文件不存在;不是文件是目錄;或者其他原因不能打開的話,則會拋出FileNotFoundException

/** * * 運行會產(chǎn)生異常并被撲捉--因為不存在xxxxxxxx這樣的文件 */public static void main(String[] args) { File file=new File('xxxxxxxx'); //根據(jù)路徑創(chuàng)建File類對象--這里路徑即使錯誤也不會報錯,因為只是產(chǎn)生File對象,還并未與計算機(jī)文件讀寫有關(guān)聯(lián) try { FileInputStream fileInputStream=new FileInputStream(file);//與根據(jù)File類對象的所代表的實際文件建立鏈接創(chuàng)建fileInputStream對象 } catch (FileNotFoundException e) { System.out.println('文件不存在或者文件不可讀或者文件是目錄'); } }

2.2)通過指定的字符串參數(shù)來創(chuàng)建File類對象,而后再與File對象所代表的實際路徑建立鏈接創(chuàng)建FileInputStream流對象

public FileInputStream(String name) throws FileNotFoundException

通過查看源碼,發(fā)現(xiàn)該構(gòu)造方法等于是在第一個構(gòu)造方法的基礎(chǔ)上進(jìn)行延伸的,因此規(guī)則也和第一個構(gòu)造方法一致

public FileInputStream(String name) throws FileNotFoundException { this(name != null ? new File(name) : null); }

2.3)該構(gòu)造方法沒有理解---查看api是指使用的fdObj文件描述符來作為參數(shù),文件描述符是指與計算機(jī)系統(tǒng)中的文件的連接,前面兩個方法的源碼中最后都是利用文件描述符來建立連接的

public FileInputStream(FileDescriptor fdObj)

3)FileInputStream常用API

3.1)從輸入流中讀取一個字節(jié)返回int型變量,若到達(dá)文件末尾,則返回-1

public int read() throws IOException

理解讀取的字節(jié)為什么返回int型變量

1、方法解釋中的-1相當(dāng)于是數(shù)據(jù)字典告訴調(diào)用者文件已到底,可以結(jié)束讀取了,這里的-1是Int型

2、那么當(dāng)文件未到底時,我們讀取的是字節(jié),若返回byte類型,那么勢必造成同一方法返回類型不同的情況這是不允許的

3、我們讀取的字節(jié)實際是由8位二進(jìn)制組成,二進(jìn)制文件不利于直觀查看,可以轉(zhuǎn)成常用的十進(jìn)制進(jìn)行展示,因此需要把讀取的字節(jié)從二進(jìn)制轉(zhuǎn)成十進(jìn)制整數(shù),故返回int型

4、 因此結(jié)合以上3點,保證返回類型一致以及直觀查看的情況,因此該方法雖然讀取的是字節(jié)但返回int型

read方法讀取實例--最后輸出內(nèi)容和字符內(nèi)容一致是123

package com.test; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException; public class FileStream{ /** * * */ public static void main(String[] args) { //建立文件對象 File file=new File('C:UsersAdministratorDesktop1.txt'); try { //建立鏈接 FileInputStream fileInputStream=new FileInputStream(file); int n=0; StringBuffer sBuffer=new StringBuffer(); while (n!=-1) //當(dāng)n不等于-1,則代表未到末尾 {n=fileInputStream.read();//讀取文件的一個字節(jié)(8個二進(jìn)制位),并將其由二進(jìn)制轉(zhuǎn)成十進(jìn)制的整數(shù)返回char by=(char) n; //轉(zhuǎn)成字符sBuffer.append(by); } System.out.println(sBuffer.toString()); } catch (FileNotFoundException e) { System.out.println('文件不存在或者文件不可讀或者文件是目錄'); } catch (IOException e) { System.out.println('讀取過程存在異常'); } } }

3.2)從輸入流中讀取b.length個字節(jié)到字節(jié)數(shù)組中,返回讀入緩沖區(qū)的總字節(jié)數(shù),若到達(dá)文件末尾,則返回-1

public int read(byte[] b) throws IOException

1. 我們先設(shè)定一個緩沖區(qū)即字節(jié)數(shù)組用于存儲從流中讀取的字節(jié)數(shù)據(jù),該數(shù)組的長度為N

2. 那么就是從流中讀取N個字節(jié)到字節(jié)數(shù)組中。但是注意返回的是讀入的總字節(jié)數(shù)而并不是N,說明有的時候?qū)嶋H讀入的總字節(jié)數(shù)不一定等于數(shù)組的長度

3. 文件的內(nèi)容是12345.那么流中一共有5個字節(jié),但是我們設(shè)定的字節(jié)數(shù)組長度為2.那么會讀取幾次?每次情況是怎么樣的?

public class FileStream{ public static void main(String[] args) { //建立文件對象 File file=new File('C:UsersAdministratorDesktop1.txt'); try { //建立鏈接 FileInputStream fileInputStream=new FileInputStream(file); int n=0; byte[] b=new byte[2]; int i=0; while (n!=-1) //當(dāng)n不等于-1,則代表未到末尾 {n=fileInputStream.read(b);//返回實際讀取到字節(jié)數(shù)組中的字節(jié)數(shù)System.out.println(n); System.out.println(Arrays.toString(b)); //讀取后的字節(jié)數(shù)組內(nèi)容i++;System.out.println('執(zhí)行次數(shù):'+i); } System.out.println(new String(b)); } catch (FileNotFoundException e) { System.out.println('文件不存在或者文件不可讀或者文件是目錄'); } catch (IOException e) { System.out.println('讀取過程存在異常'); } } }

實際執(zhí)行結(jié)果如下:

Java使用FileInputStream流讀取文件示例詳解

可以看出,數(shù)組長度為2,因此第一次讀取2個字節(jié)到數(shù)組中,數(shù)組已經(jīng)被填滿。流中還剩余3個字節(jié)繼續(xù)讀取

第二次讀取,仍然讀取2個字節(jié)到數(shù)組中,數(shù)組內(nèi)容被替換。此時流中只剩余1個字節(jié),根據(jù)API說明,讀取數(shù)組長度(2)個字節(jié)到數(shù)組中,但接下來已經(jīng)無法繼續(xù)讀取2個字節(jié)了, 是否就應(yīng)該停止了?

實際過程中并未停止,而是進(jìn)行了第三次讀取,只讀取了剩余1個字節(jié),并頂替到了數(shù)組的0下標(biāo)位置中。

接下來第4次讀取,才發(fā)現(xiàn)移到末尾,而后返回-1.停止讀取

所以此處存疑-----為什么當(dāng)剩余只有1個字節(jié),而要求是讀取2個字節(jié)時,還可以繼續(xù)讀取?

那么我們查看此方法源碼,發(fā)現(xiàn)其本質(zhì)是調(diào)用的其它方法readBytes(b, 0, b.length);

public int read(byte b[]) throws IOException { return readBytes(b, 0, b.length); }

繼續(xù)查看readBytes(b, 0, b.length)方法是native方法代表該方法是有實現(xiàn)體的但不是在JAVA語言中實現(xiàn)的導(dǎo)致沒辦法看具體實現(xiàn)

但是可以理解參數(shù)b是我們設(shè)置的數(shù)組,0是int型,最后一個參數(shù)是數(shù)組的長度

private native int readBytes(byte b[], int off, int len) throws IOException;

那么我們查看FileInputStream的父類InputStream,發(fā)現(xiàn)有關(guān)于這個方法的實現(xiàn),

我們現(xiàn)在考慮第三次讀取的時候方法執(zhí)行情況,此時b是[51,52].off 是0,len是2。數(shù)據(jù)流中就只有一個字節(jié)存在了

if else if的這個條件判斷發(fā)現(xiàn)都不符合,繼續(xù)往下執(zhí)行。

read()--該方法代表從流中讀取一個字節(jié),而流中此時剛好還有一個字節(jié)存在,該方法執(zhí)行沒有問題。返回值為53

繼續(xù)往下執(zhí)行發(fā)現(xiàn)b[0]=(byte)53.也就是將讀取到的int型轉(zhuǎn)為字節(jié)并存儲在數(shù)組中的第一個位置,此時數(shù)組內(nèi)容為[53,52]

繼續(xù)執(zhí)行進(jìn)入for循環(huán),此時流中已沒有字節(jié),那么read()方法返回未-1退出循環(huán)。返回變量i的值即是1.

也就是此次方法執(zhí)行讀取了1個字節(jié)到數(shù)組中。且讀取到了文件的末尾,因此第4次執(zhí)行的時候到int c=read()方法時就已經(jīng)返回-1,并沒有替換數(shù)組中的值了

public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; }

讀取過程圖解:

Java使用FileInputStream流讀取文件示例詳解

4. 假設(shè)流中一共有5個字節(jié),但是我們設(shè)定的字節(jié)數(shù)組長度為10,那么讀取幾次?每次情況是怎么樣的?

public class FileStream{ public static void main(String[] args) { //建立文件對象 File file=new File('C:UsersAdministratorDesktop1.txt'); try { //建立鏈接 FileInputStream fileInputStream=new FileInputStream(file); int n=0; byte[] b=new byte[10]; int i=0; while (n!=-1) //當(dāng)n不等于-1,則代表未到末尾 {n=fileInputStream.read(b);//返回實際讀取到字節(jié)數(shù)組中的字節(jié)數(shù)System.out.println(n); System.out.println(Arrays.toString(b)); //讀取后的字節(jié)數(shù)組內(nèi)容i++;System.out.println('執(zhí)行次數(shù):'+i); } System.out.println(new String(b)); } catch (FileNotFoundException e) { System.out.println('文件不存在或者文件不可讀或者文件是目錄'); } catch (IOException e) { System.out.println('讀取過程存在異常'); } } }

執(zhí)行結(jié)果如下:

Java使用FileInputStream流讀取文件示例詳解

結(jié)合上面提到的源碼我們可以發(fā)現(xiàn),源碼中的for循環(huán),盡管len是10(數(shù)組長度),但是當(dāng)i=5時,流中的字節(jié)已經(jīng)讀取完畢,指針移到文件的末尾,因此不會繼續(xù)執(zhí)行for循環(huán)。并且返回5,剛好符合結(jié)果中第一次實際讀取5個字節(jié)到數(shù)組中。第二次讀取時指針已到末尾。因此int c = read()這里返回-1。就已經(jīng)結(jié)束了方法,并沒有改變數(shù)組也沒有再次for循環(huán)

但是這種情況存在一個問題:即數(shù)組中有5個位置被浪費了,并沒有任何數(shù)據(jù)在里面

具體讀取圖解:

Java使用FileInputStream流讀取文件示例詳解

結(jié)合以上兩種情況,那么發(fā)現(xiàn)在使用read(byte b[])方法時的數(shù)組長度至關(guān)重要,若長度小于流的字節(jié)長度,那么最后得出的內(nèi)容會出現(xiàn)丟失。若大于流的字節(jié)長度,那么最后數(shù)組的內(nèi)存就浪費了,那么就需要根據(jù)文件的字節(jié)長度來設(shè)置數(shù)組的長度

byte[] b=new byte[(int) file.length()];

3.3)從輸入流中讀取最多l(xiāng)en個字節(jié)到字節(jié)數(shù)組中(從數(shù)組的off位置開始存儲字節(jié)),當(dāng)len為0時則返回0,如果len不為零,則該方法將阻塞,直到某些輸入可用為止--此處存疑

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

源碼如下

public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; }

3.4)關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源---即釋放與實際文件的連接(查看源碼可發(fā)現(xiàn)有同步鎖鎖住資源,因此關(guān)閉流釋放鎖)

public void close() throws IOException

三、三種read方法效率比較

1、查看三種read方法源碼,其本質(zhì)都是利用for循環(huán)對內(nèi)容進(jìn)行單字節(jié)的讀取

2、從代碼形式看,使用read(byte[] b)較為直觀和簡便,因此項目中可以此方法為主進(jìn)行數(shù)據(jù)讀取

到此這篇關(guān)于Java使用FileInputStream流讀取文件示例詳解的文章就介紹到這了,更多相關(guān)Java FileInputStream流讀取文件內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
自拍自偷一区二区三区| 国产亚洲网站| 亚洲一区二区三区无吗| 午夜国产精品视频| 日韩不卡免费高清视频| 精品国产亚洲一区二区三区在线| 欧美日韩网址| av中文资源在线资源免费观看| 日韩久久一区二区三区| 欧美日韩国产免费观看视频| 国产毛片久久| 久久狠狠亚洲综合| 老牛影视精品| 日本va欧美va精品| 久久狠狠久久| 亚洲黄色中文字幕| 嫩草伊人久久精品少妇av杨幂| caoporn视频在线| 麻豆精品少妇| 精品少妇一区| 蜜桃tv一区二区三区| 综合激情视频| 精品一区欧美| 日韩影院在线观看| 国产欧美在线观看免费| 国产亚洲精品美女久久 | 欧美~级网站不卡| 国产亚洲欧洲| 日韩不卡一区二区| 97精品一区| 日韩国产一二三区| 另类中文字幕国产精品| 日韩精品一级二级| 欧美日韩亚洲一区二区三区在线| 国产精品免费精品自在线观看| 国产另类在线| 欧美色综合网| 免费人成精品欧美精品| 激情欧美一区二区三区| 国产亚洲电影| 性欧美69xoxoxoxo| 国产精品s色| 亚州av日韩av| 亚洲韩日在线| www成人在线视频| 国产suv精品一区二区四区视频 | 视频一区免费在线观看| 蜜桃tv一区二区三区| 日韩一区二区三区在线免费观看| 亚洲欧洲美洲av| 欧美日韩免费观看视频| 免播放器亚洲| 日本va欧美va精品发布| 香蕉久久久久久久av网站| 日韩欧美一区二区三区免费观看| 麻豆91精品视频| 亚久久调教视频| 美女网站久久| 午夜在线精品| 日韩精品91亚洲二区在线观看| 美女在线视频一区| 日韩欧美激情| 欧美三级网址| 青青草国产成人99久久| 日本蜜桃在线观看视频| 99成人在线| 国产一区日韩一区| 夜夜嗨一区二区| 蜜臀av亚洲一区中文字幕| 欧美黄色精品| 国产一区亚洲| 国产欧美三级| 清纯唯美亚洲综合一区| 乱一区二区av| 日韩国产激情| 欧美成人一二区| 性色一区二区| 日韩一级网站| 日日夜夜免费精品视频| 91精品日本| 国产精品欧美一区二区三区不卡| 亚洲欧美综合| 日本欧美在线看| 亚洲久草在线| 亚洲精品动态| 亚洲激情精品| 亚洲精品午夜av福利久久蜜桃| 国产精品蜜月aⅴ在线| 亚洲二区视频| 精品中国亚洲| 91成人在线| 中文字幕免费一区二区| 九色精品91| 久久蜜桃资源一区二区老牛| 超碰在线99| 免费一区二区视频| 国产午夜精品一区在线观看| 国产精品videossex| 蜜臀91精品一区二区三区| 久久91视频| 日韩不卡在线观看日韩不卡视频| 欧美+日本+国产+在线a∨观看| 亚洲精选av| 性欧美xxxx免费岛国不卡电影| av中文资源在线资源免费观看| 欧美日一区二区在线观看| 中文字幕av亚洲精品一部二部 | 特黄特色欧美大片| 精品视频免费| 久久99国产精品视频| 国产精品久久久久久久久久白浆| 日韩激情综合| 日韩国产欧美视频| 欧美在线91| 国产日韩一区| 日本va欧美va瓶| 久久一级电影| 国产成人精品一区二区三区在线| 亚洲一区激情| 欧美日韩在线网站| 亚洲午夜黄色| 亚洲一区中文| 亚洲v天堂v手机在线| 亚洲尤物av| 黄色aa久久| 国产经典一区| 精品久久久网| 亚洲伊人av| 99久久九九| 国产精品久久久久9999高清| 蜜桃视频免费观看一区| 美女日韩在线中文字幕| 蜜芽一区二区三区| 久久精品国产999大香线蕉| 在线日韩一区| 蜜臀国产一区| 欧美日韩一二三四| 久久久久中文| 男人的天堂久久精品| 日韩另类视频| 国产精品一区二区三区av| 日韩精品欧美激情一区二区| 久久精品免视看国产成人| 日韩在线综合| 激情综合在线| 99国产精品免费视频观看| 亚洲激情五月| 日韩高清不卡一区| 日本一不卡视频| 日韩精品导航| 国产精品白丝久久av网站| а√天堂8资源在线| 日韩一区二区三区高清在线观看| 精品美女在线视频| 红桃视频亚洲| 视频一区二区不卡| 日韩av午夜在线观看| 欧美a在线观看| 日韩综合精品| 鲁大师成人一区二区三区| 视频一区二区不卡| 国产精品一在线观看| 久久久久久婷| 亚洲在线观看| 国产精品xxx在线观看| 久久久国产精品一区二区中文| 日韩中文字幕1| 麻豆国产精品| 影音国产精品| 国产激情久久| 亚洲二区三区不卡| 欧美一区二区三区久久精品| 日韩av二区| 蜜臀久久99精品久久久画质超高清 | 电影亚洲精品噜噜在线观看| 亚洲激情另类| 国产精品麻豆成人av电影艾秋 | 日韩精品社区| 国产精品99视频| 日韩在线高清| 日韩中文字幕不卡| 人人爱人人干婷婷丁香亚洲| 国产亚洲欧美日韩在线观看一区二区| 国产农村妇女精品一二区| 亚洲精品极品少妇16p| 99久久亚洲精品蜜臀| 播放一区二区| 中文字幕日韩欧美精品高清在线| 亚洲调教视频在线观看| 亚洲成人va| 婷婷久久一区| 免费高清在线一区| 国产欧美精品| 精品免费av| 热久久久久久久| 国产精品传媒麻豆hd| 欧美一级鲁丝片| 国产亚洲福利| 精品国产中文字幕第一页| 精品一区视频|