0

このコードを使用してJavaでファイルを読み取っています

import java.io.*;

public class IOReadDataStreams {
    public static void main(String[] args)throws IOException{
        DataInputStream in = null;

        try{
            in =  new DataInputStream(
                    new BufferedInputStream(new FileInputStream("invoicedata")));
            int unit;
            double price;
            String desc;
            while(true){
                unit = in.readInt();
                price = in.readDouble();
                desc = in.readUTF();
                System.out.println(unit+" " + price +" "+ desc);
            }
        }catch(EOFException e){
            e.printStackTrace();
        }
        finally{
            if(in != null)
                in.close();
        }
    }
}

私が読み込もうとしたファイルは、このコードによって作成されました

import java.io.IOException;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;


public class IODataStreams {
    static final  String  dataFile = "invoicedata";
    static final double[] prices = new double[]{19.99, 9.99,15.99,3.99,4.99};
    static final int[] unitCount = new int[]{12,8,13,29,50};
    static final String[] desc = new String[]{
        "Java T Shirt",
        "C# T Shirt",
        "PHP T Shirt",
        "Ruby T Shirt",
        "Go! T Shirt"
    };

    public static void main(String[] args) throws IOException{
        DataOutputStream out = null;
        DataInputStream in = null;  
        try{
            out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("invoicedata")));
            for(int i = 0 ; i < prices.length; i++){
                out.writeUTF(desc[i]);
                out.writeInt(unitCount[i]);
                out.writeDouble(prices[i]);
            }
        }finally{
            if(out != null)
                out.close();
        }

    }

}

今、私の最初のコード(ファイルを読み取るコード)が価格、説明、および単位を印刷していないのはなぜか疑問に思っています。EOFExceptionを返し続けます

エラーは特にこの行にあります

desc = in.readUTF();
4

1 に答える 1

2

次の順序でデータを書き込んでいます。

            out.writeUTF(desc[i]);
            out.writeInt(unitCount[i]);
            out.writeDouble(prices[i]);

しかし、間違った順序でデータを読み取る:

            unit = in.readInt();
            price = in.readDouble();
            desc = in.readUTF();

データは同じ順序で、特にビットで読み書きする必要がありますUTF。これは数値に変換されないためです。

読み取りと書き込みの順序が同じになるようにこれらの行を切り替えると、次のように出力されIOReadDataStreamsます。

12 19.99 Java T Shirt
8 9.99 C# T Shirt
13 15.99 PHP T Shirt
29 3.99 Ruby T Shirt
50 4.99 Go! T Shirt

ファイルのEOFに到達し、(必要に応じて)EOFExceptionをスローする前。

于 2012-08-10T03:34:51.263 に答える