1.輸出字符流:BufferedWriter
----------| Writer 所有輸出字符流的基類棠笑, 抽象類构订。
--------------- | FileWriter 向文件輸出字符數(shù)據(jù)的輸出字符流。
----------------| BufferedWriter 緩沖輸出字符流 緩沖輸出字符流作用: 提高FileWriter的寫數(shù)據(jù)效率與拓展FileWriter的功能妒茬。
BufferedWriter內(nèi)部只不過是提供了一個(gè)8192長(zhǎng)度的字符數(shù)組作為緩沖區(qū)而已束倍,拓展了FileWriter的功能。
BufferedWriter如何使用乱顾?
1. 找到目標(biāo)文件
2. 建立數(shù)據(jù)的輸出通道
package cn.itcast.buffered;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
//找到目標(biāo)文件
File file = new File("F:\\a.txt");
//建立數(shù)據(jù)的輸出通道
FileWriter fileWriter = new FileWriter(file,true);
//建立緩沖輸出流對(duì)象
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//寫出數(shù)據(jù)
// bufferedWriter.newLine(); //newLine() 換行板祝。 實(shí)際上就是想文件輸出\r\n.
bufferedWriter.write("\r\n");
bufferedWriter.write("前兩天李克強(qiáng)來蘿崗!走净!");
//關(guān)閉資源
bufferedWriter.flush();
// bufferedWriter.close();
}
}
2.輸入字符流: BufferedReader
-------| Reader 所有輸入字符流的基類扔字。 抽象類
----------| FileReader 讀取文件字符串的輸入字符流。
----------| BufferedReader 緩沖輸入字符流 温技。 緩沖 輸入字符流出現(xiàn)的目的是為了提高讀取文件 的效率和拓展了FileReader的功能革为。 其實(shí)該類內(nèi)部也是維護(hù)了一個(gè)字符數(shù)組
記住:緩沖流都不具備讀寫文件的能力舵鳞。
BufferedReader的使用步驟:
1.找到目標(biāo)文件
2 .建立數(shù)據(jù)的輸入通道震檩。
package cn.itcast.buffered;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
public class Demo1 {
public static void main(String[] args) throws IOException {
// readTest1();
File file = new File("F:\\1208project\\day21\\src\\cn\\itcast\\buffered\\Demo1.java");
//建立數(shù)據(jù)的輸入通道。
FileReader fileReader = new FileReader(file);
String line = null;
while((line = myReadLine(fileReader))!=null){
System.out.println(line);
}
}
//自己去實(shí)現(xiàn)readLine方法蜓堕。
public static String myReadLine(FileReader fileReader) throws IOException{
//創(chuàng)建一個(gè)字符串緩沖類對(duì)象
StringBuilder sb = new StringBuilder(); //StringBuilder主要是用于存儲(chǔ)讀取到的數(shù)據(jù)
int content = 0 ;
while((content = fileReader.read())!=-1){
if(content=='\r'){
continue;
}else if(content=='\n'){
break;
}else{
//普通字符
sb.append((char)content);
}
}
//代表已經(jīng)讀取完畢了抛虏。
if(content ==-1){
return null;
}
return sb.toString();
}
public static void readTest1() throws IOException{
//找到目標(biāo)文件
File file = new File("F:\\a.txt");
//建立數(shù)據(jù)的輸入通道。
FileReader fileReader = new FileReader(file);
//建立緩沖輸入字符流
BufferedReader bufferedReader = new BufferedReader(fileReader);
//讀取數(shù)據(jù)
/*int content = bufferedReader.read(); //讀到了一個(gè)字符套才。 讀取到的字符肯定也是從Bufferedreader內(nèi)部的字符數(shù)組中獲取的到迂猴。所以效率高。
System.out.println((char)content);*/
//使用BUfferedReader拓展的功能背伴,readLine() 一次讀取一行文本沸毁,如果讀到了文件的末尾返回null表示。
String line = null;
while((line = bufferedReader.readLine())!=null){ // 雖然readLine每次讀取一行數(shù)據(jù)傻寂,但是但會(huì)的line是不包含\r\n的息尺、
System.out.println(Arrays.toString("aaa".getBytes()));
}
//關(guān)閉資源
bufferedReader.close();
}
}
3.輸入字符流FileReader
字節(jié)流:字節(jié)流讀取的是文件中的二進(jìn)制數(shù)據(jù),讀到的數(shù)據(jù)并不會(huì)幫你轉(zhuǎn)換成你看得懂的字符疾掰。
字符流: 字符流會(huì)把讀取到的二進(jìn)制的數(shù)據(jù)進(jìn)行對(duì)應(yīng) 的編碼與解碼工作搂誉。 字符流 = 字節(jié)流 + 編碼(解碼)
輸入字符流:
----------| Reader 輸入字符流的基類 抽象類
-------------| FileReader 讀取文件的輸入字符流。
FileReader的用法:
1. 找到目標(biāo)文件
2. 建立數(shù)據(jù)的輸入通道
3. 讀取數(shù)據(jù)
4. 關(guān)閉資源
package cn.itcast.reader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
readTest2();
}
//使用緩沖字符數(shù)組讀取文件静檬。
public static void readTest2() throws IOException{
//找到目標(biāo)文件
File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
// 建立數(shù)據(jù)的輸入通道
FileReader fileReader = new FileReader(file);
//建立緩沖字符數(shù)組讀取文件數(shù)據(jù)
char[] buf = new char[1024];
int length = 0 ;
while((length = fileReader.read(buf))!=-1){
System.out.print(new String(buf,0,length));
}
}
public static void readTest1() throws IOException{
//找到目標(biāo)文件
File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
//建立數(shù)據(jù)的輸入通道
FileReader fileReader = new FileReader(file);
int content = 0 ;
while((content = fileReader.read())!=-1){ //每次只會(huì)讀取一個(gè)字符炭懊,效率低。
System.out.print((char)content);
}
//關(guān)閉資源
fileReader.close();
}
}
4.FileWriter輸出字符流:
------| Writer 輸出字符流的基類拂檩。 抽象類
-----------| FileWriter 向文件數(shù)據(jù)數(shù)據(jù)的輸出字符流
FileWriter的使用步驟:
1. 找到目標(biāo)文件侮腹。
2. 建立數(shù)據(jù)輸出通道
3. 寫出數(shù)據(jù)。
4. 關(guān)閉資源
FileWriter要注意的事項(xiàng):
1. 使用FileWriter寫數(shù)據(jù)的時(shí)候广恢,F(xiàn)ileWriter內(nèi)部是維護(hù)了一個(gè)1024個(gè)字符數(shù)組的凯旋,寫數(shù)據(jù)的時(shí)候會(huì)先寫入到它內(nèi)部維護(hù)的字符數(shù)組中,如果需要
把數(shù)據(jù)真正寫到硬盤上,需要調(diào)用flush或者是close方法或者是填滿了內(nèi)部的字符數(shù)組至非。
2. 使用FileWriter的時(shí)候钠署,如果目標(biāo)文件不存在,那么會(huì)自動(dòng)創(chuàng)建目標(biāo)文件荒椭。
3.使用FileWriter的時(shí)候谐鼎, 如果目標(biāo)文件已經(jīng)存在了,那么默認(rèn)情況會(huì)先情況文件中的數(shù)據(jù)趣惠,然后再寫入數(shù)據(jù) 狸棍, 如果需要在原來的基礎(chǔ)上追加數(shù)據(jù),
需要使用“new FileWriter(File , boolean)”的構(gòu)造方法味悄,第二參數(shù)為true草戈。
package cn.itcast.writer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
writeTest1();
}
public static void writeTest1() throws IOException{
//找到目標(biāo)文件
File file = new File("F:\\a.txt");
//建立數(shù)據(jù)輸出通道
FileWriter fileWriter = new FileWriter(file,true);
//準(zhǔn)備數(shù)據(jù),把數(shù)據(jù)寫出
String data = "今天天氣非常好J躺唐片!";
fileWriter.write(data); //字符流具備解碼的功能。
//刷新字符流
// fileWriter.flush();
//關(guān)閉資源
fileWriter.close();
}
}
練習(xí): 使用字符流拷貝一個(gè)文本文件(java文件).
package cn.itcast.writer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//使用字符流拷貝文件
public class Copy {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader("F:\\Test.txt"));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("E:\\Test.exe"));
String line=null;
while((line = bufferedReader.readLine())!=null){
bufferedWriter.write(line);
}
bufferedWriter.close();
bufferedReader.close();
}
}
5.何時(shí)使用字符流涨颜,何時(shí)使用字節(jié)流费韭?依據(jù)是什么?
使用字符流的應(yīng)用場(chǎng)景: 如果是讀寫字符數(shù)據(jù)的時(shí)候則使用字符流庭瑰。
使用字節(jié)流的應(yīng)用場(chǎng)景: 如果讀寫的數(shù)據(jù)都不需要轉(zhuǎn)換成字符的時(shí)候星持,則使用字節(jié)流。