Java基礎——Java重點基礎之IO流(三)

一,序列流

  • 1.什麼是序列流
    • 序列流可以把多個字節輸入流整合成一個, 從序列流中讀取數據時, 將從被整合的第一個流開始讀, 讀完一個之後繼續讀第二個, 以此類推.
  • 2.使用方式

    • 整合兩個: SequenceInputStream(InputStream, InputStream)

FileInputStream fis1 = new FileInputStream("a.txt");            //創建輸入流對象,關聯a.txt
FileInputStream fis2 = new FileInputStream("b.txt");            //創建輸入流對象,關聯b.txt
SequenceInputStream sis = new SequenceInputStream(fis1, fis2);  //將兩個流整合成一個流
FileOutputStream fos = new FileOutputStream("c.txt");           //創建輸出流對象,關聯c.txt

int b;
while((b = sis.read()) != -1) {                                 //用整合後的讀
    fos.write(b);                                               //寫到指定文件上
}

sis.close();
fos.close(); 


二,序列流整合多個

  • 整合多個: SequenceInputStream(Enumeration)
FileInputStream fis1 = new FileInputStream("a.txt");    //創建輸入流對象,關聯a.txt
FileInputStream fis2 = new FileInputStream("b.txt");    //創建輸入流對象,關聯b.txt
FileInputStream fis3 = new FileInputStream("c.txt");    //創建輸入流對象,關聯c.txt
Vector<InputStream> v = new Vector<>();                 //創建vector集合對象
v.add(fis1);                                            //將流對象添加
v.add(fis2);
v.add(fis3);
Enumeration<InputStream> en = v.elements();             //獲取枚舉引用
SequenceInputStream sis = new SequenceInputStream(en);  //傳遞給SequenceInputStream構造
FileOutputStream fos = new FileOutputStream("d.txt");
int b;
while((b = sis.read()) != -1) {
    fos.write(b);
}

sis.close();
fos.close();


三,內存輸出流(****掌握*******)

  • 1.什麼是內存輸出流
    • 該輸出流可以向內存中寫數據, 把內存當作一個緩衝區, 寫出之後可以一次性獲取出所有數據
  • 2.使用方式

    • 創建對象: new ByteArrayOutputStream()
    • 寫出數據: write(int), write(byte[])
    • 獲取數據: toByteArray()
    • FileInputStream fis = new FileInputStream("a.txt");
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      int b;
      while((b = fis.read()) != -1) {
          baos.write(b);
      }
      
      //byte[] newArr = baos.toByteArray();               //將內存緩衝區中所有的字節存儲在newArr中
      //System.out.println(new String(newArr));
      System.out.println(baos);
      fis.close();
      

四,內存輸出流之黑馬面試題

  • 定義一個文件輸入流,調用read(byte[] b)方法,將a.txt文件中的內容打印出來(byte數組大小限制爲5)
    FileInputStream fis = new FileInputStream("a.txt");             //創建字節輸入流,關聯a.txt
    ByteArrayOutputStream baos = new ByteArrayOutputStream();       //創建內存輸出流
    byte[] arr = new byte[5];                                       //創建字節數組,大小爲5
    int len;
    while((len = fis.read(arr)) != -1) {                            //將文件上的數據讀到字節數組中
        baos.write(arr, 0, len);                                    //將字節數組的數據寫到內存緩衝區中
    }
    System.out.println(baos);                                       //將內存緩衝區的內容轉換爲字符串打印
    fis.close();


五,對象操作流ObjecOutputStream

  • 1.什麼是對象操作流
    • 該流可以將一個對象寫出, 或者讀取一個對象到程序中. 也就是執行了序列化和反序列化的操作.
  • 2.使用方式

    • 寫出: new ObjectOutputStream(OutputStream), writeObject()

    • public class Demo3_ObjectOutputStream {
      
          /**
           * @param args
           * @throws IOException 
           * 將對象寫出,序列化
           */
          public static void main(String[] args) throws IOException {
              Person p1 = new Person("張三", 23);
              Person p2 = new Person("李四", 24);
      //      FileOutputStream fos = new FileOutputStream("e.txt");
      //      fos.write(p1);
      //      FileWriter fw = new FileWriter("e.txt");
      //      fw.write(p1);
              //無論是字節輸出流,還是字符輸出流都不能直接寫出對象
              ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt"));//創建對象輸出流
              oos.writeObject(p1);
              oos.writeObject(p2);
              oos.close();
          }
      
      }

六,對象操作流ObjectInputStream

  • 讀取: new ObjectInputStream(InputStream), readObject()

public class Demo3_ObjectInputStream {

