我目前有一个有效的解析器。它解析一次文件(不是我想要它做的),然后将解析后的数据输出到文件中。我需要它来保持解析并附加到相同的输出文件,直到输入文件的末尾。看起来像这样。
try {
// my code parsing the data and appending to eof of output. (works)
}
catch (EOFException eof){
}
除了while循环外,一切都已完成。它只在我需要时解析一次才能继续解析。我正在寻找一个while循环函数来达到eof。
我也在使用DataInputStream。是否有某种DataInputStream.hasNext函数?
DataInputStream dis = new DataInputStream(new FileInputStream(inFile));
i.e. dis.read();
//Need a while !eof while loop
try {
// my code parsing the data and appending to eof of output. (works)
}
catch (EOFException eof){
}
答案 0 :(得分:7)
除了在抛出EOFException之前循环,您可以采用更清晰的方法,并使用available()
。
DataInputStream dis = new DataInputStream(new FileInputStream(inFile));
while (dis.available() > 0) {
// read and use data
}
或者,如果您选择采用EOF方法,则需要在捕获的异常时设置一个布尔值,并在循环中使用该布尔值,但我不推荐它:
DataInputStream dis = new DataInputStream(new FileInputStream(inFile));
boolean eof = false;
while (!eof) {
try {
// read and use data
} catch (EOFException e) {
eof = true;
}
}
答案 1 :(得分:3)
DataInputStream
有很多readXXX()
方法会抛出EOFException
,但您使用的方法DataInputStream.read()
不会 抛出EOFException
。
使用read()
实现while
循环时,要正确识别EOF,如下所示
int read = 0;
byte[] b = new byte[1024];
while ((read = dis.read(b)) != -1) { // returns numOfBytesRead or -1 at EOF
// parse, or write to output stream as
dos.write(b, 0, read); // (byte[], offset, numOfBytesToWrite)
}
答案 2 :(得分:0)
如果您使用FileInputStream
,则此处为具有名为fis
的FileInputStream成员的类的EOF方法。
public boolean isEOF()
{
try { return fis.getChannel().position() >= fis.getChannel().size()-1; }
catch (IOException e) { return true; }
}