我目前有一个工作解析器。它解析文件一次(不是我想让它做的),然后将解析的数据输出到文件中。我需要它继续解析和追加到相同的输出文件,直到输入文件的末尾。看起来像这样。
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){
}
警告:此答案不正确。
与其循环直到抛出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;
}
}
DataInputStream
有很多readXXX()
方法可以抛出EOFException
,但您使用的DataInputStream.read()
方法不抛出EOFException
。
要在使用read()
时正确识别EOF,请实现以下while
循环
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)
}
如果您正在使用FileInputStream
,这里有一个EOF方法,用于具有FileInputStream成员名为fis
的类。
public boolean isEOF()
{
try { return fis.getChannel().position() >= fis.getChannel().size()-1; }
catch (IOException e) { return true; }
}