Java I/O 2 nd Edition翻訳

4826 ワード

2.3出力ストリームを閉じる
ストリームを完了したら、それを閉じる必要があります.これにより、オペレーティングシステムはストリームに関連するリソースを解放します.正確には、これらのリソースは、あなたのプラットフォームがストリームのタイプによって変化することに依存します.しかし、多くのシステムには限られたリソースしかありません.例えば、多くのパソコンのオペレーティングシステムでは、数百のファイルを同時に開くことはできません.マルチユーザオペレーティングシステムには大きな制限がありますが、制限はそれにもかかわらずです.
 
ストリームを閉じるには、close()メソッドを呼び出します.
 
public void close( ) throws IOException

例を挙げると、outがOutputStreamであると再仮定します. out.close()を呼び出す このストリームを閉じて、ファイルハンドルやネットワークポートなどのストリームに関連する潜在的なリソースを解放します.出力ストリームを閉じると、そのストリームの上に他のものを書くことはできません.このようにしようとしますが、いくつかのクラスでは発生しませんが、IOExceptionが投げ出されます.
 
 
          また、Sysout.outは、PringStreamとして放出されたすべての異常が食べられたため、局所的な異常です.閉じると
          System.out、それを書くことはできません.このようにしてみて、何の異常も投げ出さない.しかし、あなたの出力はコンソールに表示されません.
 
すべてのストリームが閉じる必要はありません.たとえば、バイト配列出力ストリームを閉じる必要はありません.ただし、ファイルとネットワーク接続に関係するストリームを使用する場合は、閉じる必要があります.例を挙げると、ファイルを開いて書くのに完了したときに閉じるのを忘れた場合、他のプロセスがそのファイルを読むときにブロックされる可能性があります.通常、ファイルが閉じるのは、次のためです.
 
try{
   OutputStream out = new FileOutputStream("numbers.dat");
   //Write to the stream...
   out.close();
}
catch(IOException ex){
   System.err.println(ex);
}

  しかし、このコードクリップには潜在的な脆弱性があります.IOExceptionが書かれている間に投げ出されると、このストリームは閉じられません.比較的信頼できる方法は、異常が投げ出されるかどうかにかかわらず、finally文ブロック内のストリームを閉じることです.このようにするには、try文ブロックの外にOutputStream値を宣言する必要があります.例:
//Initialize this to null to keep the compiler from complaining
//about uninitialized variables
OutputStream out = null;
try {
    out = new FileOutStream("numbers.dat');
    //Write to the stream...
}
catch (IOException ex) {
   System.err.println(ex);
}
finally{
    if(out != null) {
      try {
            out.close();
      }
      catch (IOException ex){
         System.err.println(ex);
      }
   }
}

 
Variable scope and nested try-catch-finally blocks make this a little uglier, yet it's quite a bit safer. The code can be a little cleaner if you have the option of propagating any IOExceptions thrown rather than catching them; that is, if the method that contains this code is declared to throw IOException. In that case, a typical call to close( ) works like this:
 
値範囲とネストされたtry-catch-finall文ブロックはこれを少しおかしくしますが、確かに安全です.スナップするのではなくIOExceptionsを投げ出す選択があれば、このコードはより簡潔になります.メソッドが例外を放出するために宣言された場合.その場合、典型的な呼び出しclose()は、次のように動作します.
 
// Initialize this to null to keep the compiler from complaining
// about uninitialized variables
OutputStream out == null;
try {
  out = new FileOutputStream("numbers.dat");
  // Write to the stream...
}
finally {
  if (out != null) out.close( );
}

 
2.3.1 Closeableインタフェース
 
Java 5はCloseableを追加しました  のインタフェース、OutputStreamはそれを実現しました
package java.io;
public interface Closeable {
  void close( ) throws IOException;
}

 
InputStream,Channel,Formatter,その他様々な実装がこのインタフェースを閉じることができます.個別に、追加のインタフェースの使用例は見つかりませんが、閉じることができるパラメータを受け入れる方法や他の類似の方法を書きたいと思っています.
 
 
2.4.出力ストリームのリフレッシュ
 
多くの出力ストリームキャッシュは、パフォーマンスを向上させるために使用されます.各バイトを書き込み先に送信するのではなく、バイトはキャッシュにいくつかのバイトから数千バイト増加します.キャッシュが満たされると、すべてのデータが一度に送信されます.このflush()メソッドは、キャッシュがいっぱいかどうかにかかわらず、データの書き込みを強制します.
 
public void flush() throws IOException

 
 これは、オペレーティングシステムまたはハードウェアで実行されるキャッシュとは異なります.flush()を呼び出すと、キャッシュはクリアされません.(このFileDescriptorクラスでsync()メソッドは、17章で議論され、これらのキャッシュをクリアできる場合があります.)
 
ストリームをしばらく使用すると、明確にリフレッシュする必要はありません.ストリームが閉じると自動的にリフレッシュされます.これは、プログラムが終了するかclose()メソッドが呼び出されると発生します.出力ストリームを明確にリフレッシュするのは、ストリームが終了する前にデータが送信されたことを確認するときだけです.一例として、プログラムが定期的にネットワークを介して大量のデータを送信する場合、大量のデータがストリームに書き込まれるたびにリフレッシュされるべきである.
 
デバグでクラッシュしたプログラムを作ったとき.キャッシュが満たされると、すべてのストリームが自動的にリフレッシュされ、プログラムが終了すると、すべてのストリームがリフレッシュされるはずです.プログラムが正常でない場合、キャッシュはリフレッシュされない可能性があります.この場合、flush()が書き込み操作のたびに呼び出されない限り、 データ出力がプログラムのクラッシュを示す場所を特定することはできません.実際には、このプログラムはクラッシュ前に実行され続けています.
 
System.out、System.err、およびprintln()を呼び出して自動的にリフレッシュし、印刷された文字に新しい改行記号(')が表示されます.PrintStreamコンストラクタで自動的にリフレッシュできるかできないかを設定します.
 
2.4.1 Flushableインタフェース
 
Java 5はFlushableインタフェースを追加し、OutputStreamクラスがそれを実現した.
 
package java.io;
public interface Flushable {
  void flush( ) throws IOException;
}

 
2.5サブクラス化出力ストリーム
 
OutputStreamは抽象クラスであり、主にOutputStreamに関連するいくつかの動作を記述している.特殊なサブクラスは、バイトを特殊な目的地に書く方法を知っています.1つの例では、FileOutputStreamが独自のコードを使用してデータを書きます.ByteArrayOutputStreamは、拡張されたバイト配列に出力を書き込むために純粋なJavaを使用します.