当前位置: 首页 > 知识库问答 >
问题:

如果InputStream以“#”开头,如何使其跳过一行?

郑宏朗
2023-03-14

我正在写一个程序,必须解码二维码。代码在内部表示为二维布尔列表。代码通常被读取为包含1和0的文本文件,其中1表示矩阵中的暗模块(true),0表示亮模块(false)。

我必须实现一个方法,它将接受一个输入流,然后必须返回一个QR码。我必须读. txt,它包含1、0和以“#”开头的注释行。我需要使该方法忽略这些注释行,但我不知道如何做到这一点。

以下是代码的一些相关部分:

首先QR码构造函数(构造函数中使用的所有方法都起作用并完成它们的工作):

public class QRCode {

private List<List<Boolean>> data; //A 2D Boolean matrix, true means black, false means white.

public QRCode(List<List<Boolean>> data)
{
    if (data == null)
        throw new NullPointerException();
    if (QRCode.isQuadratic(data) == false)
        throw new InvalidQRCodeException("Matrix must be quadratic!");
    if (QRCode.versionCheck(data) < 1 || QRCode.versionCheck(data) > 40)
        throw new InvalidQRCodeException("Invalid Dimensions (Version).");
    if (QRCode.correctlyAlligned(data) != true)
        throw new InvalidQRCodeException("Improper Allignment!");
    if (QRCode.correctTimers(data) != true)
        throw new InvalidQRCodeException("Incorrect Timing Pattern!");
    if (QRCode.correctFormatting(data) != true)
        throw new InvalidQRCodeException("Incorrect Formatting!"); 

    this.data = data; 
}   

}

这就是我指的方法。至少我现在写的。还有,如果。txt文件包含除1、0和注释以外的任何内容,它应该引发异常。PS:我以前从未使用过InputStreams,我尝试过用谷歌搜索,但我找到的所有答案都是针对特定类型的流,而且它们使用了一个。readLine()方法,我在这里不允许使用它。

public static QRCode fromFile(InputStream is) throws IOException 
{   
    int i;
    List<List<Boolean>> data = new ArrayList<>(); //a 2D Boolean Matrix
    int y = -1, x = -1;

    if (is == null)
        throw new NullPointerException();
    while((i = is.read())!=-1) //Reading begin
    {
        if (i == (byte) '\n') //If a line in .txt file ends.
        {
            y++; 
            data.add(new ArrayList<Boolean>());
            x = 0;
        }

        if ((char) i == '1') //|| (char) i == '0')
        {
            data.get(y).add(true);
            x++;
        }
        if ((char) i == '0') //||
        {
            data.get(y).add(false);
            x++;
        }
    }


    return new QRCode(data);
}

我将处理的文本文件的示例:

# name: small
# type: bool matrix
# rows: 25
# columns: 25
1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1
1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1
1 0 1 1 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 1 1 0 1
1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1
1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1
1 1 1 1 0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0
1 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1
0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 0
0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 0 1 1
1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 0
1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 1 1
1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1
1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1
0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1
1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1
1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0
1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 1
1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1
1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1
1 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1
1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 0 1

共有3个答案

微生善
2023-03-14

如果您决定使用Reader,则可以使用正则表达式来删除包含除“0”和“1”之外的任何字符的行。你可以在下面的链接中找到有关正则表达式用法的详细信息。如何在Java中检查字符串是否只包含数字

您只能修改1和0的正则表达式,如String regex=“[0-1]”

之后可以使用下面的示例代码来获取每个字符。

String s1="hello";
char[] ch=s1.toCharArray();

郦祺
2023-03-14

为什么不使用Files.lines而不是InputStream

Files.lines(Paths.get("path_to_File.txt")).filter(s -> !s.contains("#"));// let's
//read all lines form the file and skip the lines with `#` symbol

我们可以将每行转换为Boolean的列表:

s -> Stream.of(s.split(" ")).map("1"::equals).collect(Collectors.toList())// split 
string by ` ` (space) symbol and convert to Boolean "1" - true, "0" - false

现在让我们把所有的东西放在一起:

List<List<Boolean>> qr = Files.lines(Paths.get("data/fromFile.txt"))
                .filter(s -> !s.contains("#")).map(
                        s -> Stream.of(s.split(" ")).map("1"::equals)
                            .collect(Collectors.toList())
                ).collect(Collectors.toList());

对于文件:

# name: small
# type: bool matrix
# rows: 1
# columns: 3
1 1 1
1 0 1

输出将是

[true, true, true]
[true, false, true]
盛辰沛
2023-03-14

首先,我建议你使用阅读器阅读文本。然后,您可以使用BufferedReader及其readLine()方法来处理文本行,而不是字节流。

不管怎样,考虑到您当前的代码:一旦您读取了\n,设置一个布尔标志以指示您刚刚看到了一个新行字符。然后,当你开始阅读下一行时,打开该标志,如果它是真的,并且你看到一个#作为下一个字符,你应该一直阅读,直到你看到另一个\n。如果该标志不正确,则在阅读时阅读该行的其余部分。

你可能想在找到 < < /C> >时考虑空白,这取决于你想要的是多么宽松。

 类似资料:
  • 例如,我希望和回声 您的用户名无效 如果点位于第一个字母和最后一个字母之间,则脚本应回显 你的用户名很好 如何更改正则表达式以实现这一点?

  • 问题内容: 我正在使用Jenkins,Python,Selenium2(webdriver)和Py.test框架为网络测试创建测试用例。 到目前为止,我正在按照以下结构组织测试: 每个 类 是 测试用例 ,每个 方法是一个 测试步骤 。 当一切正常时,此设置非常有用,但是当一个步骤崩溃时,其余的“测试步骤”就会发疯。我可以借助来将故障包含在类(测试用例)中,但是我正在研究如何改进它。 我需要的是,

  • 问题内容: 我正在使用 Junit 通过 Seleniun WebDriver 运行测试。我试图将测试分成功能区域,以更好地报告错误。我创建了测试以测试页面加载/将文档移动到其他工作流程。如果页面加载测试失败,或者工作流移动失败,我想跳过后续的页面/工作流测试。 如果测试A失败,如何跳过班级中的其余测试或在班级B中运行测试? 注意: 我意识到我要问的是“ UNIT TESTS的 不良实践* 。但是

  • 当我输入注册号时,当它以后一个B开头时,它应该返回值true,反之亦然,但在这个编码中,当我输入bhu132时,它将值变为false。这里怎么了..请帮帮我

  • 我很好奇HttpURLConnection是如何获取连接的输入流的。我检查了父抽象类URLConnection的实现并找到了方法 > 扩展URL连接的HttpURLConnection不会重写此方法。所以想知道输入流引用是如何获得的? 与此相关的事情……超文本传输协议请求到底什么时候从客户端到服务器?是在调用getInputStream()的时候?还是在调用openConnection()的时候?

  • 假设我给出了三个指向Spark上下文的文件路径来读取,每个文件的第一行都有一个模式。如何从标题中跳过模式行? 现在,我们如何从这个RDD跳过标题行呢?