Javaラーニングノート-I/O-DataStream
6725 ワード
Data Streamsはprimitiveデータ型と文字列型のバイトストリームI/Oをサポートし、すべてのData StreamクラスはDataInputとDataqOutputの2つのインタフェースを実現している.この2つのインタフェースを実現するクラスで最もよく使われるのは、DataInputStream、DataOutputStreamである.公式文書の例:
このコードは、まず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
上記の結果は正常ですが、上記のコードを少し変更すると、
読み取りファイルのコード移動をファイルコードクリップの後ろに書き込み、同じ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メソッドはメモリからファイルにデータストリームをリフレッシュすることです.
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メソッドはメモリからファイルにデータストリームをリフレッシュすることです.