最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中的Io(input與output)操作總結(jié)(四)

 更新時間:2013年01月10日 10:50:00   作者:  
前面已經(jīng)把java io的主要操作講完了,這一節(jié)我們來說說關(guān)于java io的其他內(nèi)容:Serializable序列化/DataOutputStream和DataInputStream類/管道流等等,感興趣的朋友可以了解下
前面已經(jīng)把java io的主要操作講完了
這一節(jié)我們來說說關(guān)于java io的其他內(nèi)容

Serializable序列化
實例1:對象的序列化
復(fù)制代碼 代碼如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
@SuppressWarnings("serial")
//一個類要想實現(xiàn)序列化則必須實現(xiàn)Serializable接口
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Name:" + this.name + ", Age:" + this.age;
}
}
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
Person p1 = new Person("zhangsan",12);
Person p2 = new Person("lisi",14);
//此處創(chuàng)建文件寫入流的引用是要給ObjectOutputStream的構(gòu)造函數(shù)玩兒
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(path);
oos = new ObjectOutputStream(fos);
//這里可以寫入對象,也可以寫入其他類型數(shù)據(jù)
oos.writeObject(p1);
oos.writeObject(p2);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

所謂對象序列化就是把一個對象進(jìn)行持久化存儲,方便保留其屬性
通俗點說,等于把一個對象從堆內(nèi)存里邊揪出來放到硬盤上
當(dāng)然,如果你開心,你可以序列化其他東西,包括數(shù)組,基本數(shù)據(jù)類型等等
來看看內(nèi)容,神馬玩意兒這是……

 
實例2:對象的反序列化

復(fù)制代碼 代碼如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
//好吧,這里代碼寫得著實有點長了,還要拋異常什么的
//如果你也看的煩,那就在主方法上拋吧,構(gòu)造方法里用匿名對象就好了
//什么?別告訴我你不知道匿名對象
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(path);
ois = new ObjectInputStream(fis);
//這里返回的其實是一個Object類對象
//因為我們已知它是個Person類對象
//所以,就地把它給向下轉(zhuǎn)型了
Person p = (Person)ois.readObject();
System.out.println(p);
//拋死你,煩煩煩~!?。?
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
//還是要記得關(guān)閉下流
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

你看,我們把一個對象存放在硬盤上是為了方便日后使用
現(xiàn)在用得著它了,自然得拿出來


管道流
實例3:線程的通信

