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文字出力ストリームのスーパークラス 出力ストリームコード:上のセグメントコードはJava 7の異常な新特性である:try-with-resource:それは自分で資源管理を行うことができ、例えば上の例はマニュアルcloseを必要としない.try(/*ここはコードブロック*/)という文法的に節約された多くのコードです. OutputStreamは抽象的なクラスであり、サブクラスを通じて実装しなければならない. OutputStreamは主に2つの機能に分かれています. ワード入力データのwriteシリーズ方法 パラメータは、byte:単一バイト です.パラメータは、byte配列 である.パラメータは、byte配列と配列の開始位置と長さ である.
フローの制御 クローズ:close 更新保存:flush:実際には手動flushを必要としません.第一:内部バッファが満期になると自動的にflushを実行します.第二に、invoke close方法の場合、自動的にflushを実行します. ストリームコードを入力:上の段は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を使用できます.
二つの重要な方法: long get FilePointer():ファイルレコードを取得する現在のポインタ位置 void seek:ファイルの記録ポインタをpositionの位置に特定する. Random Access Fileを使うにはモードを設定する必要があります. r:読み取り専用 rw:読み書きがないと自動的に作成されます. rws:読み書き、ファイルの内容とメタデータの変更は同時にTarget Deviceに更新されます. rwd:rwsと同様に、メタデータが変更されると、Target Device に同期して更新されないことが違います.
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 }
このコードを見たら、ちょっとおかしいですか?緊張しないでください 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: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:任意のアクセス内容:ファイルの内容を読み取ることができますし、ファイルにデータを出力することもできます.ファイルの任意の位置に自由にアクセスできます.ファイル記録ポインタを自由に位置決めできます.二つの重要な方法:
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 }