当前位置: 首页 > 面试题库 >

在InputStream中过滤(搜索和替换)字节数组

郏景澄
2023-03-14
问题内容

我有一个InputStream,它将html文件作为输入参数。我必须从输入流中获取字节。

我有一个字符串:"XYZ"。我想将此字符串转换为字节格式,并检查从InputStream获得的字节序列中的字符串是否匹配。如果有的话,我必须用其他字符串的再见序列替换匹配项。

有谁可以帮助我吗?我已经使用正则表达式来查找和替换。但是,我并没有发现并替换字节流。

以前,我使用jsoup解析html并替换字符串,但是由于一些utf编码问题,当我这样做时文件似乎已损坏。

TL; DR:我的问题是:

是否可以在Java的原始InputStream中查找和替换字节格式的字符串?


问题答案:

不确定您选择了解决问题的最佳方法。

就是说,我不喜欢(也有政策禁止)以“不”回答问题,所以这里…

看一看FilterInputStream

从文档中:

FilterInputStream包含其他一些输入流,它用作其基本数据源, 可能会沿途转换数据 或提供其他功能。

编写它是一个有趣的练习。这是为您提供的完整示例:

import java.io.*;
import java.util.*;

class ReplacingInputStream extends FilterInputStream {

    LinkedList<Integer> inQueue = new LinkedList<Integer>();
    LinkedList<Integer> outQueue = new LinkedList<Integer>();
    final byte[] search, replacement;

    protected ReplacingInputStream(InputStream in,
                                   byte[] search,
                                   byte[] replacement) {
        super(in);
        this.search = search;
        this.replacement = replacement;
    }

    private boolean isMatchFound() {
        Iterator<Integer> inIter = inQueue.iterator();
        for (int i = 0; i < search.length; i++)
            if (!inIter.hasNext() || search[i] != inIter.next())
                return false;
        return true;
    }

    private void readAhead() throws IOException {
        // Work up some look-ahead.
        while (inQueue.size() < search.length) {
            int next = super.read();
            inQueue.offer(next);
            if (next == -1)
                break;
        }
    }

    @Override
    public int read() throws IOException {    
        // Next byte already determined.
        if (outQueue.isEmpty()) {
            readAhead();

            if (isMatchFound()) {
                for (int i = 0; i < search.length; i++)
                    inQueue.remove();

                for (byte b : replacement)
                    outQueue.offer((int) b);
            } else
                outQueue.add(inQueue.remove());
        }

        return outQueue.remove();
    }

    // TODO: Override the other read methods.
}

用法示例

class Test {
    public static void main(String[] args) throws Exception {

        byte[] bytes = "hello xyz world.".getBytes("UTF-8");

        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

        byte[] search = "xyz".getBytes("UTF-8");
        byte[] replacement = "abc".getBytes("UTF-8");

        InputStream ris = new ReplacingInputStream(bis, search, replacement);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        int b;
        while (-1 != (b = ris.read()))
            bos.write(b);

        System.out.println(new String(bos.toByteArray()));

    }
}

给定要"Hello xyz world"打印的字符串的字节数:

Hello abc world


 类似资料:
  • 按下 / 键,编辑器底部会出现 / 符号,接着输入字符串,便可以进行搜索 / 向下搜索 ? 向上搜索 n 搜索下一个 N 搜索上一个 :s/源字符串/目标字符串 将源字符串替换为目标字符串 :s/源字符串/目标字符串/g 替换当前行中所有符合条件的字符串 :行号1,行号2s/源字符串/目标字符串/g 在指定行中进行替换 :%s/源字符串/目标字符串/g 全文替换

  • 问题 你想在字符串中搜索和匹配指定的文本模式 解决方案 对于简单的字面模式,直接使用 str.replace() 方法即可,比如: >>> text = 'yeah, but no, but yeah, but no, but yeah' >>> text.replace('yeah', 'yep') 'yep, but no, but yep, but no, but yep' >>> 对于复杂

  • 问题内容: 诚然,对于SQL命令,我是一个菜鸟。黑客在我的一个WordPress网站上的每个帖子和页面的末尾插入了一个脚本标签,我试图在“ wp_posts”表中进行查找和替换,但是当我运行“模拟查询。这是我所拥有的: 无论我在第一组“查找”引号中添加了什么内容,即使是像“ hcifx”一样简单的东西,而不是所显示的整个脚本标签,我都会收到错误消息。有什么想法我要去哪里吗? 问题答案: 原来,该错

  • Sublime Text 提供两种主要搜索方式: 单文件搜索 多文件搜索 两种方式都支持正则表达式。 单文件搜索 搜索 键盘快捷键与搜索面板对应关系: 打开搜索面板 Ctrl + F 正则表达式 Alt + R 大小写匹配 Alt + C 精确匹配 Alt + W 下一个 Enter 上一个 Shift + Enter 所有 Alt + Enter 增量搜索 键盘快捷键与增量搜索面板对应关系: 打

  • 搜索和替换 其他常见的用途就是找到所有模式匹配的字符串并用不同的字符串来替换它们。sub() 方法提供一个替换值,可以是字符串或一个函数,和一个要被处理的字符串。 sub(replacement, string[, count = 0]) 返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现,字符将被没有改变地返回。 可选参数 count 是模式匹配后替换的最大次数;co

  • 本文向大家介绍在Drupal 6搜索中过滤节点类型,包括了在Drupal 6搜索中过滤节点类型的使用技巧和注意事项,需要的朋友参考一下 在Drupal中创建站点的常见做法是为不同的目的创建不同的节点类型。有时,这些节点类型可以基于功能而不是基于内容,并用于创建旋转的横幅或类似内容。这样做的副作用是您将看到这些节点出现在搜索结果中,这可能会导致显示一些令人困惑的结果。 那么,如何删除这些节点?通过一