IO 復(fù)習(xí)
File
- 構(gòu)造方法
File(String pathName);
// 通過將給定路徑名字字符串轉(zhuǎn)為抽象路徑來創(chuàng)建一個(gè)新的File實(shí)例叙淌。
File(File parent, String child);
// 根據(jù)parent抽象路徑名和child路徑名字符串創(chuàng)建一個(gè)新的File實(shí)例。
File類的高級(jí)獲取
- 常用方法
String list();
// 返回一個(gè)字符串?dāng)?shù)組焕窝,這些字符串指定抽象路徑名和文件
File listFiles();
// 返回一個(gè)抽象路徑名數(shù)組姓迅,這些路徑名表示抽象路徑名中的文件
- 分析過程
private static void searchFiles(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
if (f.isFile) {
sysout(f);
} else {
// 重復(fù)上面的邏輯
searchFiles(f);
}
}
}
}
}
FileReader
- 專門讀取字符數(shù)據(jù)的
public class FileReader extends InputStreamReader
- 構(gòu)造方法
FileReader(String fileName)
// 在給定從中去讀數(shù)據(jù)的文件名的情況下創(chuàng)建一個(gè)新的FileReader
- 常用方法
int read(); // 讀取單個(gè)字符传轰。
// 讀取的字符數(shù)蒲祈,如果已到達(dá)流的末尾,則返回 -1
int read(char[] cbuf); // 將字符讀入數(shù)組峭范。
// 讀取的字符數(shù)财松,如果已到達(dá)流的末尾,則返回 -1
- 示例代碼
Reader reader = new FileReader("c:/1.txt");
char[] buf = new char[5];
// 讀取數(shù)據(jù)到緩沖數(shù)組中
int len;
while ((len = reader.read(buf)) != -1) {
sysout(new String(buf, 0, len));
}
FileWriter
- 專門往文件中寫字符數(shù)據(jù)的
public class FileWriter extends OutputStreamWriter
- 構(gòu)造方法
FileWriter(String fileName); // 根據(jù)給定的文件名構(gòu)造一個(gè)FileWriter對(duì)象。
FileWriter(String fileName, boolean append);// 根據(jù)給定的文件名以及指示是否附加寫入數(shù)據(jù)的boolean值來構(gòu)造FileWriter對(duì)象辆毡。
- 常用方法
void write(String str); //寫入字符串菜秦。
abstract void write(char[] cbuf, int off, int len) // 寫入字符數(shù)組的某一部分
- 分析過程
// 寫數(shù)據(jù)
writer.write("我是大魔王");
writer.flush();
// 字符流底層都是有緩沖區(qū)的,當(dāng)我們調(diào)用寫的方法的時(shí)候舶掖,是把數(shù)據(jù)寫入底層的緩沖區(qū)
- 示例代碼
// 寫字符數(shù)據(jù)
Writer writer = new FileWriter("c:/1.txt");
// 寫操作
writer.write("我是大魔王");
// 字符流的寫是寫入底層的緩沖區(qū)球昨,要把數(shù)據(jù)寫到文件上還需要刷新緩沖區(qū)
// 刷新緩沖區(qū)
writer.flush();// 沒有刷新緩沖區(qū),數(shù)據(jù)是不會(huì)寫入文件的
拷貝文本文件
- 字節(jié)流
private static void byByteStream() throws Exception {
InputStream is = new FileInputStream("c:/1.java");
OutputStream out = new FileOutputStream("c:/2.java");
int len;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
// 邊讀邊寫
out.wirte(buf, 0, len);
}
// 關(guān)閉資源
is.close();
out.close();
}
- 字符流
private static void byCharStream() throws Exception {
Reader reader = new FileReader("c:/1.java");
Writer writer = new FileWriter("c:/2.java");
char[] cbuf = new char[1024];
int len;
while ((len = reader.read(buf)) != -1) {
writer.write(cbuf, 0, len);
}
// 關(guān)閉資源
reader.close();
writer.close();
}
字符的編碼和解碼
編碼與解碼之間的轉(zhuǎn)換關(guān)系
編碼:字符-->字節(jié)
解碼:字節(jié)-->字符
他們之間的轉(zhuǎn)換靠的是編碼表
- String的編碼方法
byte[] getBytes();
// 使用平臺(tái)的默認(rèn)字符集將次String編碼為byte序列眨攘,并將結(jié)果存儲(chǔ)到一個(gè)新的byte數(shù)組中主慰。
byte[] getBytes(String charsetName)
// 使用指定的字符集將次String編碼為byte序列,并將結(jié)果存儲(chǔ)到一個(gè)新的byte數(shù)組中鲫售。
- String的解碼方式依靠構(gòu)造方法
String(byte[] bytes);
// 通過平臺(tái)的默認(rèn)字符集將指定的byte的數(shù)組共螺,構(gòu)造成一個(gè)新的String。
String(byte[] bytes, String charsetName)
// 通過使用指定的charset解碼指定的byte數(shù)據(jù)情竹,構(gòu)造一個(gè)新的String藐不。
轉(zhuǎn)換流
OutputStreamReader--是字符流通向字節(jié)流的橋梁;
InputStreamWriter--是字節(jié)流通向字符流的橋梁秦效。
//準(zhǔn)備好輸出
OutputStream out = new FileOutputStream("c:/2.txt");
//把輸出字節(jié)流轉(zhuǎn)變成輸出字符流
Writer writer = new OutputStreamWriter(out, "utf-8");
writer.write("嘿嘿嘿");
writer.close();
InputStream is = new FileInputStream("c:/2.txt");
Reader reader = new InputStreamReader(is, "utf-8");
int read =reader.read();
System.out.println((char) read);
read.close();
字節(jié)緩存流
用得最多的包裝流就是緩存流雏蛮,默認(rèn)內(nèi)部維護(hù)了一個(gè)8KB的緩存區(qū)(能夠有效的減少IO次數(shù),從而提高IO的操作效率)阱州。
BufferedInputStream is = new BufferedInputStream(new FileInputStream("c:/setup.exe"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("c:/1.ext"));
int len;
byte[] buf = new byte[1024];
// 先讀取數(shù)據(jù)挑秉,在寫數(shù)據(jù)
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 關(guān)閉資源
is.close();
out.close();
字符緩沖流
public class BufferedReader extends Reader
reader.readLine();
可以直接讀取一行數(shù)據(jù)
底層同樣是自帶一個(gè)8K
的緩沖區(qū)
從字符輸入流中讀取文本,緩沖各個(gè)字符贡耽,從而實(shí)現(xiàn)字符衷模、數(shù)組和行的高效讀取。
構(gòu)造方法
BufferedReader(Reader in)
- 創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流
//常用方法
String readLine();// 讀取一個(gè)文本行蒲赂。
public class BufferedWriter extends Writer
//可以直接寫換行阱冶,writer.newLine();
- 構(gòu)造方法
BufferedWriter(Writer out)
// 常用方法
void newLine();// 寫入一個(gè)行分隔符
- 示例代碼
// 字符緩沖流
BufferedReader reader = new BufferedReader(new FileReader("c:/1.java"));
BufferedWriter writer = new BufferedWriter(new FileWriter("c:/2.java"));
String data;
// 直接讀取一行數(shù)據(jù)
while ((data = reader.readLine()) != null) {
writer.write(data);
// 寫一個(gè)換行符
writer.newLine();
}
reader.close();
writer.close();
屬性文件
Properties
類表示了一個(gè)持久的屬性集。
Properties
可保存在流中或者從流中加載滥嘴。
- 屬性列表中每個(gè)鍵以及對(duì)應(yīng)值都是一個(gè)字符串木蹬。
public class Properties extends Hashtable<Object, Object>
// 這個(gè)類是專門用于操作屬性文件properties的
- 為什么要使用文件屬性?
1.解除硬編碼若皱,源代碼是要編譯的镊叁。
2.改善程序的結(jié)構(gòu),有利于日后的維護(hù)走触。
- 構(gòu)造方法
Properties();
創(chuàng)建一個(gè)無默認(rèn)值得空屬性列表晦譬。
- 常用方法
void load(InputStream inStream);
// 從流中讀取屬性列表(鍵和元素對(duì))。
String getProperty(String key);
// 用指定的鍵在此屬性列表中搜索屬性互广。
- 屬性文件的寫法
src=c:/setup.exe
dest=c:/1.exe
- 示例代碼
// 使用Properties文件
Properties p = new Properties();
// 從流中去讀取屬性的配置信息
InputStream in = new FileInputStream("file.properties");
p.load(in);
// 獲取屬性的值
String src = p.getProperty("src");
InputStream is = new FileInputStream(src);
String dest = p.getProperty("dest");
OutputStream out = new FileOutputStream(dest);
ObjectOutputStream
- 用途
把內(nèi)存中的對(duì)象輸出到文件或者把文件中保存的對(duì)象輸入到內(nèi)存
- 目的
為了進(jìn)程之間的數(shù)據(jù)交流
- 構(gòu)造方法
ObjectOutputStream(OutputStream out);
// 創(chuàng)建寫入指定OutputStream的ObjectOutputStream
- 重用方法
void writeObject(Object obj);
// 將指定的對(duì)象寫入ObjectOutputStream敛腌。
- 示例代碼
// 使用對(duì)象的輸出流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c:/1.txt"));
// 寫數(shù)據(jù)
// 寫出的內(nèi)容不是給人看的卧土,是給機(jī)器看的
User u = new User("羅杰斯", 108);
out.writeObject(u);
// 把內(nèi)存中的對(duì)象寫出到硬盤-->序列化
out.close();
- 對(duì)象要序列化必須實(shí)現(xiàn)序列化接口
public class User implements Serializable {
String name;
int age;
}
ObjectInputStream
序列化與反序列化之間的關(guān)系
把內(nèi)存中的對(duì)象寫入硬盤-->序列化
把硬盤中的對(duì)象讀入內(nèi)存-->反序列化
構(gòu)造方法
ObjectInputStream(InputStream in);
// 創(chuàng)建從指定InputStream讀取的ObjectInpuStream對(duì)象。