Java中操作基本數(shù)據(jù)類型的流梭域、內(nèi)存操作流斑举、打印流、隨機(jī)訪問流病涨、合并流富玷、序列化流

操作基本數(shù)據(jù)類型的流

  • 操作基本數(shù)據(jù)類型
    • DataInputStream
    • DataOutputStream

操作基本數(shù)據(jù)類型的流可以讀寫基本數(shù)據(jù)類型的數(shù)據(jù),我們來寫一個簡單的讀寫例子

public class DataStreamDemo {
 public static void main(String[] args) throws IOException { 
// 寫 
write(); 
// 讀 
read();
 }
 private static void read() throws IOException { 
// DataInputStream(InputStream in) 
// 創(chuàng)建數(shù)據(jù)輸入流對象 
DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt")); 
// 讀數(shù)據(jù) 
byte b = dis.readByte();
 short s = dis.readShort(); 
int i = dis.readInt();
 long l = dis.readLong();
 float f = dis.readFloat(); 
double d = dis.readDouble(); 
char c = dis.readChar();
 boolean bb = dis.readBoolean(); // 釋放資源
 dis.close();
 System.out.println(b);
 System.out.println(s);
 System.out.println(i);
 System.out.println(l);
 System.out.println(f);
 System.out.println(d);
 System.out.println(c);
 System.out.println(bb);
 } 
private static void write() throws IOException { 
// DataOutputStream(OutputStream out)
 // 創(chuàng)建數(shù)據(jù)輸出流對象 
DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt")); // 寫數(shù)據(jù) 
dos.writeByte(10);
 dos.writeShort(100);
 dos.writeInt(1000);
 dos.writeLong(10000); 
dos.writeFloat(12.34F);
 dos.writeDouble(12.56);
 dos.writeChar('a');
 dos.writeBoolean(true);
 // 釋放資源 
dos.close();
 }
}

內(nèi)存操作流

- 操作字節(jié)數(shù)組
   - ByteArrayInputStream
   - ByteArrayOutputStream
- 操作字符數(shù)組
   - CharArrayReader
   - CharArrayWrite
- 操作字符串
   - StringReader
   - StringWriter 

內(nèi)存操作流一般用于處理臨時信息,因?yàn)榕R時信息不需要保存既穆,使用后就可以刪除赎懦。

public class ByteArrayStreamDemo { 
public static void main(String[] args) throws IOException {
 // 寫數(shù)據(jù) --字節(jié)數(shù)組輸出流
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 // 寫數(shù)據(jù) 
for (int x = 0; x < 10; x++) { 
baos.write(("hello" + x).getBytes());
 } 
// 釋放資源
 // 通過查看源碼我們知道這里什么都沒做,所以根本需要close()
 // baos.close(); 
// public byte[] toByteArray() 
byte[] bys = baos.toByteArray();
 // 讀數(shù)據(jù)
 // ByteArrayInputStream(byte[] buf)
 ByteArrayInputStream bais = new ByteArrayInputStream(bys);
 int by = 0;
 while ((by = bais.read()) != -1) { 
System.out.print((char) by);
 }
 // bais.close();
 }
}

上面我們寫英文字符數(shù)據(jù)可以運(yùn)用字節(jié)數(shù)組的輸出流ByteArrayOutputStream幻工,如果我們寫入中文數(shù)據(jù)的話就要用操作字符數(shù)組的流CharArrayWrite了励两。那么,剩下的操作字符數(shù)組和操作字符串的例子就不做演示了囊颅,大家可以自己練練当悔。

打印流

  • 打印流分為兩類
    • 字節(jié)流打印流 PrintStream
    • 字符打印流 PrintWriter

打印流的特點(diǎn):
- 只有寫數(shù)據(jù)的傅瞻,沒有讀取數(shù)據(jù)。只能操作目的地盲憎,不能操作數(shù)據(jù)源嗅骄。
- 可以操作任意類型的數(shù)據(jù)。
- 如果啟動了自動刷新饼疙,能夠自動刷新溺森。
- 該流是可以直接操作文本文件的。

我們來回憶一下哪些流對象是可以直接操作文本文件的呢?

  • FileInputStream
  • FileOutputStream
  • FileReader
  • FileWriter
  • PrintStream
  • PrintWriter
  • 看API,查流對象的構(gòu)造方法窑眯,如果同時有File類型和String類型的參數(shù)屏积,一般來說就是可以直接操作文件的。

打印流的特點(diǎn)有一條是可以操作任意類型的數(shù)據(jù)磅甩,可是我們看方法炊林,他的write方法不可以寫boolean類型的,所以我們就去看看他的api更胖,看有什么新方法铛铁,當(dāng)然是有的隔显,我們就直接來學(xué)習(xí)他的新方法吧却妨。
可以操作任意類型的數(shù)據(jù)。有兩種方法括眠,他們就什么區(qū)別呢彪标?

  • print() 不會換行,不會自動刷新數(shù)據(jù)掷豺。
  • println() 不僅僅自動刷新了數(shù)據(jù)捞烟,還實(shí)現(xiàn)了數(shù)據(jù)的換行。

