0

Data Streams についてオンラインで見つけたいくつかの例に基づいてこのクラスを作成しましたが、各実行の最後に EOFException が発生しています。調べてみると、予想外にストリームの終わりに達したと書かれていました。コンソールで動作しているように見えます (少なくとも、正しい一連の数字を吐き出します)。実行後に内容を調べると、テキストファイルは意味不明です。

public class DataStreamExample {

    public static void main(String args[]) {
        int choice = 0;
        int[] numbers = { 25, 4, 19, 70, 12, 28, 39, 30 };

        System.out.println("This program will provide an example on how the Data Stream works.");
        System.out.println("Note: Data Streams only work with primative data types.");
        System.out.println();
        System.out.println();


        try {
            System.out.println("1. For write Data operation");
            System.out.println("2. For read Data operation");  
            System.out.println("Enter the number for the operation of your choice: ");

            BufferedReader buffRead = new BufferedReader(new InputStreamReader(System.in));
            choice = Integer.parseInt(buffRead.readLine());
            switch(choice){
                case 1:  
                    FileOutputStream fileOut = new FileOutputStream("Example.txt");
                    BufferedOutputStream buffOut = new BufferedOutputStream(fileOut);
                    DataOutputStream dOutput =new DataOutputStream (buffOut);
                    for (int i = 0; i < numbers.length; i ++) {
                        dOutput.writeInt(numbers[i]);
                    }
                    System.out.print("writing data ");  
                    dOutput.close();

                case 2:
                    FileInputStream fileIn = new FileInputStream("Example.txt");
                    BufferedInputStream buffIn = new BufferedInputStream(fileIn);
                    DataInputStream dInput = new DataInputStream (buffIn);
                    while (true){
                        System.out.print(dInput.readInt());
                    }

                default:
                    System.out.println("Invalid choice");  
            }
        } 
        catch (Exception e) {
            System.err.println("Error in read/write data to a file: " + e);
        }

    }
}

これをクリーンアップするのに役立つアドバイスや観察を誰かが持っているので、ファイルが意味不明になり、例外をキャッチしませんか? 操作を終了してストリームを閉じるにはどうすればよいですか?

4

3 に答える 3

1

入力操作では、 forever を読み取っているwhile(true)ため、ループを完了する唯一の方法は をスローすることEOFExceptionです。操作をそのように完了させたくない場合は、開始する前に読み取っている int の数を知る必要があります (それを使用してループを制限します)。

ファイルが意味不明に見える理由は、値をバイナリとして書き込んでいるためです。ファイル内の int を読み取りたい場合は、それらをテキストとして書き込む必要があります。

また、break;各ケースの最後にステートメントを配置する必要があります。

于 2013-01-22T04:42:14.183 に答える
0

いくつかのこと:

  1. 「データ操作の書き込み」に1を入力するbreak;と、case ステートメントがないため、データを書き込もうとすると、整数がファイルに書き込まれ、次に 2 番目のケースが実行され、読み取ろうとします。それから。これがあなたの意図であるかどうかはわかりません。breakしかし、それが起こらないようにするために a を追加することができます:

            case 1:  
                FileOutputStream fileOut = new FileOutputStream("Example.txt");
                BufferedOutputStream buffOut = new BufferedOutputStream(fileOut);
                DataOutputStream dOutput =new DataOutputStream (buffOut);
                for (int i = 0; i < numbers.length; i ++) {
                    dOutput.writeInt(numbers[i]);
                }
                System.out.print("writing data ");  
                dOutput.close();
                break;
    
  2. データ ファイルから読み取ろうとすると、無期限にループします。

                while (true){
                    System.out.print(dInput.readInt());
                }
    

    つまり、ファイルの最後に到達するまで、シリアル化された整数の読み取りを試行し続けます。ファイルの終わりに到達すると、ストリームは EOFException` をスローします。ループをこれに変更して、例外を防ぐことができます。

                while (dInput.available()>0){
                   System.out.print(dInput.readInt());
                }
                break;
    
  3. 整数を印刷すると、それらはすべてごちゃごちゃになります。

  4. テキストファイルはテキストではないため、意味不明です。ストリームに書き込むオブジェクト (またはプリミティブ) を使用するDataOutputStreamと、データが移植可能になるように処理されます。

于 2013-01-22T04:40:12.220 に答える
0

さて、使用する代わりに

while (true){
    System.out.print(dInput.readInt());
 }

あなたが使用する必要があります

while(dInput.available()>0){
    System.out.print(dInput.readInt());
}

while(true) を使用すると、常にストリームから読み込まれるため、ストリームが EOF (End Of File) に達したときにインクルードします
。結局、close() メソッドを使用してすべてのストリームを閉じる必要があります。

于 2013-01-22T04:41:11.093 に答える