復(fù)制代碼 代碼如下:

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
//實現(xiàn)Runnable接口,實現(xiàn)一個讀的線程
class Read implements Runnable {
private PipedInputStream in;
//將需要讀的管道流傳入到構(gòu)造函數(shù)中
public Read(PipedInputStream in) {
this.in = in;
}
//實現(xiàn)讀這一線程
public void run() {
try {
byte[] buf = new byte[1024];
int temp = 0;
//循環(huán)讀取
//read是一個阻塞方法,需要拋異常
//此處把打印流的代碼也加入進(jìn)來
//是因為如果沒有讀取到數(shù)據(jù),那么打印的代碼也無效
while((temp = in.read(buf)) != -1) {
String str = new String(buf,0,temp);
System.out.println(str);
}
} catch (IOException e) {
//其實這里應(yīng)拋出一個自定義異常的
//暫時我還沒弄清楚
e.printStackTrace();
} finally {
try {
//我已經(jīng)拋火了,這只是為了提醒自己異常很重要
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//這里實現(xiàn)一個寫的類
class Write implements Runnable {
private PipedOutputStream out;
//將管道輸入流傳進(jìn)來
public Write(PipedOutputStream out) {
this.out = out;
}
public void run() {
try {
//這里開始寫出數(shù)據(jù)
out.write("管道輸出".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//其實應(yīng)該可以把這個關(guān)閉方法寫到上面那個try里邊
//但是這樣感覺怪怪的,邏輯不大對
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class Demo {
public static void main(String[] args) {
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
try {
//連接管道
in.connect(out);
//創(chuàng)建對象,開啟線程
//此處同樣放進(jìn)try...catch里面
//因為如果沒有鏈接管道,下面操作無意義
Read r = new Read(in);
Write w = new Write(out);
//把已經(jīng)實現(xiàn)好run方法的對象放入線程中執(zhí)行
new Thread(r).start();
new Thread(w).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}

好吧,廢了那么大勁兒,就打印了這么一句話,異常拋棄來很煩,為了注重細(xì)節(jié)……


管道流也許很難理解,其實非也
我們知道,字節(jié)流和字符流都需要數(shù)組來進(jìn)行流的中轉(zhuǎn)
而管道流則直接串聯(lián)兩條流,一邊發(fā)送數(shù)據(jù),一邊接收
然而,同時通信的的兩種狀態(tài),如何才能確定發(fā)送和接收的一致性呢
那么,就需要用到線程,無論是接收方還是發(fā)送方先執(zhí)行
總會造成一個線程的阻塞狀態(tài),從而等待另一方的數(shù)據(jù)傳過來
總體而言,管道流的目的,也就是為了線程通信
此外,還有PipedReader和PipedWriter類,操作原理都一樣,這里就不再贅述了
DataOutputStream和DataInputStream類
實例4:基本數(shù)據(jù)類型的寫入

復(fù)制代碼 代碼如下:

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
DataOutputStream d = null;
try {
//此處需要傳入一個OutputStream類的對象
d = new DataOutputStream(new FileOutputStream(path));
//開始寫入基本數(shù)據(jù)類型
d.writeInt(12);
d.writeBoolean(true);
d.writeDouble(12.2223);
d.writeChar(97);
//刷新流
d.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
d.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

此處我們并不能直觀看懂內(nèi)容,因為它采用字節(jié)流的方式操作,而不是字符流
我們只需要知道,此程序已經(jīng)將基本數(shù)據(jù)類型寫入到硬盤即可


實例5:基本數(shù)據(jù)類型的讀取

復(fù)制代碼 代碼如下:

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
DataInputStream d = null;
try {
d = new DataInputStream(new FileInputStream(path));
//按存儲順序讀取基本數(shù)據(jù)類型
System.out.println(d.readInt());
System.out.println(d.readBoolean());
System.out.println(d.readDouble());
System.out.println(d.readChar());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
d.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

這里要注意的是,一定要按照寫入順序讀取,否則會發(fā)生數(shù)據(jù)的打印錯誤

相關(guān)文章

  • Java讀取OpenSSL生成的PEM公鑰文件操作

    Java讀取OpenSSL生成的PEM公鑰文件操作

    這篇文章主要介紹了Java讀取OpenSSL生成的PEM公鑰文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • idea2020中復(fù)制一個微服務(wù)實例的方法

    idea2020中復(fù)制一個微服務(wù)實例的方法

    這篇文章主要介紹了idea2020中復(fù)制一個微服務(wù)實例的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • java接收ios文件上傳的示例代碼

    java接收ios文件上傳的示例代碼

    這篇文章主要為大家詳細(xì)介紹了java接收ios文件上傳的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 深入理解Java中的Lambda表達(dá)式

    深入理解Java中的Lambda表達(dá)式

    這篇文章主要介紹了深入理解Java中的Lambda表達(dá)式,Lambda在各編程語言中都是非常重要的特性,而Java中則加入得有些太晚...需要的朋友可以參考下
    2015-07-07
  • 利用Java獲取文件名、類名、方法名和行號的方法小結(jié)

    利用Java獲取文件名、類名、方法名和行號的方法小結(jié)

    這篇文章運用實例代碼給大家介紹了利用Java怎樣獲取文件名、類名、方法名和行號,有需要的可以參考借鑒,下面一起來看看吧。
    2016-08-08
  • SpringBoot 利用thymeleaf自定義錯誤頁面

    SpringBoot 利用thymeleaf自定義錯誤頁面

    這篇文章主要介紹了SpringBoot 利用thymeleaf自定義錯誤頁面,幫助大家更好的理解和使用springboot 框架,感興趣的朋友可以了解下
    2020-11-11
  • Spring核心思想之淺談IoC容器與依賴倒置(DI)

    Spring核心思想之淺談IoC容器與依賴倒置(DI)

    文章介紹了Spring的IoC和DI機(jī)制,以及MyBatis的動態(tài)代理,通過注解和反射,Spring能夠自動管理對象的創(chuàng)建和依賴注入,而MyBatis則通過動態(tài)代理實現(xiàn)了接口方法到數(shù)據(jù)庫操作的映射,文章詳細(xì)解釋了Spring和MyBatis的工作原理,并通過示例代碼展示了它們的結(jié)合使用方式
    2025-01-01
  • SpringBoot中如何進(jìn)行全局異常處理方式

    SpringBoot中如何進(jìn)行全局異常處理方式

    在SpringBoot開發(fā)過程中,全局異常處理能提高程序的魯棒性并降低代碼耦合,通過使用@RestControllerAdvice和@ExceptionHandler注解,可以實現(xiàn)對程序異常的全局?jǐn)r截和處理,首先需要自定義一個繼承自ResponseEntityExceptionHandler的異常處理類
    2024-11-11
  • Mybatis懶加載的實現(xiàn)

    Mybatis懶加載的實現(xiàn)

    這篇文章主要介紹了Mybatis懶加載的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Netty與NIO超詳細(xì)講解

    Netty與NIO超詳細(xì)講解

    Netty本質(zhì)上是一個NIO的框架,適用于服務(wù)器通訊相關(guān)的多種應(yīng)用場景。底層是NIO,NIO底層是Java?IO和網(wǎng)絡(luò)IO,再往下是TCP/IP協(xié)議,下面我們跟隨文章來詳細(xì)了解
    2022-08-08

最新評論

乐安县| 锡林浩特市| 固阳县| 从江县| 茶陵县| 哈尔滨市| 长岛县| 临沧市| 临颍县| 涿州市| 全南县| 墨玉县| 汶上县| 苍山县| 江北区| 赤水市| 巫山县| 景宁| 通城县| 县级市| 昭苏县| 马鞍山市| 苏尼特右旗| 蓬安县| 建阳市| 伊宁县| 重庆市| 秀山| 西峡县| 峨边| 宁安市| 廊坊市| 渑池县| 凤庆县| 和平区| 渝中区| 康保县| 阿鲁科尔沁旗| 洱源县| 五华县| 鄂托克前旗|