1. 程式人生 > 其它 >LeetCode845陣列中的最長山脈-----雙指標

LeetCode845陣列中的最長山脈-----雙指標

跳轉連結:韓順平講Java

  • 檔案概念:儲存資料的地方
  • 建立檔案的三種方法(檔案路徑可寫為: “d:\\”或者  “d:/”):
  •  常用的檔案方法:
  1. 獲取檔案資訊:

  2.目錄操作:mkdir建立一級目錄,mkdirs建立多級目錄,delete刪除空目錄或檔案

 

  •  IO原理及分類
  1. IO:Input,Output,用於處理資料傳輸,如讀寫檔案,網路通訊;Java程式中對於資料的輸入輸出操作以流(stream)的方式進行
  2. 分類:按操作資料單位不同分為:位元組流(8bit),字元流(字元,對應位元組與編碼相關,更適合操作文字檔案)(字元流效率更高,位元組流在操作二進位制檔案時保證檔案的無損操作,更適合操作二進位制檔案); 按資料流的流向不同分為:輸入流,輸出流; 按流的角色不同分為:節點流,處理流/包裝流
  3. 由四個抽象基類派(都無法直接例項化)生出IO流的40多個類,其子類名稱都是以父類名作為子類名字尾
  • 如何在IDEA中開啟原始碼,開啟類圖

 

  •  FileInputStream&FileOutputStream:用物件來操作檔案
  1. 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:字元流
  1. 構造方法:File物件或String指定路徑
  2. FileReader:
    read方法,末尾返回-1:read()每次讀取一個字元; read(char【】),讀取字元陣列,效率更高,返回讀取到的字元數;相關API: new String(char[]),將char[]轉換成String,new String(char[], off , len ), 將char[]的指定部分轉換成String
  3. 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();
            }
        }
    }
  •  節點流和處理流
  1. 節點流:從一個特定的資料來源(存放資料的地方)讀寫程式,如FileReader
  2. 處理流(包裝流):連線在已有的流(節點流或處理流)之上,為程式提供更強大的的讀寫功能,也更加靈活,如BufferedReader
  3. 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();
    }