隨機(jī)訪問流

RandomAccessFile
概述:RandomAccessFile類不屬于流当船,是Object類的子類题画。但它融合了InputStream和OutputStream的功能。支持對隨機(jī)訪問文件的讀取和寫入德频。

這個類我以前寫視頻斷點(diǎn)上傳的時候就用到了苍息,很強(qiáng)大的一個類,我們下面來學(xué)習(xí)下壹置。

public RandomAccessFile(String name,String mode):第一個參數(shù)是文件路徑竞思,第二個參數(shù)是操作文件的模式。模式有四種钞护,我們最常用的一種叫”rw”,這種方式表示我既可以寫數(shù)據(jù)盖喷,也可以讀取數(shù)據(jù)下面我們就用這個類來寫一個簡單的讀寫操作的例子

public class RandomAccessFileDemo { 
public static void main(String[] args) throws IOException { 
// 創(chuàng)建隨機(jī)訪問流對象 
RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
 // 寫入數(shù)據(jù) 
raf.writeInt(100);
 raf.writeChar('a'); 
raf.writeUTF("中國"); 
raf.close();
 }
}

運(yùn)行程序,然后我們繼續(xù)來寫讀的方法

public class RandomAccessFileDemo { 
public static void main(String[] args) throws IOException { 
// 創(chuàng)建隨機(jī)訪問流對象
 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
 int i = raf.readInt(); 
System.out.println(i);
 // 該文件指針可以通過 getFilePointer方法讀取难咕,并通過 seek 方法設(shè)置课梳。 System.out.println("當(dāng)前文件的指針位置是:" + raf.getFilePointer()); 
char ch = raf.readChar(); 
System.out.println(ch);
 System.out.println("當(dāng)前文件的指針位置是:" + raf.getFilePointer()); String s = raf.readUTF();
 System.out.println(s);
 System.out.println("當(dāng)前文件的指針位置是:" + raf.getFilePointer());
 // 我就要讀取a距辆,怎么辦呢?
 raf.seek(4);
 ch = raf.readChar(); 
 System.out.println(ch); 
}
}

合并流

SequenceInputStream
概述:SequenceInputStream類可以將多個輸入流串流在一起,合并為一個輸入流暮刃,因此挑格,該流也被稱為合并流。

  • SequenceInputStream的構(gòu)造方法
    • SequenceInputStream(InputStream s1, InputStream s2)
    • SequenceInputStream(Enumeration < ? extends InputStream> e)
    • 把多個文件的內(nèi)容寫入到一個文本文件

以前我們只是將一個文件的內(nèi)容復(fù)制到另外一個文件中沾歪,現(xiàn)在這個合并流可以實(shí)現(xiàn)將兩個及多個文件的內(nèi)容復(fù)制到一個文件中了漂彤,我們來實(shí)現(xiàn)以下吧

// 需求:把ByteArrayStreamDemo.java和DataStreamDemo.java的內(nèi)容復(fù)制到Copy.java中
public class SequenceInputStreamDemo { 
public static void main(String[] args) throws IOException { 
InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java"); InputStream s2 = new FileInputStream("DataStreamDemo.java"); SequenceInputStream sis = new SequenceInputStream(s1, s2); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("Copy.java"));
 // 讀寫操作 
byte[] bys = new byte[1024];
 int len = 0;
 while ((len = sis.read(bys)) != -1) { 
bos.write(bys, 0, len);
 } 
bos.close();
 sis.close();
 }
}

運(yùn)行程序你會在Copy.java文件中看到ByteArrayStreamDemo.java和DataStreamDemo.java文件的內(nèi)容都復(fù)制到了Copy.java文件中。

那么怎么合并3個或者三個以上的文件操作呢灾搏?
// 需求:把下面的三個文件的內(nèi)容(ByteArrayStreamDemo.java,CopyFileDemo.java,DataStreamDemo.java)復(fù)制到Copy.java中
public class SequenceInputStreamDemo2 { 
public static void main(String[] args) throws IOException {
 // SequenceInputStream(Enumeration e)
 // 通過簡單的回顧我們知道了Enumeration是Vector中的一個方法的返回值類型挫望。
 // Enumeration<E> elements()
 Vector<InputStream> v = new Vector<InputStream>(); 
InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java"); InputStream s2 = new FileInputStream("CopyFileDemo.java"); InputStream s3 = new FileInputStream("DataStreamDemo.java"); v.add(s1);
v.add(s2);
v.add(s3);
Enumeration<InputStream> en = v.elements(); 
SequenceInputStream sis = new SequenceInputStream(en); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("Copy.java"));
 // 如何寫讀寫呢,其實(shí)很簡單狂窑,你就按照以前怎么讀寫媳板,現(xiàn)在還是怎么讀寫 byte[] bys = new byte[1024]; 
int len = 0; 
while ((len = sis.read(bys)) != -1) { 
bos.write(bys, 0, len);
 } 
bos.close(); 
sis.close();
 }
}

