给定一个 Java InputStream,我如何确定流中的当前偏移量?

2023-12-30

我想要一些通用的、可重复使用的东西getPosition()方法将告诉我从流的起点读取的字节数。理想情况下,我希望它能够与所有输入流一起使用,这样当我从不同的来源获取它们时,我就不必包装它们中的每一个。

这样的野兽存在吗?如果没有,任何人都可以推荐现有的计数实现吗InputStream?


您需要遵循中建立的装饰器模式java.io来实施这一点。

让我们在这里尝试一下:

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

public final class PositionInputStream
  extends FilterInputStream
{

  private long pos = 0;

  private long mark = 0;

  public PositionInputStream(InputStream in)
  {
    super(in);
  }

  /**
   * <p>Get the stream position.</p>
   *
   * <p>Eventually, the position will roll over to a negative number.
   * Reading 1 Tb per second, this would occur after approximately three 
   * months. Applications should account for this possibility in their 
   * design.</p>
   *
   * @return the current stream position.
   */
  public synchronized long getPosition()
  {
    return pos;
  }

  @Override
  public synchronized int read()
    throws IOException
  {
    int b = super.read();
    if (b >= 0)
      pos += 1;
    return b;
  }

  @Override
  public synchronized int read(byte[] b, int off, int len)
    throws IOException
  {
    int n = super.read(b, off, len);
    if (n > 0)
      pos += n;
    return n;
  }

  @Override
  public synchronized long skip(long skip)
    throws IOException
  {
    long n = super.skip(skip);
    if (n > 0)
      pos += n;
    return n;
  }

  @Override
  public synchronized void mark(int readlimit)
  {
    super.mark(readlimit);
    mark = pos;
  }

  @Override
  public synchronized void reset()
    throws IOException
  {
    /* A call to reset can still succeed if mark is not supported, but the 
     * resulting stream position is undefined, so it's not allowed here. */
    if (!markSupported())
      throw new IOException("Mark not supported.");
    super.reset();
    pos = mark;
  }

}

输入流的目的是线程安全的,因此可以充分使用同步。我玩过volatile and AtomicLong位置变量,但同步可能是最好的,因为它允许一个线程在流上操作并查询其位置而不放弃锁定。