    /**
     * @param args
     * @throws IOException 
     * @throws ClassNotFoundException 
     * @throws FileNotFoundException 
     * 讀取對象,反序列化
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt"));
        Person p1 = (Person) ois.readObject();
        Person p2 = (Person) ois.readObject();
        System.out.println(p1);
        System.out.println(p2);
        ois.close();
    }

}


七,對象操作流優化

* 將對象存儲在集合中寫出

Person p1 = new Person("張三", 23);
Person p2 = new Person("李四", 24);
Person p3 = new Person("馬哥", 18);
Person p4 = new Person("輝哥", 20);

ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f.txt"));
oos.writeObject(list);                                  //寫出集合對象

oos.close();


  • 讀取到的是一個集合對象

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f.txt"));
    ArrayList<Person> list = (ArrayList<Person>)ois.readObject();   //泛型在運行期會被擦除,索引運行期相當於沒有泛型
                                                                    //想去掉黃色可以加註解                    @SuppressWarnings("unchecked")
    for (Person person : list) {
        System.out.println(person);
    }

ois.close();


八,IO流(加上id號)

  • 注意
    • 要寫出的對象必須實現Serializable接口才能被序列化
    • 不用必須加id號

九,打印流的概述和特點(掌握)

  • 1.什麼是打印流

    • 該流可以很方便的將對象的toString()結果輸出, 並且自動加上換行, 而且可以使用自動刷出的模式
    • System.out就是一個PrintStream, 其默認向控制檯輸出信息

    • PrintStream ps = System.out;
      ps.println(97);                 //其實底層用的是Integer.toString(x),將x轉換爲數字字符串打印
      ps.println("xxx");
      ps.println(new Person("張三", 23));
      Person p = null;
      ps.println(p);                  //如果是null,就返回null,如果不是null,就調用對象的toString()
      

2.使用方式

  • 打印: print(), println()
  • 自動刷出: PrintWriter(OutputStream out, boolean autoFlush, String encoding)
  • 打印流只操作數據目的

  • PrintWriter pw = new PrintWriter(new FileOutputStream("g.txt"), true);
    pw.write(97);
    pw.print("大家好");
    pw.println("你好");               //自動刷出,只針對的是println方法
    pw.close();

十,標準輸入輸出流概述和輸出語句

  • 1.什麼是標準輸入輸出流(掌握)
    • System.in是InputStream, 標準輸入流, 默認可以從鍵盤輸入讀取字節數據
    • System.out是PrintStream, 標準輸出流, 默認可以向Console中輸出字符和字節數據
  • 2.修改標準輸入輸出流(瞭解)

    • 修改輸入流: System.setIn(InputStream)
    • 修改輸出流: System.setOut(PrintStream)
  • System.setIn(new FileInputStream("a.txt"));             //修改標準輸入流
    System.setOut(new PrintStream("b.txt"));                //修改標準輸出流
    
    InputStream in = System.in;                             //獲取標準輸入流
    PrintStream ps = System.out;                            //獲取標準輸出流
    int b;
    while((b = in.read()) != -1) {                          //從a.txt上讀取數據
        ps.write(b);                                        //將數據寫到b.txt上
    }
    
    in.close();
    ps.close();

十,修改標準輸入輸出流拷貝圖片

  System.setIn(new FileInputStream("IO圖片.png"));      //改變標準輸入流
    System.setOut(new PrintStream("copy.png"));         //改變標準輸出流

    InputStream is = System.in;                         //獲取標準輸入流
    PrintStream ps = System.out;                        //獲取標準輸出流

    int len;
    byte[] arr = new byte[1024 * 8];

    while((len = is.read(arr)) != -1) {
        ps.write(arr, 0, len);
    }

    is.close();
    ps.close();

十一,兩種方式實現鍵盤錄入(瞭解)

  • A:BufferedReader的readLine方法。
    • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • B:Scanner
十二,隨機訪問流概述和讀寫數據(瞭解)
  • A:隨機訪問流概述

    • RandomAccessFile概述
    • RandomAccessFile類不屬於流,是Object類的子類。但它融合了InputStream和OutputStream的功能。
    • 支持對隨機訪問文件的讀取和寫入。
  • B:read(),write(),seek()

十三,數據輸入輸出流(瞭解)
  • 1.什麼是數據輸入輸出流
    • DataInputStream, DataOutputStream可以按照基本數據類型大小讀寫數據
    • 例如按Long大小寫出一個數字, 寫出時該數據佔8字節. 讀取的時候也可以按照Long類型讀取, 一次讀取8個字節.
  • 2.使用方式

    • DataOutputStream(OutputStream), writeInt(), writeLong()

    • DataOutputStream dos = new DataOutputStream(new FileOutputStream("b.txt"));
      dos.writeInt(997);
      dos.writeInt(998);
      dos.writeInt(999);
      
      dos.close();
      

    • DataInputStream(InputStream), readInt(), readLong()

    • DataInputStream dis = new DataInputStream(new FileInputStream("b.txt"));
      int x = dis.readInt();
      int y = dis.readInt();
      int z = dis.readInt();
      System.out.println(x);
      System.out.println(y);
      System.out.println(z);
      dis.close();

十四,Properties的概述和作爲Map集合的使用(不是清楚啊!!!!)
  • A:Properties的概述
    • Properties 類表示了一個持久的屬性集。
    • Properties 可保存在流中或從流中加載。
    • 屬性列表中每個鍵及其對應值都是一個字符串。
  • B:案例演示
    • Properties作爲Map集合的使用
十五,Properties的特殊功能使用(瞭解)
  • A:Properties的特殊功能
    • public Object setProperty(String key,String value)
    • public String getProperty(String key)
    • public Enumeration stringPropertyNames()
  • B:案例演示
    • Properties的特殊功能
十六,Properties的load()和store()功能)(瞭解)
  • A:Properties的load()和store()功能
  • B:案例演示
    • Properties的load()和store()功能

發佈了46 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章