Android開発のI/Oストリーム下編

17048 ワード

上編では、IOフローの概念とFileクラスの操作が書かれていますが、上編の内容を見たいなら、ここをクリックしてください.  http://www.cnblogs.com/idayln/archive/2013/05/27/3102810.html . この文は姉妹編です.この文章はDemoを主として、多すぎる概念に関わることはありません.
  • 入力ストリーム:InputStream/Readerは一連のリード方法を持っています.
  • InputStreamは、バイト入力ストリームのスーパークラス
  • である.
  • Readerは文字入力ストリームのスーパークラス
  • である.
  • 出力ストリーム:OutputStream/Writerは一連のwrite方法を持っています.
  • OutputStreamバイト出力クラスのスーパークラス
  • Writer文字出力ストリームのスーパークラス
  • 出力ストリームコード:
    1 static void demo0() throws Exception {
    2         try (OutputStream outputStream = new FileOutputStream("demo1.txt")) {
    3             outputStream.write("First 'demo' for how to use 'OutputStream' !"
    4                     .getBytes());
    5         }
    6         System.out.println("Over");
    7     }
    このコードを見たら、ちょっとおかしいですか?緊張しないでください
  • 上のセグメントコードはJava 7の異常な新特性である:try-with-resource:それは自分で資源管理を行うことができ、例えば上の例はマニュアルcloseを必要としない.try(/*ここはコードブロック*/)という文法的に節約された多くのコードです.
  • OutputStreamは抽象的なクラスであり、サブクラスを通じて実装しなければならない.
  • OutputStreamは主に2つの機能に分かれています.
  • ワード入力データのwriteシリーズ方法
  • パラメータは、byte:単一バイト
  • です.
  • パラメータは、byte配列
  • である.
  • パラメータは、byte配列と配列の開始位置と長さ
  • である.
  • フローの制御
  • クローズ:close
  • 更新保存:flush:実際には手動flushを必要としません.第一:内部バッファが満期になると自動的にflushを実行します.第二に、invoke close方法の場合、自動的にflushを実行します.
  • ストリームコードを入力:
     1 static void demo1() throws IOException{
     2         InputStream inputStream =null;
     3         try {
     4             inputStream = new FileInputStream("demo0.txt");
     5             byte[] bb = new byte[1024];  //   
     6             int temp;
     7             while((temp=inputStream.read(bb))!=-1){
     8                 System.out.println(new String(bb, 0, temp));
     9             }
    10         } catch (FileNotFoundException e) {
    11             // TODO Auto-generated catch block
    12             e.printStackTrace();
    13         }finally{
    14             if(inputStream!=null){
    15                 inputStream.close();
    16             }
    17         }
    18     }
     InputStream:
  • 上の段はJava 6の文法を採用しています.コードの量が増えているということは明らかに感じられますか?
  • はOutputStreamと同じ抽象的なクラスです.これらは比較的早いデザインの種類なので、流行のインターフェース向けプログラミングの思想を採用していません.
  • はOutputStreamと同じように、主に二つの機能があります.readシリーズの方法ですが、その流れの制御はflashではなく、skypを追加しました.markという二つの方法は普段はあまり使わないので、興味がある人は自分でAPIを調べてもいいです.
  • Reader,WriterとInputStream,OutputStreamの基本機能はここでは説明していません.InputStreamとOutputStreamを深く理解した後、他の勉強はとても早いです.異なる処理フローについては、APIを調べてください.
    IOストリーム体系構造表を添付します.
    IOストリーム体系構造
    カテゴリ
    バイト入力ストリーム
    バイト出力ストリーム
    文字入力ストリーム
    文字出力ストリーム
    抽象ベースクラス
    InputStream
    Output Steeam
    Reader
    Writer
    ファイル
    FileInputStream
    FileOutput Steam
    FileReader
    FileWriter
    行列
    ByteAray InputStream
    ByteArayOutputStream
    CharArayReader
    CharArayWriter
    バッファ
    BufferedInputStream
    BufferedOutputStream
    BufferdReader
    BufferWriter
    オブジェクト
    Object InputStream
    Object OutputStream
     
     
    変換
     
     
    InputStream Reader
    Output Stream Writer
    印刷
     
    PrintStream
     
    PrintWriter
    文字列
     
     
    StringReader
    StringWriter
    パイプ
    PipedInputStream
    PipedOutput Stream
    PipedReader
    PipedWriter
     
    これらの種類は、どのように記憶し、理解しますか?私はこのように理解しています.
    まず、それらを大別して、ノードフローと処理フローに分けます.ノードフローは直接物理ノードと対話することである.処理フローは通常、直接処理の対象がノードフローであり、さらに上の層の包装である.
    例えば、read操作を同期バッファリングしたいなら、BufferedInputStreamを使用できます.
     1 static void demo2() throws Exception{
     2         InputStream inputStream =null;
     3         BufferedInputStream bufferedInputStream =null;
     4         try {
     5             inputStream = new FileInputStream("demo0.txt");
     6             bufferedInputStream = new BufferedInputStream(inputStream);
     7             byte[] bb = new byte[1024];
     8             int temp=-1;
     9             while((temp=bufferedInputStream.read(bb))!=-1){
    10                 System.out.println(new String(bb,0,temp));
    11             }
    12         } catch (FileNotFoundException e) {
    13             // TODO Auto-generated catch block
    14             e.printStackTrace();
    15         }finally{
    16             if(inputStream!=null){
    17                 inputStream.close();
    18             }
    19         }
    20     }
    RandomAccess File:任意のアクセス内容:ファイルの内容を読み取ることができますし、ファイルにデータを出力することもできます.ファイルの任意の位置に自由にアクセスできます.ファイル記録ポインタを自由に位置決めできます.
    二つの重要な方法:
  • long get FilePointer():ファイルレコードを取得する現在のポインタ位置
  • void seek:ファイルの記録ポインタをpositionの位置に特定する.
  • Random Access Fileを使うにはモードを設定する必要があります.
  • r:読み取り専用
  • rw:読み書きがないと自動的に作成されます.
  • rws:読み書き、ファイルの内容とメタデータの変更は同時にTarget Deviceに更新されます.
  • rwd:rwsと同様に、メタデータが変更されると、Target Device
  • に同期して更新されないことが違います.
     1 static void demo3() throws Exception{
     2         RandomAccessFile file = new RandomAccessFile("demo0.txt", "rw");
     3         System.out.println("Before invoke write:"+file.getFilePointer());
     4         file.seek(file.length());
     5         file.write("
    Using RandomAccessFile Class".getBytes()); 6 7 System.out.println("After invoke write:"+file.getFilePointer()); 8 file.seek(0); 9 byte[] bb = new byte[1024]; 10 int temp=-1; 11 while ((temp=file.read(bb))>0) { 12 System.out.println(new String(bb,0,temp)); 13 } 14 15 file.close(); 16 }
    指定された場所にコンテンツを挿入するには、指定された場所の内容をキャッシュしなければなりません.
     1 static void demo4(String fileName,long position,String content) throws Exception{
     2         RandomAccessFile file = new RandomAccessFile(fileName, "rws");
     3         File tempFile = File.createTempFile("temp", null);
     4         
     5         long currentLength = file.length();
     6         if(position>currentLength){
     7             return;
     8             //Maybe you can setup position=currentLenght; Also you can setup anything what you want !!!
     9         }
    10         FileOutputStream fileOutputStream = new FileOutputStream(tempFile); // write data to "temp" file 
    11         FileInputStream fileInputStream = new FileInputStream(tempFile); // read data 
    12         byte[] bb = new byte[512];
    13         int tempNum=-1;
    14         
    15         file.seek(position);
    16         
    17         while((tempNum=file.read(bb))>0){
    18             fileOutputStream.write(bb, 0, tempNum);
    19         }
    20         
    21         file.seek(position); // Go back to position
    22         file.write(content.getBytes());
    23         
    24         while((tempNum=fileInputStream.read(bb))>0){
    25             file.write(bb, 0, tempNum);
    26         }
    27         
    28         tempFile.deleteOnExit();
    29         if(fileInputStream!=null){
    30             fileInputStream.close();
    31         }
    32         if(fileOutputStream!=null){
    33             fileOutputStream.close();
    34         }
    35         
    36         file.close();
    37     }