InputStreamReader缓冲问题

2024-02-05

不幸的是,我正在从一个具有两种字符编码类型的文件中读取数据。

有一个标题和一个正文。标头始终采用 ASCII 格式,并定义正文编码所用的字符集。

标头不是固定长度,必须通过解析器运行以确定其内容/长度。

该文件也可能非常大,因此我需要避免将整个内容放入内存中。

所以我从一个输入流开始。我最初使用带有 ASCII 的 InputStreamReader 对其进行包装,并对标头进行解码并提取正文的字符集。都好。

然后,我使用正确的字符集创建一个新的 InputStreamReader,将其放在同一个 InputStream 上并开始尝试读取正文。

不幸的是,javadoc 证实了这一点,InputStreamReader 可能会选择预读以提高效率。因此,标题的阅读会影响部分/全部正文。

有人对解决这个问题有什么建议吗?手动创建 CharsetDecoder 并一次输入一个字节会是一个好主意(可能包含在自定义 Reader 实现中?)

提前致谢。

编辑:我的最终解决方案是编写一个没有缓冲的InputStreamReader,以确保我可以解析标头而无需咀嚼正文的一部分。虽然这不是非常有效,但我用 BufferedInputStream 包装原始 InputStream,因此这不会成为问题。

// An InputStreamReader that only consumes as many bytes as is necessary
// It does not do any read-ahead.
public class InputStreamReaderUnbuffered extends Reader
{
    private final CharsetDecoder charsetDecoder;
    private final InputStream inputStream;
    private final ByteBuffer byteBuffer = ByteBuffer.allocate( 1 );

    public InputStreamReaderUnbuffered( InputStream inputStream, Charset charset )
    {
        this.inputStream = inputStream;
        charsetDecoder = charset.newDecoder();
    }

    @Override
    public int read() throws IOException
    {
        boolean middleOfReading = false;

        while ( true )
        {
            int b = inputStream.read();

            if ( b == -1 )
            {
                if ( middleOfReading )
                    throw new IOException( "Unexpected end of stream, byte truncated" );

                return -1;
            }

            byteBuffer.clear();
            byteBuffer.put( (byte)b );
            byteBuffer.flip();

            CharBuffer charBuffer = charsetDecoder.decode( byteBuffer );

            // although this is theoretically possible this would violate the unbuffered nature
            // of this class so we throw an exception
            if ( charBuffer.length() > 1 )
                throw new IOException( "Decoded multiple characters from one byte!" );

            if ( charBuffer.length() == 1 )
                return charBuffer.get();

            middleOfReading = true;
        }
    }

    public int read( char[] cbuf, int off, int len ) throws IOException
    {
        for ( int i = 0; i < len; i++ )
        {
            int ch = read();

            if ( ch == -1 )
                return i == 0 ? -1 : i;

            cbuf[ i ] = (char)ch;
        }

        return len;
    }

    public void close() throws IOException
    {
        inputStream.close();
    }
}

你为什么不使用2InputStream是?一个用于读取标题,另一个用于读取正文。

第二InputStream should skip标头字节。

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

InputStreamReader缓冲问题 的相关文章

  • java本地时间格式不带年份

    我喜欢将本地时间格式格式化为不带年份的字符串 目前我可以显示包含年份的本地格式 java text DateFormat df java text DateFormat getDateInstance java text DateForma
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 使用 google-api-java-client 的 2 足 OAuth

    有谁知道如何将 2 legged OAuth 与 google api java client 一起使用 我正在尝试访问 Google Apps 配置 API 以获取特定域的用户列表 以下不起作用 HttpTransport transpo
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • @Cachable 在没有输入参数的方法上?

    我有问题 org springframework cache annotation Cachable注解 Bean public ConcurrentMapCache cache return new ConcurrentMapCache
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • Android 反向地理编码不适用于华为设备

    我正在尝试通过这段代码反转地理编码纬度 经度 Geocoder geocoder new Geocoder context Locale ENGLISH try List
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 如何找到 Oracle 数据库的 URL?

    如何找到 Oracle 数据库的 URL 和端口 Example jdbc oracle thin host port dbName 用户名 密码 是否有我可以查看的 SQL 命令或日志 配置文件 对于甲骨文来说 有一个tnsnames o
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • Visual Studio Code - Java 类路径不完整。只会报告语法错误

    在使用 python 获得了丰富的经验之后 我正在使用 java 迈出第一步 我正在运行的脚本是一个简单的 Java Swing Gui 它可以从命令行和 VS Code 中正常编译和运行 为了设置 java 调试环境 我使用 github
  • logcat 信息出现在 Android Studio 的“运行”选项卡中

    我的 android studio 运行选项卡很简单 然后它变得更难并给我更多信息 例如 logcat 中的信息 如何禁用或删除第二张图片中出现的更多信息并返回到第一张图片中的第一个外观 我只需要正在运行的 flutter 应用程序的日志输
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • 文档过滤器在 Java 中不起作用?

    在超过 10 个字符的文本字段中 它必须显示错误 为此 我使用了文档过滤器 JTextField field JTextField txtFld AbstractDocument document AbstractDocument fiel
  • 如何从 jenkins 的现有项目生成 .hpi 插件

    我正在尝试使用 jenkins 的性能插件 但最新版本存在一些问题 如链接中所述 https issues jenkins ci org browse JENKINS 27100 https issues jenkins ci org br
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav

