IOStream 2

April 27th

  1. 字符流
  • 文本文件用字節(jié)流讀取 可能會(huì)出現(xiàn)亂碼,所以要用到字符流

fileWriter是有緩存的,先存到緩存中,字節(jié)流沒有緩存直接寫到文件中。
out.flush(), 刷新緩存
關(guān)閉的時(shí)候會(huì)調(diào)用刷新的方法


字符輸出流

按照字符來進(jìn)行讀取,一個(gè)英文是一個(gè)字符,一個(gè)中文也是一個(gè)字符
如果操作的是文本類型的文件,使用字符流操作,
如果是非文本類型的文件,使用字節(jié)流操作。

  • 字符輸入流
    字符輸入
  1. 字節(jié)字符轉(zhuǎn)換流
    復(fù)制文件
  public class CopyFileDemo {
      public static void copyFile(File target, String dest) {
  String fileName = target.getName();
      File destFile = new File(dest + fileName);
      try {
          InputStream in = new FileInputStream(target);
          OutputStream out = new FileOutputStream(destFile);
          byte[] bytes = new byte[1024];
          int len = -1;
          while ((len = in.read(bytes)) != -1) {
              out.write(bytes, 0, len);
          }
          out.close();
          in.close();

      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }}public static void main(String[] args) {
      // TODO Auto-generated method stub
      File Target = new File("http://Users//Zellerpooh//Desktop//images//dddddb.jpg");
      String dest = "http://Users//Zellerpooh//Desktop";
      copyFile(Target, dest);
      System.out.println("文件復(fù)制成功");
        }
  } ```

  交換
  ```
  public class ChangeStreamDemo {
      public static String reader(InputStream in){
          BufferedReader reader=new BufferedReader(new InputStreamReader(in));
          try {
              return reader.readLine();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
          return null;
//          Reader reader=new InputStreamReader(in);
//          char[] cs=new char[1024];
//          int len=-1;
//          StringBuffer buf=new StringBuffer();
//          try {
//              while((len=reader.read(cs))!=-1){
//               buf.append(new String(cs,0,len));
//              }
//              reader.close();
//              return buf.toString();
//          } catch (IOException e) {
//              // TODO Auto-generated catch block
//              e.printStackTrace();
//          }
//          return null;
      }
      public static void main(String[] args) {
//          Scanner input=new Scanner(System.in); 控制臺(tái)輸入,只有字節(jié)流
          String info=reader(System.in);
          System.out.println(info);
      }
}

   ```
3. 緩沖流
對(duì)文件或其它目標(biāo)頻繁的讀寫操作,效率低,性能差。
首先要明確一個(gè)概念:
使用緩沖流的好處是,能夠更高效的讀寫信息,原理是將數(shù)據(jù)先緩沖起來,然后一起寫入或者讀取出來

BufferedInputStream: 為另一個(gè)輸入流添加一些功能,在創(chuàng)建 BufferedInputStream 時(shí),會(huì)創(chuàng)建一個(gè)內(nèi)部緩沖區(qū)數(shù) 組,用于緩沖數(shù)據(jù)。

BufferedOutputStream:通過設(shè)置這種輸出流,應(yīng)用程序就可以將各個(gè)字節(jié)寫入底層輸出流中,而不必針對(duì)每次字 節(jié)寫入調(diào)用底層系統(tǒng)。

BufferedReader:從字符輸入流中讀取文本,緩沖各個(gè)字符,從而實(shí)現(xiàn)字符、數(shù)組和行的高效讀取。
BufferedWriter:將文本寫入字符輸出流,緩沖各個(gè)字符,從而提供單個(gè)字符、數(shù)組和字符串的高效寫入。

![BufferedInputStream](http://upload-images.jianshu.io/upload_images/1859111-260810cb14d07ec7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![BufferedOutputStream](http://upload-images.jianshu.io/upload_images/1859111-d687c9e95360335f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![BufferedReader](http://upload-images.jianshu.io/upload_images/1859111-b612da3e7bd79e12.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![BufferedWriter](http://upload-images.jianshu.io/upload_images/1859111-0e03a7aad5ae501d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

4. 打印流
打印流的主要功能是用于輸出,在整個(gè)IO包中打印流分為兩種類型: 字節(jié)打印流:PrintStream
字符打印流:PrintWriter
打印流可以很方便的進(jìn)行輸出

5.  對(duì)象流
效率不高,真實(shí)使用時(shí)很少使用
> 類需要實(shí)現(xiàn)Serializable接口   transient 表示該屬性不用序列化

![ObjectStream](http://upload-images.jianshu.io/upload_images/1859111-beff3d04c6b1c96f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

6. 字節(jié)數(shù)組流
包含一個(gè)內(nèi)部緩沖區(qū),該緩沖區(qū)包含從流中讀取的字節(jié)。內(nèi)部計(jì)數(shù)器跟蹤 read 方法要提供的下一個(gè)字節(jié)。 關(guān)閉
ByteArrayInputStream
ByteArrayInputStream 無效。此類中的方法在關(guān)閉此流后仍可被調(diào)用,而不會(huì)產(chǎn)生任何 IOException。 ByteArrayOutputStream
此類實(shí)現(xiàn)了一個(gè)輸出流,其中的數(shù)據(jù)被寫入一個(gè) byte 數(shù)組。緩沖區(qū)會(huì)隨著數(shù)據(jù)的不斷寫入而自動(dòng)增長(zhǎng)??墒褂?toByteArray() 和 toString() 獲取數(shù)據(jù)。 關(guān)閉 ByteArrayOutputStream 無效。此類中的方法在關(guān)閉此流后仍可被調(diào) 用,而不會(huì)產(chǎn)生任何 IOException。

7. 數(shù)據(jù)流
DataInputStream:
數(shù)據(jù)輸入流允許應(yīng)用程序以與機(jī)器無關(guān)方式從底層輸入流中讀取基本 Java 數(shù)據(jù)類型。應(yīng)用程序可以使用數(shù)據(jù)輸出 流寫入稍后由數(shù)據(jù)輸入流讀取的數(shù)據(jù)。 DataInputStream 對(duì)于多線程訪問不一定是安全的。 線程安全是可選的, 它由此類方法的使用者負(fù)責(zé)。
DataOutputStream:
數(shù)據(jù)輸出流允許應(yīng)用程序以適當(dāng)方式將基本 Java 數(shù)據(jù)類型寫入輸出流中。然后,應(yīng)用程序可以使用數(shù)據(jù)輸入流將 數(shù)據(jù)讀入。

8. 字符串流
StringReader 其源為一個(gè)字符串的字符流。
StringWriter
一個(gè)字符流,可以用其回收在字符串緩沖區(qū)中的輸出來構(gòu)造字符串。 關(guān)閉 StringWriter 無效。此類中的方法在關(guān)閉 該流后仍可被調(diào)用,而不會(huì)產(chǎn)生任何 IOException。
9. RandomAccessFile
RanndomAccessFile是IO包的類,從Object直接繼承而來。 只可以對(duì)文件進(jìn)行操作,可以對(duì)文件進(jìn)行讀取和寫入。 當(dāng)模式為r是,當(dāng)文件不存在時(shí)會(huì)報(bào)異常,當(dāng)模式為rw時(shí),當(dāng)文件不存在時(shí),會(huì)自己動(dòng)創(chuàng)建文件,當(dāng)文件已經(jīng) 存在時(shí) 不會(huì)對(duì)原有文件進(jìn)行覆蓋。

RandomAccessFile有強(qiáng)大的文件讀寫功能,其內(nèi)部是大型 byte[],可以通過seek(),getFilePointer()等方法操作的 指針,方便對(duì)數(shù)據(jù)進(jìn)行寫入與讀取。還可以對(duì)基本數(shù)據(jù)類型進(jìn)行直接的讀和寫操作。

RandomAccessFile的絕大多數(shù)功能,已經(jīng)被JDK 1.4的nio的“內(nèi)存映射文件(memory‐mapped files)”給取代了,你該考 慮一下是不是用“內(nèi)存映射文件”來代替RandomAccessFile了。
![RandomAccessFile](http://upload-images.jianshu.io/upload_images/1859111-e256802ebd0fce2f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容