Java IOプローブ


この間、会社の新入社員にJavaのトレーニングをしていました.  IOの過程で、自分が以前学んだJava IOについて新たな認識を持つようになった.
まず、次のコードから説明します.
 import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
public class SequenceStreamTest {
 /**
  * @throws Exception 
  * @           
//  */
 public static void main(String[] args) throws Exception 
 {
  FileInputStream fis_01 = new FileInputStream("D:\\Java IO\\    \\error.txt");
        ByteArrayInputStream byis = new ByteArrayInputStream("           ".getBytes("GBK"));
  FileInputStream fis_02 = new FileInputStream("D:\\Java IO\\    \\    .txt");
  List arrayList = new ArrayList();
  arrayList.add(fis_01);
  arrayList.add(byis);
  arrayList.add(fis_02);
  Enumeration cocel = Collections.enumeration(arrayList); 
  SequenceInputStream seq = new SequenceInputStream(cocel);
  byte[] buf = new byte[1024];
//  int i= -1;
  int n=0;
  FileOutputStream fout = new FileOutputStream("D:\\Java IO\\    \\seq.txt");
  while((seq.read(buf))>0)
  {
            fout.write(buf);
            fout.flush();
  }
  
        seq.close();
  fout.close();
        
 }
}

         このコードの実行が完了した後、私が望んでいる結果ではないことに気づきました.私の予想結果は、どのストリームが先に追加されるか、結果ファイルにその内容が先に表示されます.しかし、最後の結果、2番目のストリームの内容は、1番目のストリームの内容の中にあり、1番目のストリームが読み取った内容に問題があり、いくつかの重複した内容が発生した.この問題は新入社員に研修したとき、何の問題なのか分かりませんでした.それから、授業の下で、私は考えてみましたが、実は理解しやすいです.このように、同じバイト配列に対して複数のストリームからデータを読み出し、各ストリームの最後の読み出しに対して、必ずしもこのバイト配列を満たすことができるとは限らないが、この配列を満たすことができない部分が、前回読み取った内容であり、コンテンツの重複と異なるストリームの内容が交差する場合がある.したがって、次のコード・セグメントを変更することに重点を置きます.
		int n=0;
		FileOutputStream fout = new FileOutputStream("D:\\Java IO\\    \\seq.txt");
while((n=seq.read(buf))>0)
{                                       fout.write(buf,0,n);
                                       fout.flush();
		}

     次に、PrintStreamというクラスは、自動リフレッシュバッファを設定した後、println()を呼び出すだけで自動的にデータをデータパケットに書き込むことができます.逆に、自動リフレッシュを設定しないと、println()を呼び出すと自動的にデータパケットにデータが書き込まれません.しかし、次のコードでは奇妙な現象が発生しました.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigDecimal;


public class PrintStreamTest {

	/**
	 * @throws Exception 
	 * @   PrintStream  
	 */
	public static void main(String[] args) throws Exception 
	{
		FileOutputStream fout = new FileOutputStream("H:\\     \\   \\Java IO\\    \\ps.txt");
		fout.write("hanwangkunxx".getBytes());
                                PrintStream ps = new PrintStream(fout,false);
                                ps.print("2012          !");
                                ps.println("                   !");
                                ps.println("2012         8 !");
                                ps.close();        
	}
}

    このコードは、上記のチュートリアルで理解すると、println()を呼び出すたびにデータをデータ送金に書き込むべきではありませんが、実際の結果は呼び出すたびに結果をデータ送金に書き込むことであり、教室で解決されていない問題でもあります.その後、授業の下で、ソースコードとネット上の関連資料を調べたところ、上のルールはバッファのあるストリームにしか適用されていないのに対し、私たちのFileOutputStreamとPrintStreamはバッファがないので、このルールには適用されないので、次のコードに変えればいいのです.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigDecimal;


public class PrintStreamTest {

	/**
	 * @throws Exception 
	 * @   PrintStream  
	 */
	public static void main(String[] args) throws Exception 
	{
	     FileOutputStream fout   = new FileOutputStream("D:\\Java IO\\    \\ps.txt");                     fout.write("hanwangkunxx".getBytes());
                     PrintStream ps = new PrintStream(new BufferedOutputStream(fout),true);
                     ps.print("2012          !");
                     ps.println("                   !");
                     ps.println("2012         8 !");
                     ps.close();       
	}
}

         この問題から、出力ストリームはflush()メソッドやclose()を呼び出すだけでデータをデータ為替に書き込むことができるということに気づいたのではないでしょうか.しかし、2つ目の例は、そうではありません.OutputStreamとFileOutputStreamの2つのストリームのソースコードを調べたところ、OutputStreamクラスについては、そのflush()メソッドは空のメソッドで、何もしないが、FileOutputStreamはOutputStreamのflush()メソッドを書き換えていないため、同じメソッド、つまりFileOutputStreamストリームクラスについてflush()を呼び出すかどうかが分かった.
メソッドは、すぐにデータをデータ為替に書き込んで、FileOutputStreamのwrite()メソッドをよく見ると、下位に書かれたDLLファイルを呼び出してデータ書き操作を行うことがわかります.
         
         この時、私はまた前の問題を思い出しました.markSupported()メソッドはtrueを返し、falseを返すストリームがあります.ソースコードを調べると,この方法だけでなくreset()メソッドとmark()メソッドはバッファのあるストリームに対しても,バッファのあるストリームに対してもこれらの方法はいずれも
これらの方法を使用して、対応するデータ・ソースを繰り返し読み書きすることができます.
        
        ここで、トレーニングのいくつかの問題を通じて、私はJavaに対して  IOはより深い認識を持っている.それによって私の観点も証明しました:他の人に訓練することを通じて、あなたのこの知識に対する応用と理解を大きく深めることができて、これは独学にとってとても役に立ちます.