IO流(input/output)
? 資料運輸的載體或者中間鍵
位元組流
輸入位元組流(FileInputStream)
? 以位元組為最小單元,讀取任何型別的檔案,但是要注意字符集型別的轉換,
public static void testFileInputStream(){
// 獲取檔案物件
File f = new File("檔案絕對路徑balabala");
// 創建位元組輸入流
try {
FileInputStream fls = new FileInputStream(f);
// 準備一個陣列,用來接收一會從流中讀取的資料
byte[] data = https://www.cnblogs.com/te9uila/archive/2023/05/27/new byte[(int)f.length()];
// 將資料從流中讀取,存盤在位元組陣列中
fls.read(data);
// 遍歷輸出位元組陣列
// 如果讀取的是文本,那么文本在計算機底層存盤的是字符集對應的編碼,所以要及逆行強制轉換
for (byte b : data) {
System.out.print((char)b);
}
}catch (IOException e){
System.out.println("IO流例外");
}
}
輸出位元組流(FileOutputStream)
? 如果輸出流在創建的時候,如果檔案物件在磁盤中不存在,那么將自動創建一個相應檔案
public static void testFileOutputStream(){
File f = new File("檔案絕對路徑");
try{
// 創建位元組輸出流,默認是覆寫,而不是拼接內容
// 覆寫:
FileOutputStream fos = new FileOutputStream(f);
// 拼接:
// FileOutputStream fos = new FileOutputStream(f,true);
// 在Java中準備一個資料,用于資料的輸出(test01)
byte[] data = "https://www.cnblogs.com/te9uila/archive/2023/05/27/test01".getBytes();
// 向檔案寫入,,,
fos.write(data);
// 在流使用完成之后進行關閉
fos.close();
}catch(IOException e){
System.out.println("IO流例外!");
}
}
位元組流關閉(try with)
? 在JDK1.7之后提供了try with陳述句塊,如果在try with塊中宣告的物件,實作了AutoCloseable介面,那么這個物件會在try catch陳述句運行完成之后,進行資源的自動釋放
// 修改后的檔案輸出流demo
public static void testFileOutputStream(){
File f = new File("檔案絕對路徑");
// JDK 在1.7之后提供了try with陳述句塊
// 如果在try with塊中宣告的物件,實作了AutoCloseable介面
// 那么這個物件會在try catch陳述句運行完成之后,進行資源的自動釋放
try(FileOutputStream fos = new FileOutputStream(f,true);){
// 在Java中準備一個資料,用于資料的輸出(test01)
byte[] data = "https://www.cnblogs.com/te9uila/archive/2023/05/27/test02".getBytes();
// 向檔案寫入,,,
fos.write(data);
}catch(IOException e){
System.out.println("IO流例外!");
}
}
字符流
? 在讀取資料的時候,會根據JVM定義的默認字符集,對讀取的資料進行編碼轉換
字符輸入流(FileReader)
public static void testFileReader(){
File f = new File("檔案絕對路徑");
try(FileReader fr = new FileReader(f)){
char[] data = https://www.cnblogs.com/te9uila/archive/2023/05/27/new char[(int)f.length()];
fr.read(data);
// 遍歷字符陣列: 如果檔案中出現中文,那么檔案的位元組大小一定大于檔案字符的數量,定義的data陣列在讀取完資料之后一定有空位
// 遍歷的時候要跳過這些空字符
loop:for (char c : data) {
if(c =='\u0000'){
break loop;
}
System.out.print(c);
}
}catch(IOException e){
System.out.println("IO流例外!");
}
}
字符輸出流(FileWriter)
public static void testFileWriter(){
File f = new File("檔案絕對路徑");
// 同樣可以通過提供第二個引數來指定是覆寫還是補充目標檔案
try(FileWriter fw = new FileWriter(f)){
char[] data = "https://www.cnblogs.com/te9uila/archive/2023/05/27/這是一個測驗樣例/n".toCharArray();
// 字符輸出,,,
fw.write(data);
}catch(IOException e){
System.out.println("IO流例外!");
}
}
字符流和位元組流的弊端
- 這兩種流在讀寫的時候,分別以字符或位元組作為單位,如果讀取的檔案過大,就會影響磁盤的IO(input,output)性能
- 為了避免過多的IO操作,我們建立了快取的機制,在讀取資料的時候,是一次性將較多的資料讀取到硬碟當中,后續的讀取都從快取進行讀取,直到快取的資料讀取完,在重新從硬碟讀取資料
- 寫入資料也是同樣的道理,先將資料寫到快取中,再將快取一次性提交
- 通過減少寫入磁盤的次數達到提高效率的目的
快取流
快取輸入流(BufferedReader)
public static void testBufferedReader(){
File f = new File("檔案絕對路徑");
// 先創建檔案流物件,再通過檔案流創建快取流物件
try(FileReader fr = new FileReader(f);BufferedReader br = new BufferedReader(fr)){
// 一般來講會使用readline方法進行整行讀取
// 整行讀取的時候默認去掉行末的換行符
String line = "";
// 判斷line是否為空,讀取到了檔案最后
while((line = br.readLine())!=null){
System.out.println(line);
}
}catch(IOException e){
System.out.println("IO流例外!");
}
}
快取輸出流(PrintWriter)
public static void testPrintWriter(){
File f = new File("檔案絕對路徑");
// 快取輸出再寫入資料的時候,如果沒有呼叫flush方法進行提交
// 則會再JVM退出之前進行提交
// 如果你添加了這個autoFlush引數,每寫入一行資料,都會自動將快取提交給硬碟
try(FileWriter fw = new FileWriter(f,true);PrintWriter pw = new PrintWriter(fw,true)){
// 快取輸出,,,
pw.println("這是一個測驗樣例!");
}catch(IOException e){
System.out.println("IO流例外!");
}
}
物件流
序列化&反序列化
? 序列化:將Java物件轉換為特殊的位元組碼,或者是字串,用于存盤或者傳輸
? 反序列化:將特殊的位元組碼或者是字串,還原成Java物件的程序
定義一個測驗類
? ?如果某個類可以被序列化,那么這個類一定要實作Serializable介面!
public class Student implements Serializable {
// 如果某個類可以被序列化,那么這個類一定要實作Serializable介面
private String name;
private int age;
// 如果類被序列化,類中必須有一個最終靜態常量,如果后續類添加了成員變數,或者更新了方法,都必須就該版本號
private static final long serialVersionUID = 1L;
}
物件流序列化(ObjectStream)
public static void testObjectStream(){
// 創建一個物件,用來測驗序列化,反序列化
Student student01 = new Student("robot01",18);
// 提供一個檔案用于保存物件序列化之后的位元組碼
File f = new File("檔案絕對路徑");
// 創建物件流
try(FileOutputStream fos = new FileOutputStream(f);ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream(f);ObjectInputStream ois = new ObjectInputStream(fis);
){
// 將學生物件序列化
oos.writeObject(student01);
// 將學生物件反序列化
Student student02 = (Student)ois.readObject();
System.out.println(student02);
}catch(Exception e){
System.out.println("IO流例外!");
}
}
資料流
? 資料流基于位元組流實作,可以在存盤和讀取資料的時候,指定資料型別,資料輸出流在輸出資料時,會進行加密,只能用資料輸入流進行讀取
資料輸入流(DataInputStream)
public static void testDataInputStream(){
File f = new File("檔案絕對路徑");
try(FileInputStream fis = new FileInputStream(f);DataInputStream dis = new DataInputStream(fis)){
System.out.println(dis.readUTF());
System.out.println(dis.readInt());
}catch(Exception e){
System.out.println("IO流例外!");
}
}
資料輸出流(DataOutPutStream)
public static void testDataOutPutStream(){
File f = new File("檔案絕對路徑");
try(FileOutputStream fos = new FileOutputStream(f);DataOutputStream dos = new DataOutputStream(fos)){
dos.writeUTF("這是一個測驗樣例!");
dos.writeInt(10086);
}catch(Exception e){
System.out.println("IO流例外!");
}
}
(Demo)通過url實作Java檔案下載以及檔案批量下載
public static void testDownload(){
// 提前定義變數,提升變數的作用域
HttpURLConnection connection = null;
InputStream is = null;
FileOutputStream fos = null;
try{
String urlPath = "https://dldir1.qq.com/qqfile/qq/TIM3.4.7/TIM3.4.7.22084.exe";
// 實體化url物件
URL url = new URL(urlPath);
// 基于url獲取與目標服務器的連接
connection = (HttpURLConnection) url.openConnection();
// 根據連接物件獲取用力啊接收下載資料的輸入流
is = connection.getInputStream();
// 獲取下載檔案的檔案名
String downloadName = urlPath.substring(urlPath.lastIndexOf("/") + 1);
// 創建對應的檔案物件
File f = new File("目的檔案夾絕對路徑 + \\" + downloadName);
// 創建輸出流物件
fos = new FileOutputStream(f);
// 這里不需要等待下載好,再輸出,嘗試邊下載遍寫入
// 1. 準備一個位元組陣列作為一個快取(1KB)
byte[] buffer = new byte[1024];
// 2. 通過輸入流將資料讀取到buffer這個作為快取的位元組陣列中
// 加入回圈了n次,回圈第1~(n-1)次時length=1024,回圈第n次時,length<=1024
// 當全部讀完之后,length = -1 退出回圈
int length;
while((length = is.read(buffer))!=-1){
// buffer:輸出資料的來源
// off:表示從陣列的哪一個下標開始讀取
// length:希望寫入的位元組數
fos.write(buffer,0,length);
}
System.out.println("下載完成!");
}catch(Exception e){
e.printStackTrace();
}finally {
// 草率的關閉一下流以及連接
try {
is.close();
connection.disconnect();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553569.html
標籤:其他
上一篇:如何通過Python將JSON格式檔案匯入redis?
下一篇:返回列表