Java——IO總結2
位元組陣列流ByteArrayInputStream和ByteArrayOutputStream
經常用在需要流和陣列之間轉化
FileInputStream是把檔案當做資料來源。ByteArrayInputStream則是把記憶體中的”某個位元組陣列物件”當做資料來源。
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class TestByteArray {
public static void main(String[] args) {
//將字串轉變成位元組陣列
byte[] b = "abcdefg".getBytes();
test(b);
}
public static void test(byte[] b) {
ByteArrayInputStream bais = null;
StringBuilder sb = new StringBuilder();
int temp = 0;
//用於儲存讀取的位元組數
int num = 0;
try {
//該構造方法的引數是一個位元組陣列,這個位元組陣列就是資料來源
bais = new ByteArrayInputStream(b);
while ((temp = bais.read()) != -1) {
sb.append((char) temp);
num++;
}
System.out.println(sb);
System.out.println("讀取的位元組數:" + num);
} finally {
try {
if (bais != null) {
bais.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
資料流DataInputStream和DataOutputStream
資料流將“基本資料型別與字串型別”作為資料來源,從而允許程式以與機器無關的方式從底層輸入輸出流中操作Java基本資料型別與字串型別。
public class TestDataStream {
public static void main(String[] args) {
DataOutputStream dos = null;
DataInputStream dis = null;
FileOutputStream fos = null;
FileInputStream fis = null;
try {
fos = new FileOutputStream("D:/data.txt");
fis = new FileInputStream("D:/data.txt");
//使用資料流對緩衝流進行包裝,新增緩衝功能
dos = new DataOutputStream(new BufferedOutputStream(fos));
dis = new DataInputStream(new BufferedInputStream(fis));
//將如下資料寫入到檔案中
dos.writeChar('a');
dos.writeInt(10);
dos.writeDouble(Math.random());
dos.writeBoolean(true);
dos.writeUTF("北京尚學堂");
//手動重新整理緩衝區:將流中資料寫入到檔案中
dos.flush();
//直接讀取資料:讀取的順序要與寫入的順序一致,否則不能正確讀取資料。
System.out.println("char: " + dis.readChar());
System.out.println("int: " + dis.readInt());
System.out.println("double: " + dis.readDouble());
System.out.println("boolean: " + dis.readBoolean());
System.out.println("String: " + dis.readUTF());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(dos!=null){
dos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(dis!=null){
dis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fos!=null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fis!=null){
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
物件流
如果要對某個物件進行讀寫操作,我們需要學習一對新的處理流:ObjectInputStream/ObjectOutputStream。
ObjectInputStream/ObjectOutputStream是以“物件”為資料來源,但是必須將傳輸的物件進行序列化與反序列化操作。
注:序列化實體類實現序列化介面時
serialVersionUID適用於Java的序列化機制。簡單來說,Java的序列化機制是透過判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常,即是InvalidCastException。
public class TestObjectStream {
public static void main(String[] args) throws IOException, ClassNotFoundException {
write();
read();
}
public static void write(){
// 建立Object輸出流,幷包裝緩衝流,增加緩衝功能
OutputStream os = null;
BufferedOutputStream bos = null;
ObjectOutputStream oos = null;
try {
os = new FileOutputStream(new File("d:/bjsxt.txt"));
bos = new BufferedOutputStream(os);
oos = new ObjectOutputStream(bos);
// 使用Object輸出流
//物件流也可以對基本資料型別進行讀寫操作
oos.writeInt(12);
oos.writeDouble(3.14);
oos.writeChar('A');
oos.writeBoolean(true);
//物件流能夠對物件資料型別進行讀寫操作
//Date是系統提供的類,已經實現了序列化介面
//如果是自定義類,則需要自己實現序列化介面
oos.writeObject(new Date());
} catch (IOException e) {
e.printStackTrace();
} finally {
//關閉輸出流
if(oos != null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bos != null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void read() {
// 建立Object輸入流
InputStream is = null;
BufferedInputStream bis = null;
ObjectInputStream ois = null;
try {
is = new FileInputStream(new File("d:/bjsxt.txt"));
bis = new BufferedInputStream(is);
ois = new ObjectInputStream(bis);
// 使用Object輸入流按照寫入順序讀取
System.out.println(ois.readInt());
System.out.println(ois.readDouble());
System.out.println(ois.readChar());
System.out.println(ois.readBoolean());
System.out.println(ois.readObject().toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關閉Object輸入流
if(ois != null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bis != null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
轉換流
InputStreamReader/OutputStreamWriter用來實現將位元組流轉化成字元流。
System.in是位元組流物件,代表鍵盤的輸入,如果我們想按行接收使用者的輸入時,就必須用到緩衝字元流BufferedReader特有的方法readLine(),但是經過觀察會發現在建立BufferedReader的構造方法的引數必須是一個Reader物件,這時候我們的轉換流。
而System.out也是位元組流物件,代表輸出到顯示器,按行讀取使用者的輸入後,並且要將讀取的一行字串直接顯示到控制檯,就需要用到字元流的write(String str)方法,所以我們要使用OutputStreamWriter將位元組流轉化為字元流。
使用InputStreamReader接收使用者的輸入,並輸出到控制檯
public class TestConvertStream {
public static void main(String[] args) {
// 建立字元輸入和輸出流:使用轉換流將位元組流轉換成字元流
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 使用字元輸入和輸出流
String str = br.readLine();
// 一直讀取,直到使用者輸入了exit為止
while (!"exit".equals(str)) {
// 寫到控制檯
bw.write(str);
bw.newLine();// 寫一行後換行
bw.flush();// 手動重新整理
// 再讀一行
str = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關閉字元輸入和輸出流
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
©著作權歸作者所有:來自51CTO部落格作者huingsn的原創作品,如需轉載,請註明出處,否則將追究法律責任
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2819471/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java中IO流學習總結Java
- Java知識點總結——IO流框架Java框架
- Java中IO流的知識點總結Java
- android IO流操作總結Android
- Io流階段大總結
- 總結java建立資料夾的4種方法及其優缺點-JAVA IO基礎總結第三篇Java
- IO多路複用技術總結
- 歸納從檔案中讀取資料的六種方法-JAVA IO基礎總結第2篇Java
- 總結刪除檔案或資料夾的7種方法-JAVA IO基礎總結第4篇Java
- IO流中「執行緒」模型總結執行緒模型
- java總結Java
- 第三週:java物件導向部分總結(2)Java物件
- Java位元組流和字元流,是時候總結一下IO流了Java字元
- C IO複用select, epoll 簡單總結
- 2024.3 總結 2
- Java Servet 總結Java
- java Stack總結Java
- CTF 中 glibc堆利用 及 IO_FILE 總結
- [java IO流]之 IO概述Java
- CSS技巧總結2CSS
- CUDA總結2——cudaMemcpymemcpy
- yii2 總結
- 10.6每日總結2
- 2024暑假總結2
- 每週總結2
- java常用Api總結JavaAPI
- java面試總結Java面試
- Java 容器系列總結Java
- java -IO流Java
- Java IO流Java
- Java IO: 流Java
- Java IO: InputStreamJava
- Java IO: OutputStreamJava
- Java IO流Java
- java - IO流Java
- Java IO框架總攬–ObjectInputStream& ObjectOutputStream原始碼解讀Java框架Object原始碼
- shell學習總結-2
- Vue知識總結(2)Vue