【发布时间】:2015-05-29 19:03:30
【问题描述】:
我想从 .txt 文件(在本例中为 input.txt)读取行并将它们写入另外两个 .txt 文件,具体取决于每行开头的整数是奇数还是偶数。我必须使用 DataInputStream / DataOutputStream 和 BufferedInputStream / BufferedOutputStream。
输入文件如下所示。
1 String1 1.1
2 String2 2.2
3 String3 3.3
4 String4 4.4
5 String5 5.5
6 String6 6.6
7 String7 7.7
8 String8 8.8
9 String9 9.9
10 String10 10.1
当我运行程序时,我在 readUTF 部分收到 EOFException。当我评论这些部分并尝试只写整数时,我在奇数文件中只得到“1”,在偶数文件中只得到“2”。它不会复制所有整数。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.EOFException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
public class datastream {
public static void main(String[] args) throws IOException {
DataInputStream inputStream = null;
DataOutputStream outputStreamEven = null;
DataOutputStream outputStreamOdd = null;
try {
inputStream = new DataInputStream (new BufferedInputStream ( new FileInputStream("src/input.txt")));
outputStreamEven = new DataOutputStream (new BufferedOutputStream ( new FileOutputStream("src/even.txt")));
outputStreamOdd = new DataOutputStream (new BufferedOutputStream ( new FileOutputStream("src/odd.txt")));
int number;
String textinput;
double doublenumber;
number = inputStream.readInt();
textinput = inputStream.readUTF();
doublenumber = inputStream.readDouble();
while ((number = inputStream.read()) % 2 != 0) {
outputStreamOdd.writeInt(number);
outputStreamOdd.writeUTF(textinput);
outputStreamOdd.writeDouble(doublenumber);
}
while ((number = inputStream.read()) % 2 == 0) {
outputStreamEven.writeInt(number);
outputStreamEven.writeUTF(textinput);
outputStreamEven.writeDouble(doublenumber);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStreamEven != null) {
outputStreamEven.close();
}
if (outputStreamOdd != null) {
outputStreamOdd.close();
}
}
}
}
如何将所有行复制到适当的文本文件(以及每行包含其所有内容)?
【问题讨论】:
-
DataInputStream 和 DataOutputStream 并没有像你想象的那样做。
-
正如 immibis 所说,它可能没有达到您的预期。为什么不使用
BufferedReader和BufferedWriter?它们要简单得多。BufferedReader fd = new BufferedReader(new FileReader(filename));,读作fd.readLine(),然后拆分所有这些值。顺便说一句,您应该捕获异常并停止对文件的读/写。 -
EOFException的哪一部分你不明白?你到了文件的末尾:你应该停止阅读它。但是如果它是一个文本文件,你不应该在上面使用readUTF()。readUTF()方法只理解writeUTF()写入的数据。如果是行,你应该使用BufferedReader.readLine().谁说你必须使用DataInput/OutputStream来读取或写入文本文件是错误的。 -
我认为您不需要在
FileInputStream之上添加BufferedInputStream。不应该只使用FileInputStream声明您的DataInputStream吗?比如inputStream = new DataInputStream (new FileInputStream("src/input.txt"));,DataOutputStream也是一样。 -
@BinaryJudy 你几乎总是需要在任何其他
Reader之上添加一个BufferedReader,除了另一个BufferedReader。在这种情况下,OP 需要读取FileReader不支持而BufferedReader支持的行。