Java - Reader 流内的动态字符串替换

2023-11-30

我在磁盘上有一个(文本)文件,我需要将其读入带有 Reader 对象的库中。

在阅读此文件时,我想对数据执行正则表达式字符串替换。

我当前的解决方案是将整个文件作为一个字符串读入内存,进行字符串替换,然后为此字符串创建一个 StringReader 并将其作为 Reader 返回到库中。

这是可行的,但是对于大文件(尤其是在多个线程中运行),性能是一个问题。

我想做的是让它一次从文件中读取每一行,替换这个子字符串,然后默默地返回给 Reader 的使用者 - 但我不知道如何做到这一点。

有更好的方法来完成这个任务吗?

我正在使用 Java 7

我当前解决方案的一个示例如下 - 从“文件”读取,将所有“a”替换为“b”,然后将 Stream 传递给消费者。

public void loadFile(final File file) throws Exception
{
    final Pattern regexPattern = Pattern.compile("a");
    final String replacementString = "b";

    try (BufferedReader cleanedBufferedReader = new BufferedReader(new StringReader(replaceInBufferedReader(new BufferedReader(new FileReader(file)),
            regexPattern, replacementString))))
    {
        new StreamSource(cleanedBufferedReader).doSomething();
    }
}

private static String replaceInBufferedReader(final BufferedReader reader, final Pattern pattern, final String replacement) throws IOException
{
    final StringBuilder builder = new StringBuilder();
    String str;

    while ((str = reader.readLine()) != null)
    {
        builder.append(str).append(System.lineSeparator());
    }

    return pattern.matcher(builder.toString()).replaceAll(replacement);
}

您只想继承 BufferedReader 的子类。

class MyBufferedReader extends BufferedReader {

    MyBufferedReader(Reader r) {
        super(r);
    }

    @Override
    String readLine() {
        String line = super.readLine();
        // perform replacement here
        return line;
    }

}

像往常一样打开文件,但不要将其包装在 BufferedReader 中,而是将其包装在子类中。

try ( Reader r = ...;
          BufferedReader br = new MyBufferedReader(r)) {
     String line;
     while ((line = br.readLine()) != null) {
         // use returned line
     }
}

Update

下面是一个Reader这将允许您对输入流进行逐行替换,同时仍然呈现Reader流用户的接口。

在内部,原始流被包装在BufferedReader,并一次读取一行。可以对已读取的行执行任何所需的转换。然后将变换后的线变成StringReader。当流的用户调用任何一个read(...)操作时,请求被定向到缓冲的StringReader为了满足。如果StringReader字符用完,下一行BufferedReader被加载并转换,继续为read(...).

abstract public class TranslatingReader extends Reader {

    private BufferedReader input;
    private StringReader output;

    public TranslatingReader(Reader in) {
        input = new BufferedReader(in);
        output = new StringReader("");
    }

    abstract public String translate(String line);

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int read = 0;

        while (len > 0) {
            int nchars = output.read(cbuf, off, len);
            if (nchars == -1) {
                String line = input.readLine();
                if (line == null) {
                    break;
                }

                line = tranlate(line);

                line += "\n"; // Add the newline which was removed by readLine()
                output = new StringReader(line);
            } else {
                read += nchars;
                off += nchars;
                len -= nchars;
            }
        }

        if (read == 0)
            read = -1;

        return read;
    }

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

