流(IO流):input-output-stream.
- 作用:實作兩個裝置之間的通信.
- 裝置:記憶體,硬碟(磁盤),控制台,鍵盤,檔案,網絡
- 網絡:在網絡上,你的主機之外的環境.
- 流的分類:
- 根據操作的方式分類:輸入流和輸出流
- 根據資料的類型分類:位元組流和字元流
- 位元組流:傳輸的位元組,可以傳輸任意類型的資料.----視訊,音頻,檔案,圖檔等
- 字元流:傳輸的也是位元組,不同點在與傳輸的過程中加入了編碼的操作,讓我們在傳輸字元的時候更加的便捷-------檔案
- 以記憶體為參考
- 位元組流:–對應的父類
- 位元組輸入流:InputStream
- 位元組輸出流:OutputStream
- 字元流:–對應的父類
- 字元讀入流(将資料輸入記憶體):Reader
- 字元寫出流(将資料從記憶體取出):Writer
- 先處理字元流:
- 執行個體:以磁盤的存儲為例,将内容寫入檔案
- 分析:
- 因為傳輸的是字元—字元流
- 因為是從記憶體傳出—寫出流—FileWriter
注意點:
- 注意點一:關聯檔案的特點:如果之前不存在,程式會自動建立一個,如果已經存在了,直接使用.但是會将原檔案的内容覆寫.
- 注意點二:如果隻寫名字,不寫具體的路徑,預設的路徑是目前的工程.
- 注意點三:我們可以指定自己的路徑,但是一定要保證路徑存在.否則報異常:FileNotFoundException: W:\temp1.txt (系統找不到指定的路徑。)
- 注意點四:在執行write方法時,資料被臨時寫入了流對象的内部數組中,這是一個位元組數組,或預設取查編碼表
- 注意點五:流使用完後必須關閉
- 注意點六:當流對象關閉後不能再進行任何操作,否則報異常:Stream closed
public static void main(String[] args) throws IOException {
//建立寫出流對象并關聯内容寫出的檔案
/*
* 注意點一:關聯檔案的特點:如果之前不存在,程式會自動建立一個,如果已經存在了,直接使用.但是會将原檔案的内容覆寫.
* 注意點二:如果隻寫名字,不寫具體的路徑,預設的路徑是目前的工程.
* 注意點三:我們可以指定自己的路徑,但是一定要保證路徑存在.否則報異常:FileNotFoundException: W:\temp1.txt (系統找不到指定的路徑。)
*/
FileWriter fileWriter = new FileWriter("temp1.txt");
//調用寫出方法
/*
* 注意點四:在執行write方法時,資料被臨時寫入了流對象的内部數組中,這是一個位元組數組,或預設取查編碼表
*/
fileWriter.write("bingbingAndChenchen");
//調用重新整理方法--會将内容真正的寫入檔案
//fileWriter.flush();
//關閉流---a:将流關閉 b:重新整理
//注意點五:流使用完後必須關閉
fileWriter.close();
//注意點六:當流對象關閉後不能再進行任何操作,否則報異常:Stream closed
//fileWriter.write("zhangsan");
}
檔案的續寫: FileWriter(String file,boolean value)
- 當value為true的時候,不會将原來的内容删除
- :是轉義字元 \t:制表符 \:普通的斜杠
- 實作換行:\r\n–windows下的換行 linux:\n
public static void main(String[] args) {
//建立對象并關聯檔案
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter("temp2.txt",true);
//寫
fileWriter.write("bingbing");
fileWriter.write("\r\n");
fileWriter.write("zhansan");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//關閉
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
讀檔案的兩種方式:
- 第一種 :read()–一個字元一個字元的讀
- 第二種:read(字元數組)–一次可以讀取多個字元,将讀到的字元臨時存儲到了這個數組中. 執行個體:将資料從檔案中取出–檔案讀入流(FileReader)
第一種 :read()–一個字元一個字元的讀
public static void main(String[] args) throws IOException {
//建立對象并關聯檔案,關聯的檔案必須存在
FileReader fileReader = new FileReader("temp2.txt");
//* 第一種 :read()--一個字元一個字元的讀
//a:會将目前的字元讀出 b:将目前的指針後移一個字元
int data;
// data = fileReader.read();//這裡得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//這裡得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//這裡得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//這裡得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//這裡得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//這裡得到是ASCII值
// System.out.println(data);//這裡傳回的是-1,代表讀完了.
while ((data = fileReader.read()) != -1) {
System.out.println((char)data);
}
//關閉流
fileReader.close();
}
第二種:read(字元數組)–一次可以讀取多個字元,将讀到的字元臨時存儲到了這個數組中.
public static void main(String[] args) throws IOException {
//建立對象并關聯檔案,關聯的檔案必須存在
FileReader fileReader = new FileReader("temp2.txt");
/*
*數組是臨時存放資料的地方,我們會将讀到的字元放到數組中,數組的大小決定了我們一次可以讀到的字元個數,
*但是從記憶體的角度考慮,臨時數組并不是越大 越好,一般數組的大小在1Kb左右.
* 傳回值:代表的是本次讀到的真實字元的個數,如果傳回值是-1代表讀完了
*/
char[] arr = new char[2];
int num;
// num = fileReader.read(arr);
// System.out.println(new String(arr,0,num)+" "+num);
// num = fileReader.read(arr);
// System.out.println(new String(arr,0,num)+" "+num);
// num = fileReader.read(arr);
// System.out.println(new String(arr,0,num)+" "+num);//代表将字元數組從下标0開始的num個字元轉成字元串
// num = fileReader.read(arr);
// System.out.println(new String(arr)+" "+num);//-1,說明讀完了
while ((num = fileReader.read(arr)) != -1) {
System.out.println(new String(arr,0,num)+" "+num);
}
//關閉流
fileReader.close();
}
路徑的講解:
- 相對路徑和絕對路徑
- 執行個體: D:\workspace\BigData1715N19\src\com\qianfeng\test\Demo1.java 絕對路徑
- com\qianfeng\test\Demo1.java 相對路徑
- 相對路徑:從路徑中間的某個部位開始一直到目前的檔案名字
- 絕對路徑:一個檔案的完整路徑,即從根目錄開始的路徑.
- 路徑中的/ \是轉義字元 \==/
執行個體:實作檔案的複制
public static void main(String[] args) throws IOException {
//1.建立讀入流與寫出流并關聯對應的檔案
FileReader fileReader = new FileReader("src/com\\qianfeng\\test\\Demo1.java");
FileWriter fileWriter = new FileWriter("temp3.txt");
//2.讀寫
//一次多多個字元
// char[] arr = new char[10];
// int num;
// while ((num = fileReader.read(arr)) != -1) {
// //将字元數組的部分内容寫入檔案
// fileWriter.write(arr, 0, num);
// }
//一次讀一個字元
int num;
while ((num = fileReader.read()) != -1) {
fileWriter.write(num);//自帶了編碼
}
//3.關閉資源
fileReader.close();
fileWriter.close();
}