java 字节输入流_JavaIO流(一)-字节输入流与字符输入流
IO流詳解
一、輸入流
字節(jié)輸入流
FileInputSteam
1、構(gòu)造方法:public FileInputStream(File file) {}
public FileInputStream(FileDescriptor fdObj){}
public FileInputStream(String name){}
2、read方法:// 每次讀取一個(gè)字節(jié)
public int read(){}
// 讀取b.length個(gè)字節(jié)到byte數(shù)組中
public int read(byte b[]){}
// 從輸入流中讀取len個(gè)字節(jié)到字節(jié)數(shù)組中
public int read(byte b[], int off, int len){}
3、文件讀取:
1、read()每次讀取一個(gè)字節(jié)數(shù)據(jù),返回字節(jié)數(shù),如果到達(dá)文件末尾,返回-1。
文本abcpublic static void method_01(String filePath) throws IOException {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(filePath);
// 每次讀取一個(gè)字節(jié)
for (int i = 0; i < 4; i++) {
int read = inputStream.read();
System.out.println(read);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (null != inputStream) {
// 關(guān)閉IO流
inputStream.close();
}
}
}
執(zhí)行結(jié)果:97
98
99
-1
從執(zhí)行結(jié)果可以看出,前三次讀取到了數(shù)據(jù),返回了對(duì)應(yīng)的ASCII碼,當(dāng)讀取到文件末尾的時(shí)候,則返回-1。
2、read(byte[] b)讀入緩沖區(qū)的字節(jié)總數(shù),如果到達(dá)文件末尾,則返回-1。
文本:abcdefg
聲明一個(gè)大于真實(shí)數(shù)據(jù)的byte數(shù)組讀取數(shù)據(jù)。public static void method_02(String filePath) throws IOException {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(filePath);
// 聲明的長(zhǎng)度大于真實(shí)數(shù)據(jù)長(zhǎng)度
byte[] bytes = new byte[20];
int length = inputStream.read(bytes);
System.out.println("字節(jié)數(shù)組長(zhǎng)度:" + bytes.length + " 讀取到的數(shù)據(jù)字節(jié)長(zhǎng)度:" + length);
for (byte b : bytes) {
System.out.print(b + " | ");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (null != inputStream) {
inputStream.close();
}
}
}
執(zhí)行結(jié)果:字節(jié)數(shù)組長(zhǎng)度:20 讀取到的數(shù)據(jù)字節(jié)長(zhǎng)度:7
97 | 98 | 99 | 100 | 101 | 102 | 103 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
可以看出,當(dāng)我們byte數(shù)組的長(zhǎng)度大于字節(jié)數(shù)組的真實(shí)長(zhǎng)度之后,那么后面的空間全部使用0做補(bǔ)位,這也恰恰反映了另外一個(gè)問(wèn)題,我們?cè)谑褂胋yte[]數(shù)組讀取文件的時(shí)候,千萬(wàn)不要說(shuō)我設(shè)置足夠大的長(zhǎng)度,就可以高枕無(wú)憂提高讀取效率,如果遇到小文件,那么也是很容易造成效率低下的。
3、read(byte b[], int off, int len)讀入緩沖區(qū)的字節(jié)總數(shù),如果讀取到文件末尾,則返回-1;
文本:abcdefg
聲明一個(gè)固定大小的byte數(shù)組,循環(huán)讀取數(shù)據(jù)
我們的文本有七個(gè)字節(jié),聲明了一個(gè)2個(gè)長(zhǎng)度的數(shù)組,應(yīng)該循環(huán)四次,第五次讀取的時(shí)候返回-1。public static void method_03(String filePath) throws IOException {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(filePath);
// 聲明2個(gè)長(zhǎng)度
byte[] bytes = new byte[2];
int i = 0;
while (i < 5) {
int length = inputStream.read(bytes, 0, bytes.length);
System.out.println("第" + (i + 1) + "次讀取,length: " + length);
System.out.println("開(kāi)始輸出:");
for (int j = 0; j < length; j++) {
System.out.print(bytes[j] + " | ");
}
System.out.println();
i++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (null != inputStream) {
inputStream.close();
}
}
}
執(zhí)行結(jié)果:第1次讀取,length: 2
開(kāi)始輸出:
97 | 98 |
第2次讀取,length: 2
開(kāi)始輸出:
99 | 100 |
第3次讀取,length: 2
開(kāi)始輸出:
101 | 102 |
第4次讀取,length: 1
開(kāi)始輸出:
103 |
第5次讀取,length: -1
開(kāi)始輸出:
注意:
可能有的朋友會(huì)遇到我之前遇到的問(wèn)題,他的文本里面寫了漢字或者標(biāo)點(diǎn)符號(hào),會(huì)出現(xiàn)亂碼,我們給文本最后再追加一個(gè)中文,并且把每次讀取到的byte數(shù)組轉(zhuǎn)換成String進(jìn)行輸出,看會(huì)出現(xiàn)什么情況。public static void method_03(String filePath) throws IOException {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(filePath);
byte[] bytes = new byte[2];
int i = 0;
while (i < 5) {
inputStream.read(bytes, 0, bytes.length);
// 將byte[]轉(zhuǎn)換成string
String s = new String(bytes, StandardCharsets.UTF_8);
System.out.println(s);
i++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (null != inputStream) {
inputStream.close();
}
}
}
結(jié)果:ab
cd
ef
g�
��
剛開(kāi)始腦子抽了,感覺(jué)這是什么問(wèn)題,怎么會(huì)亂碼呢,如果稍微上點(diǎn)心的都會(huì)發(fā)現(xiàn),中文占3個(gè)byte字節(jié),你用2個(gè)存儲(chǔ)那鐵定亂碼呀。那么你肯定想過(guò)那我把數(shù)組聲明大一點(diǎn)不就好了,如果你這么想過(guò),那你可能還不知道社會(huì)的險(xiǎn)惡。
那么到底怎么辦呢?真的就沒(méi)辦法了嗎?接下來(lái)我們用一個(gè)例子來(lái)學(xué)習(xí)如何解決這種問(wèn)題。
一個(gè)🌰:將文本中的內(nèi)容讀取出來(lái),輸出到控制臺(tái)。
既然我們知道,上面的亂碼是因?yàn)橛⑽暮椭形恼加玫淖止?jié)數(shù)不同引起的,那我們要是知道了整個(gè)文件占用的字節(jié)長(zhǎng)度,那么不就一次性可以讀取出來(lái)了。恰好FileInputStream提供了這樣一個(gè)方法(available),讓我們可以獲取到整個(gè)文件所占用的字節(jié)數(shù)。public static void printConsole(String filePath) throws IOException {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(filePath);
// 獲取到整個(gè)文本占用的整個(gè)字節(jié)數(shù)
int available = inputStream.available();
// 聲明數(shù)組
byte[] bytes = new byte[available];
// 讀取數(shù)據(jù)
int readLength = inputStream.read(bytes, 0, available);
String s = new String(bytes, StandardCharsets.UTF_8);
System.out.println("讀取到的長(zhǎng)度:" + readLength + " available:" + available);
System.out.println("讀取到的內(nèi)容: " + s);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (null != inputStream) {
inputStream.close();
}
}
}
結(jié)果:讀取到的長(zhǎng)度:30 available:30
讀取到的內(nèi)容: abcdef一個(gè)程序員的成長(zhǎng)
這樣的話,我們就可以讀取到文本中完整的內(nèi)容了。只有了解了這些,那么才會(huì)了解我們的寫文件下載的時(shí)候?yàn)槭裁匆袛?讀取到的字節(jié)數(shù) !=-1 這樣的操作,不然真的很難記住。
字符輸入流
FileReader
1、構(gòu)造方法:public FileReader(String fileName){};
public FileReader(File file){};
public FileReader(FileDescriptor fd){};
2、read方法:public int read(){};
public int read(char cbuf[], int offset, int length){};
public int read(char cbuf[]){};
3、文件讀取:
FileReader的read方法讀取出來(lái)的是一個(gè)獨(dú)立的字符(char),所以面對(duì)英文和中文的混合,我們不會(huì)因?yàn)檎加米止?jié)的不同從而導(dǎo)致出現(xiàn)亂碼的情況。
文本:abcdef一個(gè)程序員的成長(zhǎng)
讀取內(nèi)容的代碼:public static void method_01(String filePath) throws IOException {
FileReader fr = null;
try {
fr = new FileReader(filePath);
int c;
// 每次讀取一個(gè)字符,等于-1即表示文件讀取到末尾
while ((c = fr.read()) != -1) {
System.out.println((char) c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (null != fr) {
fr.close();
}
}
結(jié)果:a
b
c
d
e
f
一
個(gè)
程
序
員
的
成
長(zhǎng)
根據(jù)結(jié)果可以看出,read()讀取出來(lái)的每次就是一個(gè)單獨(dú)的字符,那么另外兩個(gè)read方法跟字節(jié)流讀取都是一樣的。
更多內(nèi)容請(qǐng)關(guān)注微信公眾號(hào):
總結(jié)
以上是生活随笔為你收集整理的java 字节输入流_JavaIO流(一)-字节输入流与字符输入流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浦发AE白额度最低多少?最高额度多少?
- 下一篇: 浦发AE白申请难度大吗?浦发AE白申请攻