PositionInputStream is = …
synchronized (is) {
  is.read(buf);
  pos = is.getPosition();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个 Java InputStream,我如何确定流中的当前偏移量? 的相关文章

  • Java中的内部类

    我正在学习 Java 中阅读关于内部类的内容 我找到了这段代码 class Animal class Brain 编译后 javap Animal Brain 给出输出为 Compiled from Animal java class An
  • Java 使用 Mockito 验证 void 方法调用 n 次

    我正在尝试验证是否在 DAO 内部调用了 void 方法 我正在使用一个提交点 该提交点发送截至该点的结果列表 重置列表并继续 假设我的列表中有 4 件事 并且提交点为 1 我希望 发送 方法被调用 4 次 我可以通过编写来验证该方法是否被
  • 如何使用java水平滚动窗口内的滚动条

    我的问题是水平滚动窗口内的滚动条 我使用了这段代码 但它滚动窗口水平栏 而不是该窗口内的滚动条 WebElement scroll driver findElement By xpath div id gvLocationHorizonta
  • 如果列名不同,则一对多休眠连接

    我有三个具有以下结构的表 合同 gt Contract id 主要 customer company id Vendor company id 公司 gt Company id 主要 创建日期 创建者 Company Timeline gt
  • 如何在 Java 中访问嵌套的 HashMap?

    我有一个 Java 中的 HashMap 其中的内容 你们可能都知道 可以通过以下方式访问 HashMap get keyname 如果一个 HashMap 位于另一个 HashMap 中 即嵌套的 HashMap 我将如何访问内容 我可以
  • 如何在log4j的配置文件中为文件附加器提供环境变量路径

    我有一个log4j xml配置文件 和一个RollingFileAppender我需要提供用于存储日志的文件路径 问题是我的代码将作为可运行的 jar 部署在 Unix 机器上 所以如果我传递这样的参数 value logs message
  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • 配置jmxremote时无法正常停止tomcat

    我添加了一个jmxremotecatalina bat中的配置 set JAVA OPTS Dcom sun management jmxremote port 9004 Dcom sun management jmxremote ssl
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Java和手动执行finalize

    如果我打电话finalize 在我的程序代码中的一个对象上 JVM当垃圾收集器处理这个对象时仍然再次运行该方法吗 这是一个大概的例子 MyObject m new MyObject m finalize m null System gc 是
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple

随机推荐

  • Backbone 和 Rails 关联:避免 JSON HashWithIn DifferentAccess 错误

    我正在尝试让我的骨干关联在 Rails 应用程序中工作 并且在尝试更新现有模型时遇到困难 具体来说 Rails 会抛出以下错误 于 2012 01 04 02 36 14 1000 开始对 127 0 0 1 放置 posts 2 由 Po
  • 将布尔字符串写入二进制文件?

    我有一串布尔值 我想使用这些布尔值作为位来创建一个二进制文件 这就是我正在做的 first append the string with 0s to make its length a multiple of 8 while len boo
  • Jquery inputmask 大小写大小写

    我在用着jquery 输入掩码 http robinherbots github io Inputmask 如何在不使用掩码的情况下对任何输入文本使用以下代码 输入的任何字母都将强制为大写 Inputmask extendAliases u
  • 如何在Spring每次测试之前重新创建数据库?

    我的 Spring Boot Mvc Web 应用程序具有以下数据库配置application properties file spring datasource url jdbc h2 tcp localhost pdk spring d
  • 激活密钥保存在哪里

    我正在使用 C 并且有一个用户输入的密钥来激活我的程序 我不希望用户在输入密钥后能够看到密钥 您对如何 在哪里存储它有什么建议吗 您可以将密钥保存为单独的文件 加密密钥并保存 因此 即使用户试图篡改它 您也可以停用该应用程序 您可能对 co
  • 使用面向对象编程进行 OpenGE 的优点和缺点

    我了解使用面向对象编程作为概念的优点和缺点 我正在寻找的是专门使用 oo in Progress openedge 的优点和缺点 我需要考虑哪些挑战吗 该语言的某些部分是否与 oo 不能很好地配合 像这样的东西 编辑 使用10 2b 我会给
  • jQuery 数据选择器中正则表达式的性能:依赖于特定的字符串长度

    设置 我有一个div和一堆radio按钮 每个按钮都与一个自定义属性和值相关联 element data attr name attr value 当底层数据结构发生更改时 我会迭代字段并设置适当的按钮checked true通过使用 da
  • 为什么更新变量的哈希集会更新该变量?

    我可以将哈希集更新为另一个变量 如下所示 d a b c a b qwerty d gt b gt qwerty What is this magic d b blah a gt b gt blah And this magic 为什么使用
  • perf stat 输出的解释

    我开发了一个代码 可以输入大的二维图像 高达 64MPixels 并且 对每一行应用过滤器 转置图像 使用阻塞以避免大量缓存未命中 对图像的列 当前行 应用过滤器 将过滤后的图像转回以进行其他计算 虽然它没有改变任何东西 但为了我的问题的完
  • 带有 PowerShell 的 Rapidshare API

    FreeUploadServer Invoke RestMethod Uri http api rapidshare com cgi bin rsapi cgi sub nextuploadserver Invoke RestMethod
  • 如何将 R 数据帧写入 Google Cloud Storage 存储桶文件夹

    我想将 R 数据帧写入 Google Cloud Storage 存储桶 我在用googleCloudStorageRR 中的库 这是我的代码 START options googleAuthR scopes selected https
  • Cassandra的索引结构是怎样的

    Cassandra使用LSM树进行存储 那么cassandra的索引结构到底是怎样的呢 例如 Mongo 和 Couchbase 都使用 BTree 这取决于您实际使用的 Cassandra 版本 对于 3 4 之前的版本 索引被实现为隐藏
  • MYSQL 逗号分隔列表,可以添加和删除值吗?

    我有一个逗号分隔的列表 我将其存储在 mysql 表的 varchar 字段中 是否可以直接使用 sql 查询在列表中添加和删除值 或者我必须从表中取出数据 在 PHP 中操作并将其替换回 mysql 中 mysql中的InnoDB和MyI
  • 将 python-igraph 图转换为 networkx

    最近我一直在使用 python igraph 包 我的所有代码都基于我使用 igraph 创建的图表 现在 我需要为我的图计算一些度量 这些度量显然是在 networkx 中实现的 而不是在 igraph 中实现的 例如 katz cent
  • 为什么android HttpURLConnection缓存输入流结果?

    我正在尝试获取 xml 文件 但它似乎已被缓存 这是我的代码 URL url new URL http delibere asl3 liguria it SVILUPPO elenco xml asp rand new Random nex
  • 创建“Copyable”类型接口而不是使用“Cloneable”是否有意义?

    我有一些代码需要发送对象的副本 此要求是因为调用的服务 运行时库 会修改发送的对象 该对象还需要公开设置器 以防doThing下面的方法需要设置任何字段ImportantObj班级 此实现正在等待更改 但没有合理预期会在不久的将来发生更改
  • SQL - 使用 CASE 语句更新,我需要多次重复相同的 CASE 吗?

    我的 UPDATE 语句大致如下 UPDATE customer SET forenames ot forenames surname CASE WHEN ot safeplace IS NULL THEN test SAFEPLACE I
  • Spring Data JPA“无法找到 List [重复]

    这个问题在这里已经有答案了 很难弄清楚我是否遇到了错误或做了一些愚蠢的事情 Spring Boot v2 0 0 M7 spring data jpa spring data rest MySQL 以下 Query Query select
  • 如何退出 Google+ 帐户?

    在 Android 应用程序上注册 Google plus 后 我如何注销 以便可以使用另一个帐户登录 不知道是否GoogleAuthUtil invalidateToken是不是答案 Thanks 如果您正在使用Google 登录 htt
  • 给定一个 Java InputStream,我如何确定流中的当前偏移量?

    我想要一些通用的 可重复使用的东西getPosition 方法将告诉我从流的起点读取的字节数 理想情况下 我希望它能够与所有输入流一起使用 这样当我从不同的来源获取它们时 我就不必包装它们中的每一个 这样的野兽存在吗 如果没有 任何人都可以