I/O流常用複製和讀取文件

一、簡介

你要把一個視頻,拷貝到你的電腦硬盤裏,這個可以看做是一種數據的流動,按照流動的方向,以內存爲基準,分爲 輸入input 和 輸出 output ,即流向內存是輸入流,流出內存的輸出流。

Java中I/O操作主要是指使用 java.io 包下的內容,進行輸入、輸出操作。輸入也叫做讀取數據,輸出也叫做作寫 出數據。

1、IO的分類

根據數據的流向分爲:輸入流和輸出流。

輸入流 : 把數據從 其他設備 上讀取到 內存 中的流。

輸出流 : 把數據從 內存 中寫出到 其他設備 上的流。

格局數據的類型分爲:字節流和字符流。

字節流 : 以字節爲單位,讀寫數據的流。

字符流 : 以字符爲單位,讀寫數據的流。

2、頂級父類

輸入流 輸出流
字節流 字節輸入流 InputStream 字節輸出流 OutputStream
字符流 字符輸入流 Reader 字符輸出流 Writer

二、讀入文件

1、FileInputStream類方法

常用的方法:

public void close() :關閉此輸入流並釋放與此流相關聯的任何系統資源。
public abstract int read() : 從輸入流讀取數據的下一個字節。
public int read(byte[] b) : 從輸入流中讀取一些字節數,並將它們存儲到字節數組 b中 。

讀取單個字節:

FileInputStream fis = new FileInputStream("fos.txt");
int b;
while ((b=fis.read())!=-1){
    System.out.println((char)b);
}
fis.close();

讀取到數組中:

FileInputStream fis = new FileInputStream("fos.txt");
int len;
byte[] bytes = new byte[4];
while ((len = fis.read(bytes)) != -1) {
    System.out.println(new String(bytes));
}
fis.close();

2、FileReader類方法

常用的方法

public void close() :關閉此流並釋放與此流相關聯的任何系統資源。
public int read() : 從輸入流讀取一個字符。
public int read(char[] cbuf) : 從輸入流中讀取一些字符,並將它們存儲到字符數組 cbuf中

讀取單個字符

  FileReader fileReader = new FileReader("fos.txt");
  int b;
  while ((b=fileReader.read())!=-1){
      System.out.println((char)b);
  }
  fileReader.close();
}

讀取到數組中:

 FileReader fileReader = new FileReader("fos.txt");
 int len;
 char[] chars = new char[3];
 while ((len=fileReader.read(chars))!=-1){
     System.out.println(new String(chars));
 }
fileReader.close();

讀取到數組中(按位讀取)

  FileReader fileReader = new FileReader("fos.txt");
  int len;
  char[] chars = new char[3];
  while ((len=fileReader.read(chars))!=-1){
      System.out.println(new String(chars,0,len));
  }
  fileReader.close();
}

3、讀一行文件:(字符緩衝流)

常用方法:

BufferedReader: public String readLine() : 讀一行文字。

代碼:

    BufferedReader br = new BufferedReader(new FileReader("fos.txt"));
//    讀取一行文件內容
    String line = br.readLine();
//    循環所讀文件的所有內容
    String end;
    while ((end=br.readLine())!=null){
        System.out.println(line);
    }

三、寫出文件

1、FileOutputStream類方法

使用IO輸出文件的方式:

FileOutputStream fos=null;
try {
  //方法一:
    fos = new FileOutputStream("D://fos.txt");
    fos.write(97);
  //方法二:
    byte[] bytes = "你好嗎".getBytes();
    fos.write(bytes);
  //方法三:
    byte[] b = "abcde".getBytes(); 
    // 寫出從索引2開始,2個字節。索引2是c,兩個字節,也就是cd。 
    fos.write(b,2,2);
} catch (Exception e) {
    e.printStackTrace();
 } finally {
    try {
       fos.close();
 } catch (IOException e) {
     e.printStackTrace();
   }
}

每次程序運行,創建輸出流對象,都會清空目標文件中的數據。如果想要在每次是增量的輸出的話,就得使用下面的兩個構造方法;

public FileOutputStream(File file, boolean append) : 
創建文件輸出流以寫入由指定的 File對象表示的文件。
public FileOutputStream(String name, boolean append) : 
創建文件輸出流以指定的名稱寫入文件。

這兩個構造方法,參數中都需要傳入一個boolean類型的值, true 表示追加數據, false 表示清空原有數據。

這樣創建的輸出流對象,就可以指定是否追加續寫了;

FileOutputStream fos = new FileOutputStream("fos.txt"true);

系統中的換行符:

Windows系統裏,每行結尾是 回車+換行 ,即 \r\n ;
Unix系統裏,每行結尾只有 換行 ,即 \n ;
Mac系統裏,每行結尾是 回車 ,即 \r 。從 Mac OS X開始與Linux統一。

2、FileWriter類方法

public abstract void close() :關閉此輸出流並釋放與此流相關聯的任何系統資源。
public abstract void flush() :刷新此輸出流並強制任何緩衝的輸出字符被寫出。
public void write(int c) :寫出一個字符。
public void write(char[] cbuf) :將 b.length字符從指定的字符數組寫出此輸出流。
public abstract void write(char[] b, int off, int len) :從指定的字符數組寫出 len字符,從偏移量 off開始輸出到此輸出流。
public void write(String str) :寫出一個字符串

flush會把之前的內容收寫出到文件中,每次的flush都會刷新寫出到文件中,最後close關閉資源的時候,也會寫出一次數據; 實時刷新數據到文件中

  FileWriter fw = new FileWriter("ddd.txt");
  fw.write(97);
  fw.flush();
  fw.write('f');
  fw.flush();
  fw.write('9');
  fw.flush();
  fw.close();

寫出內容到文件

        FileWriter fw = new FileWriter("test.txt");
//        寫出char類型內容
        fw.write(48);
        fw.flush();
//        寫出字符串
        fw.write("好的");
        fw.flush();
//        寫出char型數組
        char[] chars = {'1','2', '3','4','5'};
        fw.flush();
//        寫出字符串指定內容
        fw.write(chars);
        fw.write("qwert",2,3);
        fw.flush();
//        寫出char型數組指定內容      
        fw.write(chars,2,2);
        fw.flush();
        
        fw.close();

四、複製文件

1、字節流方式

     // 1.創建讀入的對象
    FileInputStream fis = new FileInputStream("D:\\test.jpg");
	//1.2 創建寫出的對象
    FileOutputStream fos = new FileOutputStream("test_copy.jpg");
     // 2.讀寫數據
        byte[] b = new byte[1024];
        int len;
        while ((len = fis.read(b))!=-1) {
            fos.write(b, 0 , len);
        } 
    // 3.關閉資源
        fos.close();
        fis.close();

2、緩衝流方式

  BufferedInputStream fis = new BufferedInputStream(new FileInputStream("fos.txt"));
  BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("copy.txt"));
  int len;
  while ((len=fis.read())!=-1){
      fos.write(len);
  }
  fis.close();
  fos.close();
發佈了72 篇原創文章 · 獲贊 49 · 訪問量 6368
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章