我有一个synchronize方法,在这个方法中我使用了datainputstream.readfully() .Its抛出了"EOF异常“。为什么reallyfully方法抛出EOF,而它还在synchronize方法中?下面是供参考的代码
private static synchronized String getTransactionId() {
try {
String txnId_fname = SiteConfiguration.getInstance().getProperty("TRANSACTION.INFO_FILE", //
LaneProcessor.DEFAULT_TRANSACTION_ID_FILE_NAME);
File tmpFile = new File(txnId_fname);
if (!tmpFile.exists()) {
tmpFile.createNewFile();
}
else {
long sz = tmpFile.length();
if ( 12 == sz ) {
// read the transaction id from the file, the ID must be 12 bytes long to be valid.
DataInputStream dis = new DataInputStream(new FileInputStream(tmpFile));
byte[] datainBytes = new byte[dis.available()];
dis.readFully(datainBytes);
transactionIdLog = new String(datainBytes, 0, datainBytes.length);
if ( Stringer.isNumeric(transactionIdLog))
{
transactionId = Long.valueOf(transactionIdLog);
}
dis.close();
//log.debug("transaction id from the existing file"+transactionId);
}
}
transactionId = ConvertUtils.incrementLong(transactionId);
transactionIdLog = Long.toString(transactionId);
transactionIdLog = Stringer.zpad(transactionIdLog, 12);
_out = new FileOutputStream(tmpFile);
_out.write(transactionIdLog.getBytes());
_out.flush();
_out.close();
}
catch (Exception e) {
log.error("Error in transaction id generation" + e.getMessage(), e);
}
return transactionIdLog;
}发布于 2013-12-03 01:20:54
available的约定是,它返回可用字节数的估计值;如果您尝试读取这么多字节,程序不会阻塞,但它读取的字节数可能比可用字节少。如果available的结果太高,那么readFully可能会得到一个EOF异常。不幸的是,我试图查看FileInputStream.available的源代码,看看它是如何工作的,但它是原生的,所以我不知道它是否会返回一个“太大”的值。我所能说的就是,基于javadoc,我不认为你的代码能正常工作。
要查看这是否真的是问题所在,我建议在创建数组后让程序输出datainBytes.length,然后对照实际文件大小进行检查。
发布于 2013-12-03 01:22:01
同步方法会抛出EOF异常吗?
字面意思不是。方法中的任何异常都将被捕获并记录下来。所以它不会传播EOFException。更重要的是,没有throw new EOFException(...)。
但是你的方法能捕获EOFException并记录它吗?我想答案是肯定的!
如果readFully方法不能填满缓冲区,并且您已经将缓冲区大小设置为available()所说的可读字节数,则它将抛出EOFException。但是考虑一下这个场景:
你的应用程序执行到returns.
available() file.readFully ...只发现有零字节要执行read.这说明了isAvailable()的结果只是一个提示。你不能完全依赖它。
但是,我认为在技术上不可能以EOFException不会发生的方式来编写该方法。如果没有某种文件锁定,你肯定无法做到这一点……以防止其他应用程序在您的应用程序读取文件时将其截断。
https://stackoverflow.com/questions/20332765
复制相似问题