File類IO操作(二)
阿新 • • 發佈:2019-01-24
FileReader
/*
位元組流:位元組流讀取的是檔案中的二進位制資料,讀到的資料並不會幫你轉換成你看得懂的字元。
字元流: 字元流會把讀取到的二進位制的資料進行對應 的編碼與解碼工作。 字元流 = 位元組流 + 編碼(解碼)
輸入字元流:
----------| Reader 輸入字元流的基類 抽象類
-------------| FileReader 讀取檔案的輸入字元流。
FileReader的用法:
1. 找到目標檔案
2. 建立資料的輸入通道
3. 讀取資料
4. 關閉資源
*/
public class Demo2 {
public static void main(String[] args) throws IOException {
readTest2();
}
//使用緩衝字元陣列讀取檔案。
public static void readTest2() throws IOException{
//找到目標檔案
File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
// 建立資料的輸入通道
FileReader fileReader = new FileReader(file);
//建立緩衝字元陣列讀取檔案資料
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{
//找到目標檔案
File file = new File("F:\\Demo1.java");
//建立資料的輸入通道
FileReader fileReader = new FileReader(file);
int content = 0 ;
while((content = fileReader.read())!=-1){ //每次只會讀取一個字元,效率低。
System.out.print((char)content);
}
//關閉資源
fileReader.close();
}
}
FileWriter
/*
輸出字元流:
------| Writer 輸出字元流的基類。 抽象類
-----------| FileWriter 向檔案資料資料的輸出字元流
FileWriter的使用步驟:
1. 找到目標檔案。
2. 建立資料輸出通道
3. 寫出資料。
4. 關閉資源
FileWriter要注意的事項:
1. 使用FileWriter寫資料的時候,FileWriter內部是維護了一個1024個字元陣列的,寫資料的時候會先寫入到它內部維護的字元陣列中,如果需要
把資料真正寫到硬碟上,需要呼叫flush或者是close方法或者是填滿了內部的字元陣列。
2. 使用FileWriter的時候,如果目標檔案不存在,那麼會自動建立目標檔案。
3.使用FileWriter的時候, 如果目標檔案已經存在了,那麼預設情況會先情況檔案中的資料,然後再寫入資料 , 如果需要在原來的基礎上追加資料,
需要使用“new FileWriter(File , boolean)”的構造方法,第二引數為true。
練習: 使用字元流拷貝一個文字檔案(java檔案).
接著使用字元流拷貝一個圖片(觀察圖片的大小變化,思考為什麼會這樣子??)
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
writeTest1();
}
public static void writeTest1() throws IOException{
//找到目標檔案
File file = new File("F:\\a.txt");
//建立資料輸出通道
FileWriter fileWriter = new FileWriter(file,true);
//準備資料,把資料寫出
String data = "今天天氣非常好!!";
fileWriter.write(data); //字元流具備解碼的功能。
//重新整理字元流
// fileWriter.flush();
//關閉資源
fileWriter.close();
}
}
使用位元組流讀取中文
public class Demo2 {
public static void main(String[] args) throws IOException {
File file = new File("F:\\a.txt");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buf = new byte[1024];
int length = 0;
while((length = fileInputStream.read(buf))!=-1){
System.out.println(new String(buf,0,length)); //借用字串的解碼功能。
}
}
}
/*
何時使用字元流,何時使用位元組流?依據是什麼?
使用字元流的應用場景: 如果是讀寫字元資料的時候則使用字元流。
使用位元組流的應用場景: 如果讀寫的資料都不需要轉換成字元的時候,則使用位元組流。
*/
//使用字元流拷貝檔案
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();
}
}
自己實現readLine方法
/*
輸入字元流:
-------| Reader 所有輸入字元流的基類。 抽象類
----------| FileReader 讀取檔案字串的輸入字元流。
----------| BufferedReader 緩衝輸入字元流 。 緩衝 輸入字元流出現的目的是為了提高讀取檔案 的效率和拓展了FileReader的功能。 其實該類內部也是維護了一個字元陣列
記住:緩衝流都不具備讀寫檔案的能力。
BufferedReader的使用步驟:
1.找到目標檔案
2 .建立資料的輸入通道。
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
// readTest1();
File file = new File("F:\\a.txt");
//建立資料的輸入通道。
FileReader fileReader = new FileReader(file);
String line = null;
while((line = myReadLine(fileReader))!=null){
System.out.println(line);
}
}
//自己去實現readLine方法。
public static String myReadLine(FileReader fileReader) throws IOException{
//建立一個字串緩衝類物件
StringBuilder sb = new StringBuilder(); //StringBuilder主要是用於儲存讀取到的資料
int content = 0 ;
while((content = fileReader.read())!=-1){
if(content=='\r'){
continue;
}else if(content=='\n'){
break;
}else{
//普通字元
sb.append((char)content);
}
}
//代表已經讀取完畢了。
if(content ==-1){
return null;
}
return sb.toString();
}
public static void readTest1() throws IOException{
//找到目標檔案
File file = new File("F:\\a.txt");
//建立資料的輸入通道。
FileReader fileReader = new FileReader(file);
//建立緩衝輸入字元流
BufferedReader bufferedReader = new BufferedReader(fileReader);
//讀取資料
/*int content = bufferedReader.read(); //讀到了一個字元。 讀取到的字元肯定也是從Bufferedreader內部的字元陣列中獲取的到。所以效率高。
System.out.println((char)content);*/
//使用BUfferedReader拓展的功能,readLine() 一次讀取一行文字,如果讀到了檔案的末尾返回null表示。
String line = null;
while((line = bufferedReader.readLine())!=null){ // 雖然readLine每次讀取一行資料,但是但會的line是不包含\r\n的、
System.out.println(Arrays.toString("aaa".getBytes()));
}
//關閉資源
bufferedReader.close();
}
}
BufferedWriter
/*
輸出字元流
----------| Writer 所有輸出字元流的基類, 抽象類。
--------------- | FileWriter 向檔案輸出字元資料的輸出字元流。
----------------| BufferedWriter 緩衝輸出字元流 緩衝輸出字元流作用: 提高FileWriter的寫資料效率與拓展FileWriter的功能。
BufferedWriter內部只不過是提供了一個8192長度的字元陣列作為緩衝區而已,拓展了FileWriter的功能。
BufferedWriter如何使用?
1. 找到目標檔案
2. 建立資料的輸出通道
*/
public class Demo2 {
public static void main(String[] args) throws IOException {
//找到目標檔案
File file = new File("F:\\a.txt");
//建立資料的輸出通道
FileWriter fileWriter = new FileWriter(file,true);
//建立緩衝輸出流物件
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//寫出資料
// bufferedWriter.newLine(); //newLine() 換行。 實際上就是想檔案輸出\r\n.
bufferedWriter.write("\r\n");
bufferedWriter.write("前兩天李克強來!!");
//關閉資源
bufferedWriter.flush();
// bufferedWriter.close();
}
}
練習: 緩衝輸入輸出字元流使用者登陸註冊,將資訊儲存在文字
public class Login {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) throws IOException {
while(true){
System.out.println("請選擇功能: A(註冊) B(登陸)");
String option = scanner.next();
if("a".equalsIgnoreCase(option)){
//註冊
reg();
}else if("b".equalsIgnoreCase(option)){
//登陸
login();
}else{
System.out.println("你的輸入有誤,請重新輸入...");
}
}
}
//登陸
public static void login() throws IOException{
System.out.println("請輸入使用者名稱:");
String userName = scanner.next();
System.out.println("請 輸入密碼:");
String password = scanner.next();
String info = userName+" "+ password;
//讀取檔案的資訊,檢視是否有該使用者的資訊存在,如果存在則登陸成功。
//建立資料的輸入通道
//建立緩衝輸入字元流
BufferedReader bufferedReader = new BufferedReader(new FileReader("F:\\users.txt"));
String line = null;
boolean isLogin = false; // 用於記錄是否登陸成功的標識, 預設是登陸失敗的。
//不斷的讀取檔案的內容
while((line = bufferedReader.readLine())!=null){
if(info.equals(line)){
isLogin = true;
break;
}
}
if(isLogin){
System.out.println("歡迎"+userName+"登陸成功...");
}else{
System.out.println("不存在該使用者資訊,請註冊!!");
}
}
//註冊
public static void reg() throws IOException{
System.out.println("請輸入使用者名稱:");
String userName = scanner.next();
System.out.println("請 輸入密碼:");
String password = scanner.next();
String info = userName+" "+ password;
//把使用者的註冊的資訊寫到檔案上
File file = new File("F:\\users.txt");
FileWriter fileWriter = new FileWriter(file,true);
//建立緩衝輸出字元流
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//把使用者資訊寫出
bufferedWriter.write(info);
bufferedWriter.newLine();
//關閉資源
bufferedWriter.close();
}
}