【问题标题】:java 8 splitting bytes into chunksjava 8 将字节分割成块
【发布时间】:2021-03-13 13:01:42
【问题描述】:

我必须创建一个方法,我需要将文件分块成多个字节。

examples byte[] into List , 假设每个大小为 1 MB (sizeMB=1 * 1024 * 1024)

所以 5.2 MB 文件应该是五个 1MB 和一个 2KB 的列表。 [2kb、1MB、1MB、1MB、1MB、1MB]。

byte[] mainFile=getFIle();
List<bute[]> listofSplitBytes=getFileChunks(mainFile);

public void list<bute[]> getFileChunks(byte[] mainFile) {
    int sizeMB = 1 * 1024 * 1024;
    // Split the files logic
}

我试图避免添加 if then else 来处理 .我正在尝试查找是否有更清洁的方法,例如使用流或类似的东西?

【问题讨论】:

  • 这篇文章可能对你有所帮助:stackoverflow.com/questions/39399398/…
  • 对于大文件,这将对程序的内存使用造成严重破坏。想象一下读取一个 500 MB 的文件并在 RAM 中有两个副本。更好的方法是在读取文件时一次返回一个块。如果这不是一个选项,请将主字节数组放入 ByteBuffer,并返回该 ByteBuffer 的切片,这样就不会复制字节。
  • Streams 标签因为,我想寻找某种函数式编程解决方案。
  • 我不太清楚你所说的避免 if/then/else 是什么意思。您几乎必须有一个条件语句,因为您要截断第一个块而不是最后一个块。您可以使用像?...: 或Math.max/min 这样的环形交叉口形式,但无论如何,条件构造是必要的。

标签: java file java-8 split java-stream


【解决方案1】:

试试这个:

public List<byte[]> getFileChunks(byte[] mainFile) {
    int sizeMB = 1 * 1024 * 1024;
    List<byte[]> chunks = new ArrayList<>();
    for (int i = 0; i < mainFile.length; ) {
        byte[] chunk = new byte[Math.min(sizeMB, mainFile.length - i)];
        for (int j = 0; j < chunk.length; j++, i++) {
            chunk[j] = mainFile[i];
        }
        chunks.add(chunk);
    }
    return chunks;
}

或者如果你想要一个功能性的解决方案,那么试试这个:

public List<byte[]> getFileChunks(byte[] mainFile) {
    final int sizeMB = 1 * 1024 * 1024;
    return IntStream.iterate(0, i -> i + sizeMB)
                    .limit((mainFile.length + sizeMB - 1) / sizeMB)
                    .mapToObj(i -> Arrays.copyOfRange(mainFile, i, Math.min(i + sizeMB, mainFile.length)))
                    .collect(Collectors.toList());
}

【讨论】:

    猜你喜欢
    • 2014-04-25
    • 1970-01-01
    • 2013-12-05
    • 2021-09-08
    • 1970-01-01
    • 2014-04-11
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多