Javaの基本:IOストリームのフラッシュ

オリジナルリリースでJavaIO魔法のフラッシュ多くの人がこれを読んで、それをここにナゲッツの友人にお勧めします。

エグゼクティブサマリー

デザインJavaのIOストリームは、素敵な人々を持っているデザイナーのゴースト斧天の道を賞賛します。

あなたは、Javaの初心者であれば、私はそれを学ぶことは難しくありませんでしたので、「!Kuangyun」になり、ジャワとの最初の接触のIOクラスを保証することができますが、あまりにも多く、その作るには「のようなものは知りません本当の色は「あなたが完了したときに感じ、彼はのようなものだった」ちょうどこの山では、「ひらめきので。

ネットワークプログラミングの特定には、Javaプログラミングの時代には、JavaのIOからほとんど不可分ストリーム、ので、彼を学ぶことが必要です。

JavaのIOの分類はストリーム上では、魔法のフラッシュ方法あなたと共有し、SOSO今日、オンラインで行くことができます。

フラッシュ与のOutputStream

フラッシュ()のソースコードを参照するにはフラッシュの方法を書き換え、このクラスが実装流せるインターフェースは、あなたが知っているように、よりになります。

public void flush() throws IOException { } 
复制代码

申し訳ありませんが、この実装は空です。ここでフラッシュが実際に空の方法で、何もしませんでした。ああ見て、メソッドが抽象メソッドが本当の方法ではありません。メソッド本体は何もに加えて、よりよい他の!JDKのAPIは、それを説明する方法を参照してください!

flush 
public void flush() throws IOException 
刷新此输出流并强制写出所有缓冲的输出字节。
flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。 
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
OutputStream 的 flush 方法不执行任何操作。
指定者: 接口 Flushable 中的 flush 
抛出: IOException - 如果发生 I/O 错误。
复制代码

最初は、私は自分自身を慰め、クラスがサブクラスは確かに、このメソッドをオーバーライドすることを抽象クラスです。

ByteArrayOutputStream、たFileOutputStream、FilterOutputStream、ObjectOutputStreamの、OutputStreamを、持つPipedOutputStreamおよび他のいくつかのカテゴリ:まあ、OutputStreamのの直接のサブクラスがあります。

注:これはのOutputStreamのパッケージ持つorg.omg.CORBA.portableのサブクラスです。

たFileOutputStreamため、ByteArrayOutputStream、org.omg.CORBA.portable.OutputStreamクラスそのフラッシュ()メソッドは、親クラスからフラッシュメソッドを継承しています。

FilterOutputStreamクラスはフラッシュ()メソッドをオーバーライドしますが、本質はコールフラッシュ()メソッドへの親クラスです。

ObjectOutputStreamのは、持つPipedOutputStreamクラスは、フラッシュ()メソッドをオーバーライドします。

二つの小さな例を与えるために、メインテキストに文字列の最初の例が書き込まれ、書き込み特定のデータの第2の例では、テキストバイト。

1、例1:テキストに文字列を書き込みます

 import java.io.BufferedOutputStream; 
 import java.io.DataOutputStream; 
 import java.io.File; 
 import java.io.FileOutputStream;
 ​
 public class Test {     
     public static void main(String[] args) throws Exception {       
         File file = new File("text.txt");       
         if (!file.exists()) {       
             file.createNewFile();       
         }       
         FileOutputStream fos = new FileOutputStream(file);
         BufferedOutputStream bos = new BufferedOutputStream(fos);   
         DataOutputStream dos = new DataOutputStream(fos);
         dos.writeBytes("java io");
     } 
 } 
复制代码

図2に示すように、実施例2:書き込みが特定のテキストにデータのバイト

 import java.io.BufferedOutputStream; 
 import java.io.File; 
 import java.io.FileOutputStream; 
 ​
 public class Test {     
     public static void main(String[] args) throws Exception {       
         File file = new File("text.txt");       
         if (!file.exists()) {           
             file.createNewFile();       
         }       
         FileOutputStream fos = new FileOutputStream(file);      
         BufferedOutputStream bos = new BufferedOutputStream(fos);       
         byte[] b = new byte[1024*8];        
         bos.write(b);       
         bos.flush();    
     }
 } 
复制代码

これらの二つの世代を実行した後、それぞれが7ファイルのバイト(コンテンツjavaのIO)と、現在のディレクトリに1キロバイトのバイトのファイルを生成します。

ここでは、いくつかはそれとして、驚くべきことであるものを、と言うでしょうか?ああ、ハを心配しないでください!

今、私たちはコールフラッシュ()メソッドをコメントアウトするために主に、第二のコードを修正し、次の通り:

 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 ​
 public class Test {
     public static void main(String[] args) throws Exception {
         File file = new File("text.txt");
         if (!file.exists()) {
             file.createNewFile();
         }
         FileOutputStream fos = new FileOutputStream(file);
         BufferedOutputStream bos = new BufferedOutputStream(fos);
         byte[] b = new byte[1024];
         bos.write(b);
         //bos.flush();
     }
 } 
