標準的輸入輸出流:
輸入流:把鍵盤錄入的數(shù)據(jù)寫入文件中;字節(jié)流
public static final InputStream in;
//根據(jù)鍵盤錄入的內(nèi)容復制到文本文件中;
//創(chuàng)建一個鍵盤錄入的流 字節(jié)流
InputStream is = System.in;
//輸出流 字符輸出流 -->高效的字符輸出流
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
//寫數(shù)據(jù)
byte[] bys = new byte[1024];
int len;//每次讀取了多少
//循環(huán)讀寫
while((len = is.read(bys))!= -1){
bw.write(new String(bys,0,len));
//刷新方法一定要寫
bw.flush();
}
//關(guān)閉流
is.close();
bw.close();
輸出流:把文件中的數(shù)據(jù)打印到控制臺上;字節(jié)流
public static final PrintStream out;
把目標文件的內(nèi)容打印到控制臺上
//把目標文件內(nèi)容輸出到命令行
//創(chuàng)建了一個高效的字符輸入流
BufferedReader br = new BufferedReader(new FileReader("文件路徑"));
//創(chuàng)建一個標準的輸出流
OutputStream os = System.out;
//讀取數(shù)據(jù)
String line;
//循環(huán)遍歷
while((line = br.readLine()) != null){
//寫數(shù)據(jù)
os.write(line.getBytes());
//換行
os.write("\r\n".getBytes());
}
//關(guān)閉流
br.close();
os.close();
轉(zhuǎn)換流:當你需要把字節(jié)流封裝成為字符流的時候可以使用轉(zhuǎn)換流進行操作;
OutputStreamWriter:把字節(jié)輸出流轉(zhuǎn)換成為字符輸出流,寫數(shù)據(jù)的時候是可以設置數(shù)據(jù)的編碼格式;
復制文本內(nèi)容到控制臺
//把目標文件內(nèi)容輸出到命令行
//創(chuàng)建輸出輸入流
BufferedReader br = new BufferedReader(new FileReader("文件的路徑"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//讀寫數(shù)據(jù)
String line;
//循環(huán)讀寫
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine();
}
//關(guān)閉流
br.close();
bw.close();
InputStreamReader:把字節(jié)輸入流轉(zhuǎn)換成為字符輸入流,讀數(shù)據(jù)的時候可以設置數(shù)據(jù)的編碼格式;
用高效流完成鍵盤錄入寫入到txt文件中:
//創(chuàng)建一個鍵盤錄入的流 字節(jié)流==>轉(zhuǎn)換流包裝一下 InputStreamReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//輸出流 字符輸出流 -->高效的字符輸出流
BufferedWriter bw = new BufferedWriter(new FileWriter("文件路徑"));
//寫數(shù)據(jù)
String line;
//循環(huán)寫入
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine();
bw.flush();
}
//關(guān)閉流
br.close();
bw.close();
打印流:PrintWriter---->打印字符輸出流
特點:
1.自動換行: 使用打印流中的println;
2.自動刷新: 創(chuàng)建打印流對象的時候使用啟用自動刷新開關(guān)的構(gòu)造方法,
并使用println,printf,format方法寫數(shù)據(jù);
PrintWriter:本身是沒有寫的功能,他是一個包裝流
PrintWriter(File file) ://傳file類型的對象
new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))):
//創(chuàng)建了一個高效的字符輸出流(創(chuàng)建了轉(zhuǎn)換流把字節(jié)輸出流轉(zhuǎn)換成為字符流(創(chuàng)建了字節(jié)流傳入了一個file對象))
PrintWriter(String fileName) ://傳String類型的文件名
new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName))):
//創(chuàng)建了一個高效的字符輸出流(創(chuàng)建了轉(zhuǎn)換流把字節(jié)輸出流轉(zhuǎn)換成為字符流(創(chuàng)建了字節(jié)流傳入了一個String對象))
PrintWriter(OutputStream out) ://傳入字節(jié)流
new BufferedWriter(new OutputStreamWriter(out)):
//創(chuàng)建了一個高效的字符輸出流(創(chuàng)建了一個轉(zhuǎn)換流把字節(jié)輸出流轉(zhuǎn)換成為字符輸出流)
PrintWriter(Writer out) ://傳入字符輸出流? (多態(tài)) 可以傳入字符流所有的子類;
BufferedWriter br = new BufferedWriter(new FileWriter(file));
打印流的特有功能:
1.自動刷新:要啟動自動刷新的開關(guān),在創(chuàng)建打印流對象的時候在目標路徑的后傳入true;
2.自動換行:必須要使用println,printf,format這三個方法實現(xiàn),并且要同時打開我們的autoFlush開關(guān)
打印流復制文本文件:
BufferedReader br = new BufferedReader(new FileReader("文件路徑"));
PrintWriter pw = new PrintWriter(new FileWriter("目標路徑"),是否開啟刷新);
String line;
while ((line = br.readLine())!= null) {
pw.println(line);//直接使用println()
}
br.close();
pw.close();
對象操作流:
ObjectOutputStream:對象輸出流
ObjectInputStream:對象輸入流
注意:
1.使用對象操作流的對象必須實現(xiàn)Serializable接口
2.使用對象輸出流寫出數(shù)據(jù)必須也要使用對象輸入流讀取數(shù)據(jù);
NotSerializableException:
產(chǎn)生原因:使用對象操作流的對象沒有實現(xiàn)Serializable接口生成一個UID;
解決辦法:實現(xiàn)Serializable接口并生成一個UID(辨識碼)
EOFException:
產(chǎn)生原因:讀到了文件的末尾;
解決辦法:
利用try..catch把異常捕獲并提示;
另一種解決EOFException的方法:
1.創(chuàng)建一個集合對象,把我們要操作的對象存入到集合中去;
2.然后利用對象輸出流(ObjectOutputStream) 把集合對象寫到文本中去;
3.當我們讀取這個裝有對象信息的文件時,我們可以只用讀取一次數(shù)據(jù),把集合對象給獲取出來
4.遍歷集合對象,獲取集合對象中存儲的其他對象元素;
Properties://持久的屬性集 以后更多的使用是作為配置文件
特點:
1.它的鍵和值都是String類型的;
2.Properties是沒有泛型的;
//添加功能
put方法(和Map集合很相似)
setProperties(String key,String value):
Properties的遍歷方式:
1.獲取所有的鍵,根據(jù)鍵找值;
2.獲取所有的鍵值對對象,根據(jù)鍵值對對象的集合,獲取相應的鍵和值;
Properties和IO一起使用的方法:
void list(PrintWriter out)? :根據(jù)傳入的輸出流,把properties里面的數(shù)據(jù)寫入到指定文件中;
void store(Writer writer, String comments)
:根據(jù)傳入的字符輸出流,把properties里面的數(shù)據(jù)寫入到指定文件中,并可以加上說明;
若不想寫說明,直接在第二個參數(shù)傳null;
//步驟:
1.創(chuàng)建propreties的對象
Properties prop = new Properties();
2.添加元素;
prop.put(String,String);
3.創(chuàng)建輸出流對象;
FileWriter fw = new FileWriter("文件路徑");
4.調(diào)用list或者store方法;
prop.list(fw);
5.關(guān)閉流;
fw.close();
void load(InputStream inStream)? :根據(jù)傳入的字節(jié)輸入流,把文件中的數(shù)據(jù)存儲到propreties的屬性集中;
//步驟:
1.創(chuàng)建propreties的對象;
Properties prop = new Properties();
2.創(chuàng)建輸入流對象;
FileInputStream fis = new FileInputStream("文件路徑");
3.調(diào)用load方法,把文件中的屬性添加到集合中去
prop.load(fis);//加載
4.關(guān)閉流;
fis.close();
常用流:
字節(jié)流:
FileInputStream; -->InputStream
FileOutputStream;-->OutputStream
字符流:
BufferedWriter;-->Writer
BufferedReader;-->Reader
編碼://我們用代碼的形式規(guī)定編碼格式的時候很少;一般通過修改文件的屬性去完成整理亂碼的功能
普通方式修改編碼:
直接修改文件的編碼格式就可以了
用代碼的方式修改編碼格式
對已有的數(shù)據(jù)進行字符編碼格式的操作
String的構(gòu)造方法:
String(byte[] bytes, int offset, int length, String charsetName) :
//根據(jù)傳入的字節(jié)數(shù)組長度,把這個字節(jié)數(shù)組轉(zhuǎn)換成為字符串數(shù)據(jù)并限定編碼格式
String(byte[] bytes, String charsetName) :
//根據(jù)傳入的字節(jié)數(shù)組,把這個字節(jié)數(shù)組轉(zhuǎn)換成為字符串數(shù)據(jù)并限定編碼格式;
String的成員方法:
byte[] getBytes(String charsetName) :返回一個字節(jié)數(shù)組并對字節(jié)數(shù)組的編碼格式進行限定;
若以后想對讀寫的數(shù)據(jù)限定編碼格式,歡迎使用轉(zhuǎn)換流;
在讀寫數(shù)據(jù)的時候,就規(guī)定編碼格式,我們使用轉(zhuǎn)換流來完成讀寫功能;
種類:
ASCII-->GB2312-->GBK --->Unicode-->UTF-8(長度可變)
對于這章的知識董栽,我只是習慣用高效的輸入和輸出流埃元,而對于數(shù)據(jù)操作我喜歡一次讀取一行數(shù)據(jù)。