Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何拆分包含多个“0”的字节数组;“行”;在爪哇?_Java_Arrays_Loops_Line_Newline - Fatal编程技术网

Java 如何拆分包含多个“0”的字节数组;“行”;在爪哇?

Java 如何拆分包含多个“0”的字节数组;“行”;在爪哇?,java,arrays,loops,line,newline,Java,Arrays,Loops,Line,Newline,假设我们有这样一个文件: one two three (但此文件已加密) 我的加密方法以byte[]类型返回内存中的整个文件。 我知道字节数组没有“行”的概念,这是扫描器(例如)可能有的 我想遍历每一行,将其转换为字符串并对其执行操作,但我不知道 如何: 在字节数组中查找行 将原始字节数组切片为“行”(我会将这些切片转换为字符串,以发送给我的其他方法) 正确地遍历一个字节数组,其中每个迭代都是一个新的“行” 也:我需要考虑文件中可能包含的不同操作系统吗?我知道Windows和Linux中的

假设我们有这样一个文件:

one 
two 
three
(但此文件已加密)

我的加密方法以byte[]类型返回内存中的整个文件。
我知道字节数组没有“行”的概念,这是扫描器(例如)可能有的

我想遍历每一行,将其转换为字符串并对其执行操作,但我不知道 如何:

  • 在字节数组中查找行
  • 将原始字节数组切片为“行”(我会将这些切片转换为字符串,以发送给我的其他方法)
  • 正确地遍历一个字节数组,其中每个迭代都是一个新的“行”
  • 也:我需要考虑文件中可能包含的不同操作系统吗?我知道Windows和Linux中的新行之间存在一些差异,我不希望我的方法只使用一种格式

    编辑:根据这里的答案中的一些提示,我能够编写一些代码来完成这项工作。我仍然怀疑这段代码是否值得保留,或者我正在做的事情将来可能会失败:

    byte[] decryptedBytes = doMyCrypto(fileName, accessKey);
    ByteArrayInputStream byteArrInStrm = new ByteArrayInputStream(decryptedBytes);
    InputStreamReader inStrmReader = new InputStreamReader(byteArrInStrm);
    BufferedReader buffReader = new BufferedReader(inStrmReader);
    
    String delimRegex = ",";
    String line;
    String[] values = null;
    
    while ((line = buffReader.readLine()) != null) {
        values = line.split(delimRegex);
        if (Objects.equals(values[0], tableKey)) {
            return values;
        }
    }
    System.out.println(String.format("No entry with key %s in %s", tableKey, fileName));
    return values;
    

    特别是,有人建议我显式设置编码,但我无法看到确切的位置?

    正如Scott所说,我希望看到您的想法,以便我们可以帮助您修改它以满足您的需要


    关于您对操作系统的最后评论;如果你想支持多个文件类型,你应该考虑多个支持这些不同文件扩展的函数。据我所知,您确实需要指定您正在使用代码读取的文件和文件类型。

    如果您希望流式传输此文件,我建议:

    • 创建一个
      ByteArrayInputStream
      来包装数组
    • 将其包装在
      InputStreamReader
      中以将二进制数据转换为文本-我建议您明确指定所使用的文本编码
    • 在其周围创建一个
      BufferedReader
      ,以便一次读取一行
    然后您可以使用:

    String line;
    while ((line = bufferedReader.readLine()) != null)
    {
        // Do something with the line
    }
    
    BufferedReader
    处理来自所有操作系统的换行操作

    比如说:

    byte[]数据=。。。;
    ByteArrayInputStream=新的ByteArrayInputStream(数据);
    InputStreamReader streamReader=新的InputStreamReader(stream,StandardCharsets.UTF_8);
    BufferedReader BufferedReader=新的BufferedReader(streamReader);
    弦线;
    而((line=bufferedReader.readLine())!=null)
    {
    系统输出打印项次(行);
    }
    

    请注意,一般情况下,您可能希望使用try with resources块来处理流和读卡器,但在这种情况下,这并不重要,因为它只是在内存中。

    请分享您为尝试解决此问题所写的内容。@ScottHunter我意识到我似乎没有付出足够的努力,但我能找到的关于字节[]中换行符的所有信息(在Java上下文中)是有人试图删除换行符,他们通过对整个字节进行大规模替换[],它没有告诉我如何切片。我能得到一个提示吗?很乐意做这些工作,只是不知道从哪里开始!我不是指文件类型,而是操作系统类型。file.csv可以在CRLF编辑器或LF编辑器中编写-我不确定这是否重要,也许java有一种方法使其透明?不确定这是否有用,但java有一个字符字符#isSpace函数,用于确定字符是否为5个可能空格中的1个,其中一个为(新行)。希望这有帮助!我已经看了一下,并相应地写了一些代码。我不确定它是否足够好,可以作为答案发布并接受我自己的答案…或者使用
    扫描仪
    ,就像OP建议的那样。在这种情况下,您可以直接使用
    输入流
    ,即
    尝试(Scanner s=新扫描仪(new ByteArrayInputStream(array)){while(s.hasNextLine()){String line=s.nextLine();/*对这行做些什么*/}
    @Holger:就我个人而言,我在很多方面都不喜欢Scanner API。我个人每次都会使用
    BufferedReader
    。@JonSkeet,谢谢你的提示!我能写出一些似乎有效的东西,但我想知道下一步是什么来接受你的答案?我写了一些我认为与你的想法一致的代码但是我有疑问。如果你认为这是好的,也许你可以从我的更新中复制它来编辑你的答案,然后其他看到这个问题的人可以确定它是正确的答案?对不起,我感到困惑。我在SO方面确实比你少一点经验;)@DraxDomax:好的,我会在我的答案中给出一个更完整的例子。