我在下面的例子中遇到了一个奇怪的问题。在第一次"迭代"一切正常,但在" --------"之后,当我再次尝试写相同的输出时,我再也看不懂了。我很确定我错过了一些东西。 你能帮我吗?
由于 西蒙娜
public class Main {
static final String dataFile = "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 Exception {
double price;
int unit;
String desc;
double total = 0.0;
// OUT
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(
outStream));
o
for (int i = 0; i < prices.length; i++) {
out.writeDouble(prices[i]);
out.writeInt(units[i]);
out.writeUTF(descs[i]);
}
out.flush();
// INPUT
DataInputStream in = new DataInputStream(new BufferedInputStream(
new ByteArrayInputStream(outStream.toByteArray())));
System.out.println("AVAL:" +in.available());
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.out.println("AVAL:" +in.available());
System.out.println("-------------------------");
for (int i = 0; i < prices.length; i++) {
out.writeDouble(prices[i]);
out.writeInt(units[i]);
out.writeUTF(descs[i]);
}
out.flush();
System.out.println("AVAL:" +in.available());
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) {
}
}
}
答案 0 :(得分:2)
您正在尝试从已经达到EOF的InputStream中读取数据。
InputStream是由一个包含5个产品的字节数组构成的,然后你从这个InputStream中读取所有东西,然后你开始将产品重写到OutputStream,但是根本不修改字节数组,它仍然包含它最初创建时包含的内容,以及您在第一次迭代时完全读取的内容。
此外,您应该在代码中使用对象:您应该拥有5个产品的单个数组,而不是3个元素的数组(价格,单位和descs),每个产品都是具有价格的对象,描述和一个单位。 Java是一种OO语言。使用对象。
答案 1 :(得分:1)
您可以在此行创建InputStream:
// INPUT
DataInputStream in = new DataInputStream(new BufferedInputStream(
new ByteArrayInputStream(outStream.toByteArray())));
在此之后写入outStream
的任何内容都不会影响您之后可以从in
读取的内容,因为您使用字节数组的内容创建了DataInputStream
那一刻。因此,您可以在第一个for
循环中阅读您所写的内容,但之后您处于EOF状态,因为第二个for
循环对您的DataInputStream
无效。
答案 2 :(得分:-1)
我自己也遇到过;如果我是对的,这个问题;在我的情况下,当使用DataOutputStream
与Java网络时。
您的问题可能出在DataOutputStream上,当它没有重置时会存储它首先发送的信息,并且总是发送相同的数据,所以我要添加:out.reset();
其次,你不是多次发送数据而你的输出不是无限循环,所以;反过来,它到达问题的最后(EOF
)并停止通过OutputStream发送数据。
尝试添加:
//OUTPUT
while(true) {
//For Loop Which Sends Data
try {
Thread.sleep(10); //The Sleep Is Not Necessary, However It's Recommendable Because
}catch(InterruptedException e) {} // of the Lessening of CPU Usage!
}