LeetCode845陣列中的最長山脈-----雙指標
阿新 • • 發佈:2022-04-17
- 檔案概念:儲存資料的地方
- 建立檔案的三種方法(檔案路徑可寫為: “d:\\”或者 “d:/”):
- 常用的檔案方法:
- 獲取檔案資訊:
2.目錄操作:mkdir建立一級目錄,mkdirs建立多級目錄,delete刪除空目錄或檔案
- IO原理及分類
- IO:Input,Output,用於處理資料傳輸,如讀寫檔案,網路通訊;Java程式中對於資料的輸入輸出操作以流(stream)的方式進行
- 分類:按操作資料單位不同分為:位元組流(8bit),字元流(字元,對應位元組與編碼相關,更適合操作文字檔案)(字元流效率更高,位元組流在操作二進位制檔案時保證檔案的無損操作,更適合操作二進位制檔案); 按資料流的流向不同分為:輸入流,輸出流; 按流的角色不同分為:節點流,處理流/包裝流
- 由四個抽象基類派(都無法直接例項化)生出IO流的40多個類,其子類名稱都是以父類名作為子類名字尾
- 如何在IDEA中開啟原始碼,開啟類圖
- FileInputStream&FileOutputStream:用物件來操作檔案
- FileInputStream:檔案輸入流
。三種構造方法的引數:File物件; String 檔案系統中的路徑名; 檔案描述符(?)
。read方法(到達結尾時都返回-1):()-從輸入流中讀取一個數據位元組,(byte【】b)將最多b.length個位元組的資料讀入一個byte陣列中(優化效率,返回實際讀取的位元組數),(byte【】b, int off, int len)
。顯示:(char),漢字(三個位元組)必然出現亂碼(解決方案(?));String(b, 0, read(byte[])
- 除錯
2.FileOutputStream
。write方法: write(),write(byte[]) , write(byte[], int off, int len)
public void writeFile(){ //建立物件,定義在try外擴大作用域 String filePath = "d:\\Java\\a.txt"; FileOutputStream file = null; //若檔案不存在將自動新建資料夾 try{ //1.new FileOutputStream(filePath);寫入內容時,將覆蓋原有內容 //2.new FileOutputStream(filePath, true);寫入內容時,將追加到檔案末尾 file = new FileOutputStream(filePath);
//三種write方法 //寫入單個位元組 write() file.write('H'); //寫入字串 write(byte[] b) String str1 = "hello"; file.write(str1.getBytes()); //getBytes:字串——>位元組陣列 //寫入字串 String str2 = "Hello"; file.write(str2.getBytes(), 0, str2.length()); }catch(IOException e){ e.printStackTrace(); //jdk手冊 }finally{ try { file.close(); } catch (IOException e) { e.printStackTrace(); } } }
- FileReader&FileWriter:字元流
- 構造方法:File物件或String指定路徑
- FileReader:
read方法,末尾返回-1:read()每次讀取一個字元; read(char【】),讀取字元陣列,效率更高,返回讀取到的字元數;相關API: new String(char[]),將char[]轉換成String,new String(char[], off , len ), 將char[]的指定部分轉換成String - FileWriter常用方法:
構造方法:new FileWriter(File/String) *new FileWriter(File/String, true)追加模式
write方法,write(),寫入單個字元,write(char[]),寫入字元陣列,writer(char[], off, len), write(String), write(String, off, len);相關API:String.toCharArray:將String轉換成char[]
*注意:一定要關閉(close)或者重新整理(flush)(這時候還在記憶體中),否則無法寫入檔案
4.
public void fileReader(){ String filePath = "d:\\Java\\a.txt"; FileReader fileReader = null; //1.建立FileReader物件 try{ fileReader = new FileReader(filePath); //單個字元讀取 //迴圈讀取,使用read int read1 = 0; while((read1 = fileReader.read())!=-1){ System.out.print((char)read1); } //字元陣列讀取檔案 // 迴圈讀取,使用read(buf),返回實際讀取的字元數 int readLen = 0; char [] buf = new char[8]; while((readLen = fileReader.read(buf))!=-1){ System.out.println(new String(buf, 0, readLen)); //readLen保證在只有1個字元時仍可以輸出 } }catch(IOException e){ System.out.println(e); }finally{ try { if(fileReader != null){ fileReader.close(); } } catch (IOException e) { e.printStackTrace(); } } }
- 節點流和處理流
- 節點流:從一個特定的資料來源(存放資料的地方)讀寫程式,如FileReader
- 處理流(包裝流):連線在已有的流(節點流或處理流)之上,為程式提供更強大的的讀寫功能,也更加靈活,如BufferedReader
- BufferedReader封裝任意一個節點流(Reader的子類),不侷限於具體的資料來源(修飾器模式:一種設計模式)
- BufferedReader:操作文字檔案,儘量不要操作二進位制檔案(圖片聲音視訊),否則可能會出現檔案的損失;關閉處理流時只需要關閉外層流
//這裡直接丟擲異常 public void BufferedReader_() throws IOException{ String filePath = "d:\\Java\\a.txt"; //建立物件 BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath)); //讀取 String line; //BufferedReader是按行讀取檔案,效率高 //讀取完畢時返回null while((line = bufferedReader.readLine())!=null){ System.out.println(line); } //關閉流,只需要關閉BufferedReader,底層會自動關閉節點流 bufferedReader.close(); }