April 27th
- 字符流
- 文本文件用字節(jié)流讀取 可能會(huì)出現(xiàn)亂碼,所以要用到字符流
fileWriter是有緩存的,先存到緩存中,字節(jié)流沒有緩存直接寫到文件中。
out.flush(), 刷新緩存
關(guān)閉的時(shí)候會(huì)調(diào)用刷新的方法
字符輸出流
按照字符來進(jìn)行讀取,一個(gè)英文是一個(gè)字符,一個(gè)中文也是一個(gè)字符
如果操作的是文本類型的文件,使用字符流操作,
如果是非文本類型的文件,使用字節(jié)流操作。
-
字符輸入流字符輸入
- 字節(jié)字符轉(zhuǎn)換流
復(fù)制文件
public class CopyFileDemo {
public static void copyFile(File target, String dest) {
String fileName = target.getName();
File destFile = new File(dest + fileName);
try {
InputStream in = new FileInputStream(target);
OutputStream out = new FileOutputStream(destFile);
byte[] bytes = new byte[1024];
int len = -1;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
out.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}public static void main(String[] args) {
// TODO Auto-generated method stub
File Target = new File("http://Users//Zellerpooh//Desktop//images//dddddb.jpg");
String dest = "http://Users//Zellerpooh//Desktop";
copyFile(Target, dest);
System.out.println("文件復(fù)制成功");
}
} ```
交換
```
public class ChangeStreamDemo {
public static String reader(InputStream in){
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
try {
return reader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
// Reader reader=new InputStreamReader(in);
// char[] cs=new char[1024];
// int len=-1;
// StringBuffer buf=new StringBuffer();
// try {
// while((len=reader.read(cs))!=-1){
// buf.append(new String(cs,0,len));
// }
// reader.close();
// return buf.toString();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// return null;
}
public static void main(String[] args) {
// Scanner input=new Scanner(System.in); 控制臺(tái)輸入,只有字節(jié)流
String info=reader(System.in);
System.out.println(info);
}
}
```
3. 緩沖流
對(duì)文件或其它目標(biāo)頻繁的讀寫操作,效率低,性能差。
首先要明確一個(gè)概念:
使用緩沖流的好處是,能夠更高效的讀寫信息,原理是將數(shù)據(jù)先緩沖起來,然后一起寫入或者讀取出來
BufferedInputStream: 為另一個(gè)輸入流添加一些功能,在創(chuàng)建 BufferedInputStream 時(shí),會(huì)創(chuàng)建一個(gè)內(nèi)部緩沖區(qū)數(shù) 組,用于緩沖數(shù)據(jù)。
BufferedOutputStream:通過設(shè)置這種輸出流,應(yīng)用程序就可以將各個(gè)字節(jié)寫入底層輸出流中,而不必針對(duì)每次字 節(jié)寫入調(diào)用底層系統(tǒng)。
BufferedReader:從字符輸入流中讀取文本,緩沖各個(gè)字符,從而實(shí)現(xiàn)字符、數(shù)組和行的高效讀取。
BufferedWriter:將文本寫入字符輸出流,緩沖各個(gè)字符,從而提供單個(gè)字符、數(shù)組和字符串的高效寫入。




4. 打印流
打印流的主要功能是用于輸出,在整個(gè)IO包中打印流分為兩種類型: 字節(jié)打印流:PrintStream
字符打印流:PrintWriter
打印流可以很方便的進(jìn)行輸出
5. 對(duì)象流
效率不高,真實(shí)使用時(shí)很少使用
> 類需要實(shí)現(xiàn)Serializable接口 transient 表示該屬性不用序列化

6. 字節(jié)數(shù)組流
包含一個(gè)內(nèi)部緩沖區(qū),該緩沖區(qū)包含從流中讀取的字節(jié)。內(nèi)部計(jì)數(shù)器跟蹤 read 方法要提供的下一個(gè)字節(jié)。 關(guān)閉
ByteArrayInputStream
ByteArrayInputStream 無效。此類中的方法在關(guān)閉此流后仍可被調(diào)用,而不會(huì)產(chǎn)生任何 IOException。 ByteArrayOutputStream
此類實(shí)現(xiàn)了一個(gè)輸出流,其中的數(shù)據(jù)被寫入一個(gè) byte 數(shù)組。緩沖區(qū)會(huì)隨著數(shù)據(jù)的不斷寫入而自動(dòng)增長(zhǎng)??墒褂?toByteArray() 和 toString() 獲取數(shù)據(jù)。 關(guān)閉 ByteArrayOutputStream 無效。此類中的方法在關(guān)閉此流后仍可被調(diào) 用,而不會(huì)產(chǎn)生任何 IOException。
7. 數(shù)據(jù)流
DataInputStream:
數(shù)據(jù)輸入流允許應(yīng)用程序以與機(jī)器無關(guān)方式從底層輸入流中讀取基本 Java 數(shù)據(jù)類型。應(yīng)用程序可以使用數(shù)據(jù)輸出 流寫入稍后由數(shù)據(jù)輸入流讀取的數(shù)據(jù)。 DataInputStream 對(duì)于多線程訪問不一定是安全的。 線程安全是可選的, 它由此類方法的使用者負(fù)責(zé)。
DataOutputStream:
數(shù)據(jù)輸出流允許應(yīng)用程序以適當(dāng)方式將基本 Java 數(shù)據(jù)類型寫入輸出流中。然后,應(yīng)用程序可以使用數(shù)據(jù)輸入流將 數(shù)據(jù)讀入。
8. 字符串流
StringReader 其源為一個(gè)字符串的字符流。
StringWriter
一個(gè)字符流,可以用其回收在字符串緩沖區(qū)中的輸出來構(gòu)造字符串。 關(guān)閉 StringWriter 無效。此類中的方法在關(guān)閉 該流后仍可被調(diào)用,而不會(huì)產(chǎn)生任何 IOException。
9. RandomAccessFile
RanndomAccessFile是IO包的類,從Object直接繼承而來。 只可以對(duì)文件進(jìn)行操作,可以對(duì)文件進(jìn)行讀取和寫入。 當(dāng)模式為r是,當(dāng)文件不存在時(shí)會(huì)報(bào)異常,當(dāng)模式為rw時(shí),當(dāng)文件不存在時(shí),會(huì)自己動(dòng)創(chuàng)建文件,當(dāng)文件已經(jīng) 存在時(shí) 不會(huì)對(duì)原有文件進(jìn)行覆蓋。
RandomAccessFile有強(qiáng)大的文件讀寫功能,其內(nèi)部是大型 byte[],可以通過seek(),getFilePointer()等方法操作的 指針,方便對(duì)數(shù)據(jù)進(jìn)行寫入與讀取。還可以對(duì)基本數(shù)據(jù)類型進(jìn)行直接的讀和寫操作。
RandomAccessFile的絕大多數(shù)功能,已經(jīng)被JDK 1.4的nio的“內(nèi)存映射文件(memory‐mapped files)”給取代了,你該考 慮一下是不是用“內(nèi)存映射文件”來代替RandomAccessFile了。
