4

私は Oracle のドキュメントとレッスンから Java を学んでおり、この部分 (ファイル I/O、ストリームなど) にたどり着きましたが、動作しないコードがいくつかあり、その理由がわかりません。エラーや警告は表示されません。何もDataOutputStreamファイルに書き込まれません。

を削除してみましたがBufferedOutputStream、そのように機能するので、問題はバッファリングされたストリームにあると推測していますが、理由はわかりません。

おそらく何かが欠けています。私は本当に立ち往生しています。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Principal {

    static final String dataFile = "invoicedata.txt";

    static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
    static final int[] units = { 12, 8, 13, 29, 50 };
    static final String[] descs = {
        "Java T-shirt",
        "Java Mug",
        "Duke Juggling Dolls",
        "Java Pin",
        "Java Key Chain"
    };

    public static void main(String[] args) throws IOException {     
        //DECLARATION
        DataOutputStream out = null;
        DataInputStream in = null;

        try {
            out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
            in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));

            //WRITING???
            for (int i = 0; i < prices.length; i ++) {
                out.writeDouble(prices[i]);
                out.writeInt(units[i]);
                out.writeUTF(descs[i]);
            }

        } catch (Exception e) {
            System.err.println("ERROR!");
            e.printStackTrace();
        }

        double price;
        int unit;
        String desc;
        double total = 0.0;

        //READING
        try {
            while (true) {
                price = in.readDouble();
                unit = in.readInt();
                desc = in.readUTF();
                System.out.format("You ordered %d" + " units of %s at $%.2f%n",
                    unit, desc, price);
                total += unit * price;
            }
        } catch (EOFException e) {
            System.err.println("END OF FILE!");
        }       
    }   
}
4

6 に答える 6

1

あなたはあなたのを呼び出すのを忘れてclose()いますout

    try {
        out = new DataOutputStream(new FileOutputStream(dataFile));
        in = new DataInputStream(new FileInputStream(dataFile));

        //WRITING???
        for (int i = 0; i < prices.length; i ++) {
            out.writeDouble(prices[i]);
            out.writeInt(units[i]);
            out.writeUTF(descs[i]);
        }
        out.close();
    } catch (Exception e) {
        System.err.println("ERROR!");
        e.printStackTrace();
    }

また、を閉じる必要がありますin

于 2013-01-09T13:48:52.290 に答える
1

ファイルをclose()しないと、ファイルの終わりが切り捨てられる可能性があります。ファイルが十分に小さい場合、これはファイルが空になることを意味する可能性があります。

配列の代わりにカスタムオブジェクトを使用する場合、コードは次のようになります。

public static void main(String... ignored) throws IOException {
    List<Inventory> inventories = new ArrayList<>();
    inventories.add(new Inventory("Java T-shirt", 19.99, 12));
    inventories.add(new Inventory("Java Mug", 9.99, 8));

    String dataFile = "invoice-data.dat";
    DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
    out.writeInt(inventories.size());
    for (Inventory inventory : inventories)
        inventory.write(out);
    out.close();

    DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
    int count = in.readInt();
    for (int i = 0; i < count; i++) {
        System.out.println(new Inventory(in));
    }
    in.close();
}

static class Inventory {
    final String name;
    final double price;
    int units;

    Inventory(String name, double price, int units) {
        this.name = name;
        this.price = price;
        this.units = units;
    }

    Inventory(DataInput in) throws IOException {
        this.name = in.readUTF();
        this.price = in.readDouble();
        this.units = in.readInt();
    }

    public void write(DataOutput out) throws IOException {
        out.writeUTF(name);
        out.writeDouble(price);
        out.writeInt(units);
    }

    @Override
    public String toString() {
        return "name='" + name + '\'' +
                ", price=" + price +
                ", units=" + units;
    }
}

プリント

name='Java T-shirt', price=19.99, units=12
name='Java Mug', price=9.99, units=8
于 2013-01-09T13:49:11.930 に答える
1

すべてのものがファイルに書き込まれた後に DataOutputStream を閉じるには、コードに out.close() を追加する必要があります。

于 2013-01-09T13:54:31.907 に答える
0

これを執筆部分の最後に追加します。

    out.close();

そして、これは読書部分の終わりまでです。

    in.close();
于 2013-01-09T13:49:07.630 に答える
0

プロセスが終了すると、管理されていないリソースが解放されます。InputStreamsの場合、これは問題ありません。OutputStreamsの場合、バッファリングされたデータが失われる可能性があるため、

flush()またはclose()

プログラムを終了する前のストリーム。

于 2013-01-09T13:49:44.897 に答える
0

閉じたストリームへの書き込み/読み取りが必要になることもあります。Java はまったく通知しません。エラーもメッセージも何もありません。そのため、開いているストリームに対して書き込み/読み取りを行っていることを確認してください。

于 2016-04-30T16:39:10.400 に答える