繁体   English   中英

Java中如何拆分包含多个“行”的字节数组?

[英]How to split a byte array that contains multiple “lines” in Java?

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

one 
two 
three

(但是这个文件被加密了)

我的加密方法以 byte[] 类型返回 memory 中的整个文件。
我知道字节 arrays 没有“线”的概念,这是扫描仪(例如)可以拥有的。

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

  1. 在字节数组中查找行
  2. 将原始字节数组切片为“行”(我会将这些切片转换为字符串,以发送到我的其他方法)
  3. 正确遍历一个字节数组,其中每次迭代都是一个新的“行”

另外:我是否需要考虑文件可能组成的不同操作系统? 我知道 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;

特别是,有人建议我明确设置编码,但我无法确切地看到在哪里?

如果你想 stream 这个,我建议:

  • 创建一个ByteArrayInputStream来包装你的数组
  • 将其包装在InputStreamReader中以将二进制数据转换为文本 - 我建议您明确指定正在使用的文本编码
  • 围绕它创建一个BufferedReader以一次读取一行

然后你可以使用:

String line;
while ((line = bufferedReader.readLine()) != null)
{
    // Do something with the line
}

BufferedReader处理来自所有操作系统的换行符。

所以是这样的:

byte[] data = ...;
ByteArrayInputStream stream = new ByteArrayInputStream(data);
InputStreamReader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(streamReader);

String line;
while ((line = bufferedReader.readLine()) != null)
{
    System.out.println(line);
}

请注意,通常您希望对流和读取器使用 try-with-resources 块 - 但在这种情况下并不重要,因为它只是在 memory 中。

正如斯科特所说,我想看看你想出了什么,所以我们可以帮助你改变它以满足你的需要。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM