Javaラーニングノート-I/O-DataStream

6725 ワード

Data Streamsはprimitiveデータ型と文字列型のバイトストリームI/Oをサポートし、すべてのData StreamクラスはDataInputとDataqOutputの2つのインタフェースを実現している.この2つのインタフェースを実現するクラスで最もよく使われるのは、DataInputStream、DataOutputStreamである.公式文書の例:
package io.datastream;

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 DataStreams {

    static final String dataFile = "D:\\360  \\javase\\src\\io\\invoicedata";

    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 {
        DataOutputStream out = null;
        try {
            out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
            for (int i = 0; i < prices.length; i++) {
                out.writeDouble(prices[i]);
                out.writeInt(units[i]);
                out.writeUTF(descs[i]);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }

        // ========================= Read the file ============

        DataInputStream in = null;
        double price;
        int unit;
        String desc;
        double total = 0.0;
        try {
            in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
            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 += price * unit;
                }

            } catch (EOFException e) {
                e.printStackTrace();
            }
            System.out.format("Total amount %.2f", total);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            in.close();
        }
    }
}

 このコードは、まず3つの同じ数、異なるprimitiveタイプまたは文字列タイプの配列のデータをinvoicedataファイルに書き込んでから、これらのデータをファイルから読み出します.上記のコードの実行結果は次のとおりです.
 
実行結果1: 
You ordered 12 units of Java T-shirt at $19.99
You ordered 8 units of Java Mug at $9.99
You ordered 13 units of Duke Juggling Dolls at $15.99
You ordered 29 units of Java Pin at $3.99
You ordered 50 units of Java Key Chain at $4.99
java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readLong(DataInputStream.java:416)
at java.io.DataInputStream.readDouble(DataInputStream.java:468)
at io.datastream.DataStreams.main(DataStreams.java:51)
Total amount 892.88
 上記の結果は正常ですが、上記のコードを少し変更すると、
 
 
package io.datastream;

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 DataStreams {

    static final String dataFile = "D:\\360  \\javase\\src\\io\\invoicedata";

    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 {
        DataOutputStream out = null;
        DataInputStream in = null;
        double price;
        int unit;
        String desc;
        double total = 0.0;

        try {
            out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
            for (int i = 0; i < prices.length; i++) {
                out.writeDouble(prices[i]);
                out.writeInt(units[i]);
                out.writeUTF(descs[i]);
            }
            
            // ========================= Read the file =====================
            in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
            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 += price * unit;
                }

            } catch (EOFException e) {
                e.printStackTrace();
            }
            System.out.format("Total amount %.2f", total);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }

    }
}

 
 読み取りファイルのコード移動をファイルコードクリップの後ろに書き込み、同じtry、すなわちoutputstreamが閉じる前に読み取り、その結果:
 
実行結果2 
java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readLong(DataInputStream.java:416)
at java.io.DataInputStream.readDouble(DataInputStream.java:468)
at io.datastream.DataStreams.main(DataStreams.java:42)
Total amount 0.00
 つまり、読み取りファイルのコードは、読み取りたいデータが読み込まれていません.
だから、再出力ストリームが閉じる前にファイルの修正を推測します.入力ストリームは読めませんか?
そうなのか分からない.ご理解のほどよろしくお愿いします.
その後、出力ストリームがファイルに書き込まれた後にflushメソッドを呼び出すと、DataInputStreamはファイルの内容を読み取ることができ、flushメソッドはメモリからファイルにデータストリームをリフレッシュすることです.