随机推荐

  • UnsupportedOperation:无法执行非零相对端搜索:Python - PyPDF2

    你们能解决这个问题吗 我无法阅读阿拉伯语 PDF 文件 我不知道是什么问题 谢谢 import PyPDF2 def main with open arabic text pdf encoding utf 8 as pdfFile pdfR
  • C++ 指向非静态成员函数的指针

    我读过很多关于非静态成员函数指针的帖子和答案 但看起来没有一个能够解决我的问题 因此 我创建了一个简短的示例来复制我的问题 即使这个示例可以以不同的方式 解决 对于最终的软件来说 保持示例中的结构很重要 谢谢 这是 Funcs h 类的标头
  • 在使用 flutter_bloc 库调度事件之前等待一些结果

    我正在尝试创建一个 BLOC 它依赖于另外两个基于时间的块和一个非基于时间的块 我的意思是基于时间 例如他们正在连接远程服务器 因此需要时间 它的工作原理如下 登录 当然需要一些时间 如果登录成功 做另一个过程 这也需要时间 它返回一个未来
  • Elisp:如何将数据保存在文件中?

    我想将数据保存到我的 elisp 程序中的文件中 我有一个多维列表 我想将其保存到文件中 以便下次程序运行时可以恢复它 最简单 最好的方法是什么 当然 我意识到我可以简单地将数据以自定义格式写入缓冲区 然后保存缓冲区 但是当我想要恢复数据格
  • i 标签的 Alt 或 title 属性

    I use 字体真棒 http fortawesome github com Font Awesome 并像这样显示他们的字体 i class icon lock i 这将显示一个漂亮的小锁符号 为了让用户知道这到底意味着什么 我尝试添加标
  • 如何在 AdonisJS 上验证多部分文件?

    我在用Adonis js在最新版本但无法验证 已经尝试过了 request multipart file avatar types jpeg jpg png I already tried gt type image types image
  • 在 Angular 中什么时候应该使用 href 代替 routerLink?

    当我在 Angular 中开发并创建视图时 我总是使用 routerLink 从一个视图导航到另一个视图 最近我看到用 Angular 制作的重要页面使用 href 而不是 routerLink 来路由网站上的视图 我的问题是 什么时候在
  • 使用 shell 脚本在 XML 中搜索字符串或数字时获取父标记

    我有一个结构与此类似的文件
  • scikit-learn 的 TfidfVectorizer 在线版本

    我正在寻找使用 scikit learn 的HashingVectorizer因为它非常适合在线学习问题 文本中的新标记保证映射到 桶 不幸的是 scikit learn 中包含的实现似乎不包括对 tf idf 功能的支持 将矢量化器输出传
  • primefaces keyup 或其他 ajax 事件延迟

    我有类似的东西
  • 在需要/加载软件包后,是否可以覆盖对软件包(重新)安装的阻止?

    实际问题 是否可以在需要 加载包后覆盖对包 重新 安装的阻止 我明白阻止 真实 重新安装 to the same一旦使用了包 从中加载包的库就非常有意义 但我的用例有点不同 背景 我喜欢用 沙箱库 来测试自己的包的想法 除了要测试的包之外
  • 将 graphql 变量传递给 Material UI 组件

    我正在使用 React Typescript 并有一个自动完成材质 UI 组件 我正在尝试将查询建议添加到自动完成组件中 我的 graphql 查询如下所示 查询定义 import gql from graphql tag import u
  • 在java中打印unicode字符

    显示中unicodejava中的字符显示 符号 例如 我尝试打印 它是unicode编号为 U 0905 html 表示为 下面的代码打印 代替unicode特点 char aa u0905 String myString aa resul
  • var 和变量的范围

    如果我有一个像这样的函数
  • 如何为除某些列之外的列名添加前缀?

    这是 ScalaBoy 提出的问题的改编here https stackoverflow com questions 53380310 how to add suffix to column names except some column
  • 如何在 Android 应用程序中使用 facebook 登录?

    如何授权facebook sdk 我在授权后如何获取用户详细信息 如姓名 性别 出生日期 年龄 你必须看看https developers facebook com docs reference api https developers f
  • System.nanoTime() 的精度与准确度

    的文档System nanoTime http docs oracle com javase 6 docs api java lang System html nanoTime 说以下 强调我的 此方法只能用于测量经过的时间 与系统或挂钟时
  • 当第二个键已按下时如何检测按键按下/按下

    在我的应用程序中 我允许用户通过按住右箭头键通过使用ProcessCmdKey 现在我想让用户能够在需要时提高滚动速度 理想情况下 用户应该能够按住右箭头键 那么当他决定提高速度时 他应该在不释放右箭头键 同时按住换档键当他决定恢复正常速度
  • 检查两个字符串是否包含相同的字符,不考虑它们的频率

    我有两个字典对应于两个不同字符串的字符数 我想检查它们是否由相同的字符组成 与字符出现的频率无关 说 我有两个字符串caars and racs它们是由相同的角色组成的a c r s 我知道cmp比较两个字典的方法 它还比较两个键值对 但我
  • InputStreamReader缓冲问题

    不幸的是 我正在从一个具有两种字符编码类型的文件中读取数据 有一个标题和一个正文 标头始终采用 ASCII 格式 并定义正文编码所用的字符集 标头不是固定长度 必须通过解析器运行以确定其内容 长度 该文件也可能非常大 因此我需要避免将整个内