复制代码

OK、神は再び、量がコードを実行しますか?ファイルサイズは実際には0バイトです。

なぜ?

慎重にあなたが最初のサンプルコードは、フラッシュ()メソッドを呼び出していないことがわかります、私はきちんと書くことができました。なぜ二それはできますか?それとも元から今の答えの検索を開始します!

DataOutputStreamを継承FilterOutputStream、DataOutputのインターフェイスを実現。私たちは、FilterOutputStreamクラスはフラッシュ()メソッドをオーバーライドします知っているが、本質はコールフラッシュ()メソッドへの親クラスです。次のようにDataOutputStreamのクラスフラッシュ()メソッドは、実際のFilterOutputStreamの親クラスは、次のとおりです。

 public void flush() throws IOException {    
     out.flush(); 
 }
复制代码

だから、あなたはコードの後dos.flush追加しても、最初の例()の結果は正常であり、かつその親フラッシュ()メソッドと同じ効果なしで、なぜ最初である、空になっていますどこ魔法のコード。

どこで「原因」のコードにおける第二の外観?構造なBufferedOutputStreamクラスで最初に見て:

 public class BufferedOutputStream extends FilterOutputStream
复制代码

それを見フラッシュ()メソッド:

 public synchronized void flush() throws IOException {         
     flushBuffer(); 
     out.flush();
 } 
 ​
 /** Flush the internal buffer */    
 private void flushBuffer() throws IOException {   
     if (count > 0) {        
         out.write(buf, 0, count);       
         count = 0;        
     }    
 } 
复制代码

はい、このクラスは、()メソッドではなく、親クラスのコテージフラッシュである()メソッドを継承していないいくつかのクラスの前でフラッシュを上書きします。なBufferedOutputStreamクラスはバッファリング技術を使用して、クラスで、このクラスでは、独自のフラッシュ()メソッドを実現する事になるでしょう。

まあ、誰かが時間のこの種を使用するように要求されます、あなたが自分自身は確かに、まだ方法フラッシュ()を使用しないで持っていないのですか?しかし、前提があり、あなたのバイトのデータは、8キロバイト以上でなければなりません。サンプルコード、メモというフラッシュ()メソッド。

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 

public class Test { 	
    public static void main(String[] args) throws Exception { 	
        File file = new File("text.txt"); 		
        if (!file.exists()) { 	
            file.createNewFile(); 	
        } 		
        FileOutputStream fos = new FileOutputStream(file); 		
        BufferedOutputStream bos = new BufferedOutputStream(fos); 		
        byte[] b = new byte[1024*8]; 	
        bos.write(b); 		
        //bos.flush(); 
    }
} 
复制代码

コードの実行は、8キロバイトのテキストファイルを生成します。

もちろん、どのようにすべての時間、あなたのデータが少ない8キロバイト、それ以上ではないだろうことを知っているが、そのフラッシュを呼び出す()メソッドは比較的安全である可能性があります。

(あなたは良い習慣を持っている場合)しかし、その後、再び、一般の実行後にIOたちは、ソースコードは、方法はまた、対応するフラッシュ()メソッドを呼び出していることを知ることができます参照してください、close()メソッドを呼び出して行くよストリーム。

あなたは読み取りと書き込みのファイルが意図した目的を満たしていない場合はここで、あなたを思い出させるために、最も可能性の高いあなたは、コールフラッシュ()またはclose()メソッドを持っていないため。

また、文字ストリームクラスのほとんどは、彼らが法のStreamEncoderクラスを呼び出していることを除いて、フラッシュ()またはclose()メソッドを実装しています。このクラスはsun.nio.csパッケージの下に配置され、JDKでのソースコードは、私たちはそうではありません。

StreamEncoder.javaは、ソースを表示をクリックすることができます。

フラッシュ与ライター

ライタークラスは抽象クラス、次の文です。

public abstract class Writer implements Appendable, Closeable, Flushable
复制代码

ライター・クラスのフラッシュ()メソッドは、サブクラスは、一般的に、このメソッドを実装し、抽象メソッドです。

そのため、一般的なあなたが(フラッシュを呼び出すために必要なものを使用した後の文字列)またはclose()メソッド。

abstract public void flush() throws IOException;
复制代码

JDKのAPIの詳細、またはJavaのソースコードとStreamEncoderクラス上のソースコードを参照してください。

今日は、私たち主にJavaのIOバイトストリームとフラッシュ()メソッドの文字ストリームを介して、確認するために言語のソースコードをプログラミングを学ぶために示しており、非常に重要だと思うし、ここで終了します。

要するに、あなたがストリームに使用するものに関係なく技術(文字は、バイトストリームがバッファリングされた)を、出力ストリームに書き込むことができないデータを防ぐためにフラッシュ()またはclose()メソッドを呼び出すこともできます。


学習の方法は容易ではない、との考えを主張し、実際は〜王であります

おすすめ

転載: juejin.im/post/5e081a56e51d4557e94ffd3b