0

`私は Java を初めて使用し、以下のコードで StreamCorruptedException を取得しています... このコードでは、ObjectInputStream を使用してファイルから複数のオブジェクトを読み込もうとしています... m StreamCorruptedException を処理できません... o/p I m取得中のファイル C098.txt は既に存在します 製品 ID:- P001 説明:- 本の価格:- Rs.200 スレッド "main" での例外 java.io.StreamCorruptedException: 無効な型コード: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream .java:1374) で java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) で Utility.getProducts(Utility.java:57) で Utility.main(Utility.java:23) で

CODE:
import java.io.*;
import java.util.*;
class Product implements Serializable{
    private static final long serialVersionUID = 1L;
    String productId;
    String desc;
    String price;
    public Product(String PId,String a_des,String a_price){
        productId=PId;
        desc=a_des;
        price=a_price;
    }
    public String toString(){
        return "Product ID:- "+productId+"\nDescription:- "+desc+"\nPrice:- "+price;
    }
}
class Utility{
    // Product objProduct;
    public static void main(String args[]) throws Exception{
        String cartId = "C098.txt";
        Product objProduct = new Product("P001","Book","Rs.200");
        addProductToCart(cartId,objProduct);
        getProducts(cartId);
        objProduct = new Product("P087","Laptop","Rs.45,500");
        addProductToCart("C098.txt",objProduct);
        getProducts(cartId);
    }
    public static void addProductToCart(String CId,Product p) throws Exception{
        try{
        boolean searchFile;
        File objFile = new File(CId);
        searchFile = objFile.exists();
        if(searchFile)
            System.out.println("File "+CId+" already exists");
        else{
            objFile.createNewFile();
            System.out.println("File "+CId+" did not exist. It is now created");
        }
        FileOutputStream objFOS = new FileOutputStream(objFile,true);
        ObjectOutputStream objO = new ObjectOutputStream(objFOS);
        objO.writeObject(p);
        objO.flush();
        objO.close();
        }catch(Exception e)
        {
            System.out.println("Exception Caught");
        }
    }
    public static void getProducts(String CId) throws Exception{

        Product objProduct1 = new Product("","","");
        File objFile1 = new File(CId);
        FileInputStream objFIS = new FileInputStream(objFile1);
        ObjectInputStream objI = new ObjectInputStream(objFIS);
        Object obj = null;
        try{
            while((obj=objI.readObject()) != null){
                if (obj instanceof Product) {
                    System.out.println(((Product)obj).toString());
                }
            }
        }catch (EOFException ex) { //This exception will be caught when EOF is reached
            System.out.println("End of file reached.");
        }finally {
            //Close the ObjectInputStream
            try{
                if (objI != null)
                    objI.close();
            }catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}`  
4

2 に答える 2

0

問題はヘッダーの問題が原因です。同じファイルに追加していて、2番目のオブジェクトを返すときに、ヘッダーの問題が原因で例外がスローされます。別のファイルにオブジェクトを書き込もうとすると、問題を取り除くことができます。

SCEオブジェクトストリームから読み取られた制御情報が内部整合性チェックに違反した場合にスローされます。試す

    java.io.*をインポートします。
    importjava.util。*;
    クラスProductはSerializable{を実装します
        private static final long serialVersionUID = 1L;
        文字列productId;
        文字列の説明;
        ストリング価格;
        public Product(String PId、String a_des、String a_price){
            productId = PId;
            desc = a_des;
            price = a_price;
        }
        public String toString(){
            return "Product ID:-" + productId + "\ n説明:-" + desc + "\ n価格:-" + price;
        }
     //製品objProduct;
        public static void main(String args [])は例外をスローします{
            文字列cartId="C0982.txt";
            Product objProduct = new Product( "P001"、 "Book"、 "Rs.200");
            addProductToCart(cartId、objProduct);
            getProducts(cartId);
            Product objProduct1 = new Product( "P087"、 "Laptop"、 "Rs.45,500");
            addProductToCart( "C0981.txt"、objProduct1);
            getProducts( "C0981.txt");
        }
        public static void addProductToCart(String CId、Product p)は例外をスローします{
            試す{
            ブール検索ファイル;
            ファイルobjFile=new File(CId);
            searchFile = objFile.exists();
            if(searchFile)
                System.out.println("ファイル"+ CId + "は既に存在します");
            そうしないと{
                objFile.createNewFile();
                System.out.println("ファイル"+ CId + "は存在しませんでした。現在作成されています");
            }
            FileOutputStream objFOS = new FileOutputStream(objFile、true);
            ObjectOutputStream objO = new ObjectOutputStream(objFOS);

objO.writeObject(p); objO.flush(); objO.close(); }catch(Exception e) { System.out.println("Exception Caught"); } } public static void getProducts(String CId) throws Exception{ Product objProduct1 = new Product("","",""); File objFile1 = new File(CId); FileInputStream objFIS = new FileInputStream(objFile1); ObjectInputStream objI = new ObjectInputStream(objFIS); Object obj = null; try{ while((obj=objI.readObject()) != null){ if (obj instanceof Product) { System.out.println(((Product)obj).toString()); } } }catch (EOFException ex) { //This exception will be caught when EOF is reached System.out.println("End of file reached."); }finally { //Close the ObjectInputStream try{ if (objI != null) objI.close(); }catch (IOException ex) { ex.printStackTrace(); } } } } </pre>
于 2013-01-18T12:31:57.607 に答える
0

あなたはそれを「扱う」ことはできません。あなたはそれを防ぐ必要があります。ObjectOutputStreamsこれは、ファイルに追加してここで行っているように、1 つの によって読み取られるストリームで2 つを使用ObjectInputStreamしたり、オブジェクト以外のデータを書き込み、対称的に読み取らないなどの設計エラーが原因です。

于 2013-01-18T23:57:57.673 に答える