首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >synchronize方法会抛出EOF异常吗?

synchronize方法会抛出EOF异常吗?
EN

Stack Overflow用户
提问于 2013-12-03 00:15:55
回答 2查看 112关注 0票数 0

我有一个synchronize方法,在这个方法中我使用了datainputstream.readfully() .Its抛出了"EOF异常“。为什么reallyfully方法抛出EOF,而它还在synchronize方法中?下面是供参考的代码

代码语言:javascript
复制
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;
    }
EN

回答 2

Stack Overflow用户

发布于 2013-12-03 01:20:54

available的约定是,它返回可用字节数的估计值;如果您尝试读取这么多字节,程序不会阻塞,但它读取的字节数可能比可用字节少。如果available的结果太高,那么readFully可能会得到一个EOF异常。不幸的是,我试图查看FileInputStream.available的源代码,看看它是如何工作的,但它是原生的,所以我不知道它是否会返回一个“太大”的值。我所能说的就是,基于javadoc,我不认为你的代码能正常工作。

要查看这是否真的是问题所在,我建议在创建数组后让程序输出datainBytes.length,然后对照实际文件大小进行检查。

票数 1
EN

Stack Overflow用户

发布于 2013-12-03 01:22:01

同步方法会抛出EOF异常吗?

字面意思不是。方法中的任何异常都将被捕获并记录下来。所以它不会传播EOFException。更重要的是,没有throw new EOFException(...)

但是你的方法能捕获EOFException并记录它吗?我想答案是肯定的!

如果readFully方法不能填满缓冲区,并且您已经将缓冲区大小设置为available()所说的可读字节数,则它将抛出EOFException。但是考虑一下这个场景:

你的应用程序执行到returns.

  • Your应用程序暂停的地步(例如,由OS scheduler).

  • Some
  1. available() file.
  2. 你的应用程序被恢复,并调用readFully ...只发现有零字节要执行read.
  3. EOFException ...

这说明了isAvailable()的结果只是一个提示。你不能完全依赖它。

但是,我认为在技术上不可能以EOFException不会发生的方式来编写该方法。如果没有某种文件锁定,你肯定无法做到这一点……以防止其他应用程序在您的应用程序读取文件时将其截断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20332765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档