java I/O
本文主要通過代碼進行知識的複習及代入哈
java IO 中操作文件包括
字節流和字符流
其中字節流使用 inputstream和outputstream及其子類實現操作
字符流則使用文本類型進行操作writer和reader等類
文件的讀寫操作 一般使用fileinputstream 獲取文件地址
使用bufferedinputstream深層快速進行文件的讀取操作
字節流
字節輸入流
inputstream 抽象類 本身不能進行操作 子類包括 FileInputStream [常用操作類]
FileterInputStream[ 子類包括 BuferedInputStream 緩存輸入流 和 DataInputStream 數據流] 和ObjectInputStream
package com.zut.io;
//實現讀取文本中的數字
import java.io.File;
import java.io.FileInputStream;
public class FileDemo {
public static void main(String[] args) throws Exception {
File file = new File("E:\\file.txt");
FileInputStream fileInputStream = new FileInputStream(file);
int b = 0;
byte[] bs = new byte[512];
int i = 0;
while((b = fileInputStream.read()) != -1) {
bs[i] = (byte)b;
i++;
}
System.out.println(new String(bs));
fileInputStream.close();
}
}
FileOutputStream
字節輸出流 子類包括 FileOutputStream[常用操作類]
和 FileterOutputStream ObjectOutputStream
練習:使用高效的字符緩衝流複製文檔
package ch1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 練習:使用高效的字符緩衝流複製文檔
* 複製jdk文檔到工程的根目錄
* 字節流 看不懂
* 字符流 能看懂
*
*/
public class Node01 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
method("e:\\JDK6API中文參考.chm","jdk.chm");
long end = System.currentTimeMillis();
long time = end-start;
System.out.println(time);
}
private static void method(String strstring, String datastring) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(strstring));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(datastring));
byte [] bys = new byte[1024];
int len = 0;
while((len=bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
}
}
字符流
Reader
文本輸入流 包括 inputStreamInput [轉換流將字節輸入流轉換爲字符輸入流] 子類爲FileReader 和 **BufferedReader [ 緩存輸入流] **
文本輸出流 包括 OutputStreamInput [ 轉換流將字節輸出流轉換爲字符輸出流 ] 子類爲FileWriter 和 BufferedWeiter
[ 緩存輸入流]
package com.zut.io;
//實現從鍵盤輸入並輸出到控制檯
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class bufferedInputStreamDemo {
public static void main(String[] args) {
BufferedReader stream = new BufferedReader(new InputStreamReader(System.in));
//BufferedReader 讀取內容爲字符,同時System類爲完全輸入流,
//內容爲InputStream 字節流
//因此使用InputStreamReader進行字節流轉換爲字符流
try {
System.out.println(stream.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
package ch1;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Node04 {
public static void main(String[] args) throws IOException {
long st = System.currentTimeMillis();
tp("E:\\a.txt","ts.txt");
long en = System.currentTimeMillis();
System.out.println("緩衝流複製用的時間爲"+ " "+ (en - st));
}
private static void tp(String string, String datastring) throws IOException {
BufferedReader fss = new BufferedReader(new FileReader(string));
BufferedWriter fsg = new BufferedWriter(new FileWriter(datastring));
/* char [] chs = new char[1024];
int len = 0;
while((len = fss.read(chs))!=-1) {
fsg.write(chs, 0, len);
fsg.flush();
}
fss.close();
fsg.close();
一次複製指定距離
*/
//一次複製一行
String str = null;
while((str = fss.readLine()) != null) {
fsg.write(str);
fsg.newLine();
fsg.flush();
}
fss.close();
fsg.close();
}
}
重點
字符流和字節流的區別?
傳輸的單位不同
字符流:用於處理文字和字符的流。操作完成後不關閉流,數據無法傳遞。
字節流:文字以外的都可以用。操作完成後不需關閉流,也可以傳遞數據。
是否佔用緩存
字符流: 字符流操作時使用了緩衝區
字節流:字節流是直接操作文件本身的。
什麼是轉換流?
轉換流 是將字節流 轉化爲 字符流的中間操作流 實現字節和字符流的互通
serialVersionUID的作用是什麼?
序列版本號,凡是實現Serializable接口的類都有一個表示序列化版本標識符的靜態變量。實現Serializable接口的類如果類中沒有添加serialVersionUID,那麼就會出現警告提示
對象序列化與反序列化
把對象轉換爲字節序列的過程稱爲對象的序列化;把字節序列恢復爲對象的過程稱爲對象的反序列化。
注意 序列化和反序列化只針對於 字節流
只有實現了Serializable和Externalizable接口的類的對象才能被序列化。
Externalizable接口繼承自 Serializable接口
實現Externalizable接口的類完全由自身來控制序列化的行爲。
而僅實現Serializable接口的類可以採用默認的序列化方式
對象反序列化的步驟:
1) 創建一個對象輸入流,它可以包裝一個其他類型的源輸入流,如文件輸入流;
2) 通過對象輸入流的readObject()方法讀取對象
本文完