JAVA字節(jié)流
目前創(chuàng)新互聯(lián)建站已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、槐蔭網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
是每次從文件中讀取單個(gè)字節(jié)
字符流是每次讀出1個(gè)字符
相當(dāng)于每次讀出2個(gè)字節(jié)
FileInputStream
fs=new
FileInputStream(路徑);
這是一個(gè)字符流
InputStreamReader
ir=new
InputStreamReader(
fs)
這是一個(gè)字符流
fs
為字節(jié)流
這個(gè)類就是把字節(jié)流轉(zhuǎn)化為字符流;
字符流
就是為了方便讀取文字和符號的
都知道中文漢字要2個(gè)字節(jié)才能存儲
如果一次讀出1個(gè)字節(jié)
在轉(zhuǎn)化為中文
就會出亂碼了
;
這些問題你都可以通過查詢API文檔找到答案的
用BufferedReader的這個(gè)類,其中嵌套的十一個(gè)輸入流,然后用其中的readLine()方法
理論上說是不能直接得到的,因?yàn)樽钤嫉腎O流是字節(jié)流也就是說一次只能讀到一個(gè)字節(jié)的數(shù)據(jù),這里面根本就沒有行數(shù)之說;此外,即使使用緩沖流最多也就是每次讀進(jìn)一行已,如果想要得到文件的行數(shù)就得等文件讀完才知道。
字節(jié)是不存在行不行這個(gè)概念的,不過你可以每次讀取固定長度
字符流可以一行一行的讀取數(shù)據(jù)
代碼如下:
import?java.io.BufferedReader;
import?java.io.BufferedWriter;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.FileNotFoundException;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.io.InputStreamReader;
import?java.io.OutputStreamWriter;
public?class?App?{
public?static?void?main(String[]?args)?throws?FileNotFoundException,?IOException?{
try?(
FileInputStream?inputStream?=?new?FileInputStream(new?File("d:\\temp\\abc.txt"));
InputStreamReader?streamReader?=?new?InputStreamReader(inputStream);
BufferedReader?reader?=?new?BufferedReader(streamReader);
FileOutputStream?outputStream?=?new?FileOutputStream(new?File("d:\\temp\\output.txt"));
OutputStreamWriter?streamWriter?=?new?OutputStreamWriter(outputStream);
BufferedWriter?writer?=?new?BufferedWriter(streamWriter);
)?{
int?count?=?1;
String?line?=?null;
while?((line?=?reader.readLine())?!=?null)?{
writer.write(count++?+?":?"?+?line);
writer.newLine();
}
}
System.out.println("done.");
}
}
可以,首先你要了解一下什么是字節(jié)流,什么是字符流。
字節(jié)流的輸入輸出都是以字節(jié)為基本單位的,即都是0101這樣的東西。沒有格式,前臺和后臺通過相關(guān)的約定來知道怎么轉(zhuǎn)碼。 而字符流是前提條件己知的就是輸入輸出的字符。
因?yàn)樽址魇且晕谋咀址麨榛A(chǔ)的,所以當(dāng)然就有讀一行文本這樣的函數(shù)了。
而字節(jié)流沒有文本的概念,就沒有這個(gè)函數(shù)。
字節(jié)流是InputStream/outputStream, 而字節(jié)流一般是reader/writer
但是兩者還是可以轉(zhuǎn)換的。 如果你把一個(gè)InputSteram轉(zhuǎn)成了reader ,那就可以利用reader中的readline()方法了:
請看代碼:
InputStream is = XXXXXX; //你前面己經(jīng)得到的inputstream 字節(jié)流
InputStreamReader reader = new InputStreamReader(is);//先轉(zhuǎn)成reader
BufferedReader breader=new BufferedReader(reader); //再轉(zhuǎn)成BufferedReader
String oneLine = breader.readLine();//利用reader中的readline()
System.out.println(oneLine);
請注意,前提條件必須是我前面己經(jīng)說過的,這個(gè)字節(jié)流中的字節(jié)其實(shí)就是原來由文本轉(zhuǎn)成字節(jié)的。比如后臺是這樣寫的:
byte[] bytes = yourTextContent.getBytes("utf-8"); //先把文字內(nèi)容轉(zhuǎn)成了utf-8編碼的字節(jié)數(shù)組,然后輸出到客戶端,所以這是字節(jié)流。但內(nèi)容其實(shí)是文本。這樣客戶端才可以用reader來讀。否則是亂碼
outputStream.write(bytes);
outputStream.flush();
另外: String oneLine = breader.readLine();可以放在一個(gè)循環(huán)語句中,每次讀一行,讀完一行就檢測一下是否讀到空或文件尾, 如果是跳出循環(huán),這樣就可以讀完全部的流,每次以讀一行為單位。