Java - Reader 流内的动态字符串替换 的相关文章

  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 将可可粒放入可可中

    如何将笔尖加载到另一个窗口内 我尝试了 initWithWindowName if mmController NULL mmController mainMenu alloc initWithWindowNibName mainMenu m
  • 在 CasperJS 的表单之外使用选择

    我想选择一个条目进入选择 我如何使用 CasperJS 做到这一点 您需要了解的一些信息 我无法修改页面 我的任务只是编写测试 选择标记不包含在表单中 我无法使用document querySelector MY SELECT select
  • Angular 2 节点波本错误

    ERROR in node modules css loader sourceMap false importLoaders 1 node modules postcss loader lib ident postcss sourceMap
  • 去掉标签,但保留第一个

    例如我怎样才能保留第一个img标记但剥离所有其他的 来自 HTML 字符串 example p some text img src aimage jpg alt desc width 320 height 200 img src aimag
  • iPhone 上的 Lua

    我正在尝试在 iPhone 上运行时加载 Lua 脚本 有可能这样做吗 我该如何开始使用 Lua 我找不到东西 我唯一能找到的是这应该是可能的 但我想知道如何实现 查看科罗娜SDK
  • 熊猫留在原地

    我有一个大数据框df和一个小数据框df right有 2 列a and b 我想做一个简单的左连接 查找a无需复制df 我想出了这段代码 但我不确定它有多强大 dtmp pd merge df a df right on a how lef
  • SKSpriteNode 框架偏离

    我正在尝试从 UIBezierPath 创建一个开放圆 并将其转换为 SKShapeNode 稍后将其转换为 SKSpriteNode 我遇到了一个问题 我不知道如何缩小精灵 而它的线宽没有缩小 您可以在这里查看解决方案 调整精灵大小而不缩
  • C#,Gmap.net:使用 Gmap.net 库在谷歌地图上绘制 5 个标记时生成异常

    我正在使用 Gmap net 库在谷歌地图上的三角测量算法进行计算后在特定的时间绘制标记 当我为两个标记工作时 它工作正常 但当我尝试绘制 5 个标记时 它向我显示异常 System InvalidOperationException 类型
  • Python使用key和lambda进行排序,lambda有什么作用?

    所以我有一个值列表 如下所示 values date 2015 04 15T11 15 34 val 30 val 90 date 2015 04 19T11 15 34 val 25 date 2015 04 16T11 15 34 我用
  • Pandas 循环访问数据帧列表和更改索引

    这是一个基本问题 但我想循环遍历数据帧列表 并对于每个数据帧 将索引设置为数据帧中的列之一 下面代码的问题是它没有使用新索引保存数据框 如何格式化此 For 循环 以便数据帧在 for 循环之外永久更改 谢谢 dflist df 1 df
  • Xamarin Studio 中的 java Lang UnsupportedClassVersion 错误

    当我构建项目时 出现以下错误 我该如何纠正这个问题 C Program Files x86 MSBuild Xamarin Android Xamarin Android Common targets 3 3 错误 java lang Un
  • Windows Phone 8 中的地图点击事件/鼠标按下事件?

    我正在使用 Windows Phone 模拟器 我写了一个非常简单的程序 当用户点击地图一次时在地图上绘制一个标记 然后我使用map tap事件 并获取点击的位置 如下所示 private void map Tap object sende
  • 4.1 中的 java.lang.NoClassDefFoundError 和使用 5.1.在 android studio 中使用 multidex

    三天以来我陷入了一个非常愚蠢的问题 但仍然没有运气 我使用 Parse com 进行注册和登录 我还使用 Twitter 和 Facebook 我的应用程序类 oncreate 方法 public void onCreate super o
  • MongoDB - 聚合和

    我正在尝试计算我们数据库中跟踪的总花费金额 每个订单文档包含一个字段 total price 我正在尝试使用以下代码 db orders aggregate group id null total sum total price 不幸的是
  • 角度变量生成html

    我正在尝试使用 angularJS 制作一个博客页面 在消息部分我有一个像这样的 div div class post content jsonPost message div 在变量 jsonPost message 中我得到了一个像这样
  • Mac OS X 10.9之后无法安装PIL

    我刚刚将我的 Mac 操作系统更新到 10 9 我发现我的一些 全部 Python 模块不再存在 尤其是 Image 模块 所以我尝试执行sudo pip install pil 但我收到此错误 Applications Xcode app
  • 如何使自定义控件的属性打开文件对话框?

    我有一个自定义控件 其属性保存目标计算机上存在的文件位置的名称 完整路径 确切的路径会根据目标电脑的类型而有所不同 并且通常在我将自定义控件添加到表单后立即设置 同时我仍处于项目的设计模式 以便当我的应用程序运行时 它会从以下位置获取文件名
  • 如何在 GTK 3.8 中强制刷新屏幕?

    找到了解决方案 见下文 我使用GTK 3 8gtk grid在滚动窗口中 C 代码处理大量数据并在网格中显示一些数据 GTK 在程序处理完所有数据之前不会绘制网格 添加数据时如何强制 GTK 3 刷新屏幕 I tried gtk widge
  • UIImageWriteToSavedPhotosAlbum 仅保存 10 张图像中的 5 张。为什么?

    正如标题所示 我遇到了问题 是否有任何限制 例如 每秒仅导出 3 个图像 或类似的限制 for int frameStepper 0 frameStepper lt Something frameCount frameStepper Get
  • Java - Reader 流内的动态字符串替换

    我在磁盘上有一个 文本 文件 我需要将其读入带有 Reader 对象的库中 在阅读此文件时 我想对数据执行正则表达式字符串替换 我当前的解决方案是将整个文件作为一个字符串读入内存 进行字符串替换 然后为此字符串创建一个 StringRead