簡(jiǎn)單總結(jié)Java IO中stream流的使用方法
Java語(yǔ)言的輸入輸出功能是十分強(qiáng)大而靈活的,對(duì)于數(shù)據(jù)的輸入和輸出操作以“流”(stream)的方式進(jìn)行。J2SDK提供了各種各樣的“流”類(lèi),用以獲取不同種類(lèi)的數(shù)據(jù),定義在包java.io中。程序中通過(guò)標(biāo)準(zhǔn)的方法輸入或輸出數(shù)據(jù)。
Java中的流可以從不同的角度進(jìn)行分類(lèi):
按照流的方向不同:分為輸入流和輸出流。
按照處理數(shù)據(jù)單位的不同:分為字節(jié)流(8位)和字符流(16位)。
按照功能不同:分為節(jié)點(diǎn)流和處理流。
節(jié)點(diǎn)流:是可以從一個(gè)特定的數(shù)據(jù)源(節(jié)點(diǎn))讀寫(xiě)數(shù)據(jù)的流(例如文件,內(nèi)存)。就像是一條單一的管子接到水龍頭上開(kāi)始放水。
處理流:是“連接”在已經(jīng)存在的流(節(jié)點(diǎn)流或處理流)之上,通過(guò)對(duì)數(shù)據(jù)的處理為程序提供更為強(qiáng)大的讀寫(xiě)功能。就像在已經(jīng)接了一條管子(節(jié)點(diǎn)流)的基礎(chǔ)上,又套上幾個(gè)更粗,具有特殊功能的管子(處理流)對(duì)流出的水進(jìn)一步的處理。
J2SDK所提供的所有位于包java.io內(nèi)的流類(lèi)型都分別繼承以下四種抽象流類(lèi)型。

四種基本流InputStream,OutputStream,Reader,Writer又分別有更具體的子類(lèi),分為文件流,緩沖流,數(shù)據(jù)流,轉(zhuǎn)換流,Print流,Object流等,都分別有特定的功能或用來(lái)操作特定的數(shù)據(jù)。其中深顏色的代表節(jié)點(diǎn)流,淺顏色的代表處理流。
這里通過(guò)節(jié)點(diǎn)流和處理流總結(jié)一下流的具體用法。
節(jié)點(diǎn)流的分類(lèi):

節(jié)點(diǎn)流分別對(duì)File(文件),Array(內(nèi)存中的一個(gè)數(shù)組),String(字符串),Pipe(管道)進(jìn)行處理。
處理流的分類(lèi):