運(yùn)行程序,我們會在Copy.java文件中看到那三個文件的內(nèi)容泉哈,我們要是想合并四個或者以上的文件蛉幸,只需要繼續(xù)將文件創(chuàng)建輸入流對象然后添加在Vector集合中就可以實(shí)現(xiàn)了。

序列化流

  • 序列化流ObjectOutputStream
  • 反序列化流ObjectInputStream

序列化流:把對象按照流一樣的方式存入文本文件或者在網(wǎng)絡(luò)中傳輸丛晦。對象 –> 流數(shù)據(jù)(ObjectOutputStream)
反序列化流:把文本文件中的流對象數(shù)據(jù)或者網(wǎng)絡(luò)中的流對象數(shù)據(jù)還原成對象奕纫。流數(shù)據(jù) –>對象(ObjectInputStream)

//我們先寫一個實(shí)體類,并實(shí)現(xiàn)序列化接口
public class Person implements Serializable { 
private String name;
 private int age;
 public Person() { 
super();
 } 
public Person(String name, int age) { 
super();
 this.name = name; 
this.age = age;
 } 
public String getName() { 
return name;
 } 
public void setName(String name) { 
this.name = name;
 } 
public int getAge() { 
return age;
 } 
public void setAge(int age) { 
this.age = age;
 } 
@Override
 public String toString() { 
return "Person [name=" + name + ", age=" + age + "]"; 
}
}
//寫入數(shù)據(jù)
public class ObjectStreamDemo { 
public static void main(String[] args) throws IOException{
 // 創(chuàng)建序列化流對象 
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
 // 創(chuàng)建對象
 Person p = new Person("阿杜", 25);
 // public final void writeObject(Object obj) 
oos.writeObject(p);
 // 釋放資源
 oos.close();
 }
}
//讀取數(shù)據(jù)
public class ObjectStreamDemo { 
public static void main(String[] args) throws IOException, ClassNotFoundException{ 
// 創(chuàng)建反序列化對象 
ObjectInputStream ois = new ObjectInputStream(new FileInputStream( "oos.txt")); 
// 還原對象
 Object obj = ois.readObject();
 // 釋放資源 
ois.close();
 // 輸出對象 
System.out.println(obj);
 }
}


輸出結(jié)果:Person [name=阿杜, age=25]
我們也可以這樣理解
對象序列化是將對象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)倪^程烫沙。一般的格式是與平臺無關(guān)的二進(jìn)制流匹层,可以將這種二進(jìn)制流持久保存在磁盤上,也可以通過網(wǎng)絡(luò)將這種二進(jìn)制流傳輸?shù)搅硪粋€網(wǎng)絡(luò)結(jié)點(diǎn)锌蓄。對象反序列化升筏,是指把這種二進(jìn)制流數(shù)據(jù)還原成對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘸爽,一起剝皮案震驚了整個濱河市您访,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剪决,老刑警劉巖灵汪,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昼捍,居然都是意外死亡识虚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門妒茬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來担锤,“玉大人,你說我怎么就攤上這事乍钻「匮” “怎么了铭腕?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長多糠。 經(jīng)常有香客問我累舷,道長,這世上最難降的妖魔是什么夹孔? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任被盈,我火速辦了婚禮,結(jié)果婚禮上搭伤,老公的妹妹穿的比我還像新娘只怎。我一直安慰自己,他們只是感情好怜俐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布身堡。 她就那樣靜靜地躺著,像睡著了一般拍鲤。 火紅的嫁衣襯著肌膚如雪贴谎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天季稳,我揣著相機(jī)與錄音擅这,去河邊找鬼。 笑死绞幌,一個胖子當(dāng)著我的面吹牛蕾哟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莲蜘,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帘营!你這毒婦竟也來了票渠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤芬迄,失蹤者是張志新(化名)和其女友劉穎问顷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禀梳,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杜窄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了算途。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞耕。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘴瓤,靈堂內(nèi)的尸體忽然破棺而出扫外,到底是詐尸還是另有隱情莉钙,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布筛谚,位于F島的核電站磁玉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驾讲。R本人自食惡果不足惜蚊伞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吮铭。 院中可真熱鬧厚柳,春花似錦、人聲如沸沐兵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扎谎。三九已至碳想,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毁靶,已是汗流浹背胧奔。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留预吆,地道東北人龙填。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像拐叉,于是被迫代替她去往敵國和親岩遗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容