IO流之InputStream詳解

1 IO

  • BigDecimal/BigInteger

概述 :

  • BigDecimal:常用來解決精確的浮點數運算。
  • BigInteger:常用來解決超大的整數運算。

創建對象:

  • BigDecimal.valueOf(2);
  • 常用方法: add(BigDecimal bd): 做加法運算
  • substract(BigDecimal bd) : 做減法運算
  • multiply(BigDecimal bd) : 做乘法運算
  • divide(BigDecimal bd) : 做除法運算
  • divide(BigDecimal bd,保留位數,舍入方式):除不盡時使用
  • setScale(保留位數,舍入方式):同上
  • pow(int n):求數據的幾次冪
public class Test2_BigD {
       public static void main(String[] args) {
              double a = new Scanner(System.in).nextDouble();
              double b = new Scanner(System.in).nextDouble();
              System.out.println(a+b);
              System.out.println(a-b);
              System.out.println(a*b);
              System.out.println(a/b);//不精確              
              System.out.println(===上面的除法不精確===);
              BigDecimal bd1 = BigDecimal.valueOf(a);
              BigDecimal bd2 = BigDecimal.valueOf(b);
              BigDecimal bd3;
              bd3=bd1.add(bd2);
              System.out.println(bd3.doubleValue());              
              bd3=bd1.subtract(bd2);
              System.out.println(bd3.doubleValue());              
              bd3=bd1.multiply(bd2);
              System.out.println(bd3.doubleValue());
              
//           bd3=bd1.divide(bd2);//報錯除不盡
              //保留位數和舍入方式
              bd3=bd1.divide(bd2,5,BigDecimal.ROUND_HALF_UP);
              bd3=bd3.setScale(2, BigDecimal.ROUND_HALF_UP);//保留兩位
              System.out.println(bd3.doubleValue());              
       }
}
  • IO簡介

繼承結構:

  • in/out相對於程序而言的輸入(讀取)和輸出(寫出)的過程。
  • 在Java中,根據處理的數據單位不同,分爲字節流和字符流
    File

字節流:針對二進制文件

> InputStream 
> --FileInputStream
> --BufferedInputStream 
> --ObjectInputStream OutputStream
> --FileOutputStream
> --BufferedOutputStream
> --ObjectOutputStream

字符流:針對文本文件。讀寫容易發生亂碼現象,在讀寫時最好指定編碼集爲utf-8

>  Writer
>   	-- BufferedWriter
>    	-- OutputStreamWriter Reader
>     	-- BufferedReader
>      	-- InputStreamReader
>       	-- PrintWriter/PrintStream
  • 流的概念
  • 數據的讀寫抽象成數據,在管道中流動。
  • 流只能單方向流動
  • 輸入流用來讀取in
  • 輸出流用來寫出Out
  • 數據只能從頭到尾順序的讀寫一次

  • File文件流

概述:

  • 封裝一個磁盤路徑字符串,對這個路徑可以執行一次操作。 可以用來封裝文件路徑、文件夾路徑、不存在的路徑。

創建對象:

  • File(String pathname)
  • 通過將給定路徑名字符串轉換爲抽象路徑名來創建一個新 File 實例。

常用方法:

  • 文件、文件夾屬性 length():文件的字節量
  • exists():是否存在,存在返回true
  • isFile():是否爲文件,是文件返回true
  • isDirectory():是否爲文件夾,是文件夾返回true
  • getName():獲取文件/文件夾名
  • getParent():獲取父文件夾的路徑
  • getAbsolutePath():獲取文件的完整路徑

創建、刪除:

  • createNewFile():新建文件,文件夾不存在會異常,文件已經存在返回false
  • mkdirs():新建多層不存在的文件夾\a\b\c
  • mkdir():新建單層不存在的文件夾\a
  • delete():刪除文件,刪除空文件夾

文件夾列表:

  • list():返回String[],包含文件名
  • listFiles():返回File[],包含文件對象

字節流讀取:

  • 字節流是由字節組成的,字符流是由字符組成的
  • Java裏字符由兩個字節組成.字節流是最基本的,所有InputStream和OutputStream的子類都是,主要用在處理二進制數據。

流式傳輸主要指將整個音頻和視頻及三維媒體等多媒體文件經過特定的壓縮方式解析成一個個壓縮包,由視頻服務器向用戶計算機順序或實時傳送。在採用流式傳輸方式的系統中,用戶不必像採用下載方式那樣等到整個文件全部下載完畢,而是隻需經過幾秒或幾十秒的啓動延時即可在用戶的計算機上利用解壓設備對壓縮的A/V、3D等多媒體文件解壓後進行播放和觀看。此時多媒體文件的剩餘部分將在後臺的服務器內繼續下載。

字符流讀取:

  • 常用於處理純文本數據。
  • Reader抽象類
  • 用於讀取字符流的抽象類。
   常用方法:
    -- int read() :讀取單個字符。 
    -- int read(char[] cbuf) :將字符讀入數組。 
    -- abstract  int read(char[] cbuf, int off, int len) :將字符讀入數組的某一部分。 
    -- int read(CharBuffer target) :試圖將字符讀入指定的字符緩衝區。 
    -- abstract  void close() :關閉該流並釋放與之關聯的所有資源。

文件的讀取

public class tt {
    public static void main(String[] args) throws Exception {
       method1();// 字節讀取
       method2();//字符讀取
    }
     
    private static void method2() throws Exception {
       //字符流讀圖片亂碼
//     BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:\\teach\\1.jpg"))));

       BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:\\teach\\a\\1.txt"))));
//     System.out.println(in.readLine());
//     System.out.println(in.readLine());//null讀到/n/r       
       String line = "";
       while((line = in.readLine())!=null) {//一行一行讀
           System.out.println(line);
       }       
       in.close();
    }
 
    private static void method1() throws Exception {
       long s = System.currentTimeMillis();
       InputStream in = new FileInputStream("D:\\teach\\1.jpg");

       int b = 0;
       while ((b = in.read()) != -1) {
           // System.out.println(b);
       }

       s = System.currentTimeMillis() - s;
       System.out.println(s + "--");// 7515

       long ss = System.currentTimeMillis();
       InputStream in2 = new BufferedInputStream(new FileInputStream("D:\\teach\\1.jpg"));
       int b2 = 0;
       while ((b2 = in2.read()) != -1) {
           // System.out.println(b2);
       }

       ss = System.currentTimeMillis() - ss;
       System.out.println(ss + "==");// 32
       
       in.close();
       in2.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章