常用的處理流有:緩沖流,轉(zhuǎn)換流,數(shù)據(jù)流,對(duì)象流,打印流。
緩沖流:要套接在相應(yīng)的字節(jié)流之上,對(duì)讀寫(xiě)的數(shù)據(jù)提供了緩沖功能,提高了讀寫(xiě)的效率,同時(shí)也增加了一些更方便方法。
緩沖流的作用就像一個(gè)桶,原本的字節(jié)流是個(gè)水管,水管直接連到目的地,加了緩沖流之后,就是在水管下接了一個(gè)桶,等桶接滿水后再倒入目的地。起到了緩沖的作用。這樣就可以一次讀到更多的數(shù)據(jù),避免了頻繁的讀寫(xiě)硬盤(pán)。由于帶了緩沖功能,所以就寫(xiě)數(shù)據(jù)的時(shí)候需要使用flush方法。
import java.io.*;
public class TestBufferStream{
public static void main(String[] args){
try{
BufferedWriter bw=new BufferedWriter(new FileWriter("F:\\Java\\IO\\dat.txt"));//在對(duì)寫(xiě)文件的字節(jié)流上套接上緩沖流
BufferedReader br=new BufferedReader(new FileReader("F:\\Java\\IO\\dat.txt"));//在對(duì)讀文件的字節(jié)流上套接上緩沖流
String s=null;
for(int i=1;i<=100;i++){
s=String.valueOf(Math.random());//通過(guò)隨機(jī)函數(shù)給s賦值
bw.write(s); //將s寫(xiě)入到dat.txt文件中
bw.newLine(); //寫(xiě)入一個(gè)分行符。緩沖流比較好用的方法就是可以寫(xiě)入或讀取一行的數(shù)據(jù)。
}
bw.flush(); //使內(nèi)存中的所有數(shù)據(jù)立刻寫(xiě)出,不再緩沖。
while((s=br.readLine())!=null){ //按行讀取文件內(nèi)容
System.out.println(s);
}
bw.close(); //關(guān)閉處理流同時(shí)關(guān)閉里面的節(jié)點(diǎn)流。
br.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
轉(zhuǎn)換流:用與字節(jié)數(shù)據(jù)到字符數(shù)據(jù)之間的轉(zhuǎn)化。InputStreamReader需要和InputStream套接,OutputStreamWriter需要和outputStream套接。
數(shù)據(jù)流:DataInputStream 和DataOutputStream 提供將基礎(chǔ)數(shù)據(jù)類(lèi)型寫(xiě)入到文件中,或者讀取出來(lái),這個(gè)流的用處還是很大的,如果沒(méi)有這種流的話,有一個(gè)long,本身只占8個(gè)字節(jié),如果我要寫(xiě)入到文件,需要轉(zhuǎn)成字符串,然后在轉(zhuǎn)成字符數(shù)組,那空間會(huì)占用很多,但是有了這種流之后就很方便了,直接將這8個(gè)字節(jié)寫(xiě)到文件就可以了,既節(jié)約了內(nèi)存空間也使程序?qū)懫饋?lái)更加方便簡(jiǎn)單。但是讀取的時(shí)候需要注意了,根據(jù)讀取的數(shù)據(jù)類(lèi)型,指針會(huì)往下移,所以你讀的順序必須要和寫(xiě)的順序一致才能完成你正確的需求。否則就相當(dāng)與把數(shù)據(jù)拆分了。
import java.io.*;
public class TestDataStream{
public static void main(String[] args){
ByteArrayOutputStream baos=new ByteArrayOutputStream(); //建一個(gè)節(jié)點(diǎn)流。
DataOutputStream dos=new DataOutputStream(baos); //在節(jié)點(diǎn)流上接一根數(shù)據(jù)流“管道” try{
dos.writeDouble(Math.random()); //double型 ,占8個(gè)字節(jié)
dos.writeBoolean(true); //boolean型,占一個(gè)字節(jié)
ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());
System.out.println(bais.available()); //輸出流中總的可用字節(jié)數(shù)--9
DataInputStream dis=new DataInputStream(bais); //同樣在輸出流的外面接上數(shù)據(jù)流“管道”
System.out.println(dis.readDouble()); //直接讀出double型的數(shù)
System.out.println(dis.readBoolean()); //直接讀出boolean型
dos.close();
dis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
打印流:java.io中專(zhuān)門(mén)提供用于打印的流,這類(lèi)流在寫(xiě)入的時(shí)候有自動(dòng)flush的功能,所以不需要每打印一個(gè)東西都flush一次。
import java.io.*;
public class TestPrintStream1{
public static void main(String[] args){
PrintStream ps=null;
try{
FileOutputStream fos=new FileOutputStream("F:\\Java\\IO\\log.dat");//創(chuàng)建輸出流,指定輸出地點(diǎn)
ps=new PrintStream(fos); //在流外面包裝打印流
}catch(IOException e){
e.printStackTrace();
}
if(ps!=null){
System.setOut(ps); //將系統(tǒng)的打印設(shè)置成打印流ps
}
int ln=0;
for(char c=0;c<=60000;c++){
System.out.print(c+" "); //不在打印到dos窗口,輸出流直接打印到指定文件中
if(ln++>=100){
System.out.println();ln=0;
}
}
}
}
- java8 Stream流逐行處理文本文件
- Java使用FileInputStream流讀取文件示例詳解
- Java實(shí)現(xiàn)inputstream流的復(fù)制代碼實(shí)例
- Java8中的Stream流式操作教程之王者歸來(lái)
- Java中FileOutputStream流的write方法
- Java8新特性Stream流實(shí)例詳解
- BufferedInputStream(緩沖輸入流)詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java的DataInputStream和DataOutputStream數(shù)據(jù)輸入輸出流
- Java中的stream流的概念解析及實(shí)際運(yùn)用總結(jié)
- 舉例講解Java中的Stream流概念
- 詳解JAVA Stream流
相關(guān)文章
解決maven啟動(dòng)Spring項(xiàng)目報(bào)錯(cuò)的問(wèn)題
下面小編就為大家分享一篇解決maven啟動(dòng)Spring項(xiàng)目報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
springboot使用GuavaCache做簡(jiǎn)單緩存處理的方法
這篇文章主要介紹了springboot使用GuavaCache做簡(jiǎn)單緩存處理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Java通過(guò)導(dǎo)出超大Excel文件解決內(nèi)存溢出問(wèn)題
導(dǎo)出excel是咱Java開(kāi)發(fā)的必備技能,下面這篇文章主要給大家介紹了關(guān)于Java通過(guò)導(dǎo)出超大Excel文件解決內(nèi)存溢出問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09

