Java 如果InputStream以';开头,如何使其跳过一行#';?
我正在写一个程序,必须解码二维码。代码在内部表示为二维布尔列表。代码通常被读取为包含1和0的文本文件,其中1表示矩阵中的暗模块(真),0表示亮模块(假) 我必须实现一种方法,它将接收一个InputStream,然后返回一个QR码。我必须阅读.txt,其中包含1、0和以“#”开头的注释行。我需要使该方法忽略这些注释行,但我不确定如何做到这一点 以下是代码的一些相关部分: 首先是二维码构造器(构造器工作中使用的所有方法,并完成其工作):Java 如果InputStream以';开头,如何使其跳过一行#';?,java,multidimensional-array,inputstream,qr-code,Java,Multidimensional Array,Inputstream,Qr Code,我正在写一个程序,必须解码二维码。代码在内部表示为二维布尔列表。代码通常被读取为包含1和0的文本文件,其中1表示矩阵中的暗模块(真),0表示亮模块(假) 我必须实现一种方法,它将接收一个InputStream,然后返回一个QR码。我必须阅读.txt,其中包含1、0和以“#”开头的注释行。我需要使该方法忽略这些注释行,但我不确定如何做到这一点 以下是代码的一些相关部分: 首先是二维码构造器(构造器工作中使用的所有方法,并完成其工作): 首先,我建议您使用阅读器阅读文本。然后可以使用Buffered
首先,我建议您使用
阅读器
阅读文本。然后可以使用BufferedReader
及其readLine()
方法来处理文本行,而不是字节流
不管怎样,给定您当前的代码:一旦您读取了
\n
,设置一个布尔标志以指示您刚刚看到一个新行字符。然后,当您开始阅读下一行时,打开该标志,如果该标志为真,并且您看到一个#
作为下一个字符,您应该一直阅读,直到看到另一个\n
。如果该标志不正确,则在执行操作时阅读该行的其余部分
当你想找到这个代码时,你可能想考虑空格,这取决于你希望它是多么宽松。 如果你决定使用阅读器,那么你可以使用正则表达式来对包含除“0”和“1”之外的任何字符的线条进行元素化。您可以在下面的链接中找到有关正则表达式用法的详细信息。 您只能修改1和0的正则表达式,如
String regex=“[0-1]+”代码>
之后可以使用下面的示例代码来获取每个字符
String s1="hello";
char[] ch=s1.toCharArray();
为什么不使用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
然后我们可以将每一行转换为一个布尔值列表:
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());
输出将是
[true, true, true]
[true, false, true]
如果您正在阅读文本,则应使用读取器
,而不是输入流
。然后,您可以使用一个BufferedReader
,它有一个readLine()
方法。问题是,我从赋值中给出了这些方法,它必须完全按照给定的方式实现,我不能更改其中的任何内容。您可以将InputStream
转换为BufferedReader
,就像这样:new BufferedReader(新的InputStreamReader(inputStream));
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]