0

好的,所以这是一个独特的问题。

我们(每天)从一家公司获取文件。这些文件从他们的服务器下载到我们的 (SFTP)。我们处理的公司与创建文件(并减小文件大小)的第三方提供商打交道,以加快下载速度并减少服务器上的文件大小。

我们每天从服务器下载 9 个文件,3 组,每组 3 个文件,
每组文件由 2 个 XML 文件和一个“图像”文件组成。
这些 XML 文件之一为我们提供了有关“图像”文件的信息。我们需要的 XML 文件中的信息:

  • 偏移量:告诉我们一段数据从哪里开始
  • 长度:与偏移量一起使用,给我们该部分的结尾
  • count:给我们文件中保存的元素数量


在我们根据文件中每个图像的偏移量和长度将文件分割成片段之前 ,“图像”文件本身是不可用的。这些图像基本上是串联在一起的。我们需要提取这些图像才能查看它们。

偏移量、长度和计数值的示例如下:

偏移量:0
长度:2670

偏移量:2670
长度:2670

偏移量:5340
长度:2670

偏移量:8010
长度:2670

计数:4

这意味着有 4 ( count) 个项目。第一个计数项目开始于offset[0]并且是length[0]长度。第二项开始于offset[1]长度length[1],等等。

我需要在这些点和这些点精确地分割图像,没有错误的余地。第三方提供商不会向我们提供代码,我们将自己解决这个问题。如果不拆分文件,图像文件是不可读的,并且在此之前基本上是无用的。


我的问题:有没有人有办法以特定字节拆分文件?

PS我还没有任何代码。我什至不知道从哪里开始。我对编码并不陌生,但我从未按字节进行文件拆分。

我不在乎它使用哪种语言。我只需要让它工作。


编辑
操作系统是 Windows

4

1 回答 1

1

你上钩了我。这是一个粗略的 Java 方法,可以根据偏移量和长度分割文件。这至少需要 Java 8。

使用的一些类:

我发现一篇文章对生成这个例子很有帮助。

/**
 * Method that splits the data provided in fileToSplit into outputDirectory based on the
 * collection of offsets and lengths provided in offsetAndLength.
 * 
 * Example of input offsetAndLength:
 *      Long[][] data = new Long[][]{
 *          {0, 2670},
 *          {2670, 2670},
 *          {5340, 2670},
 *          {8010, 2670}
 *      };
 * 
 * Output files will be placed in outputDirectory and named img0, img1... imgN
 * 
 * @param fileToSplit
 * @param outputDirectory
 * @param offsetAndLength
 * @throws IOException
 */
public static void split( Path fileToSplit, Path outputDirectory, Long[][] offsetAndLength ) throws IOException{

    try (SeekableByteChannel sbc = Files.newByteChannel(fileToSplit, StandardOpenOption.READ )){
        for(int x = 0; x < offsetAndLength.length; x++){

            ByteBuffer buffer = ByteBuffer.allocate(offsetAndLength[x][4].intValue());
            sbc.position(offsetAndLength[x][0]);
            sbc.read(buffer);

            buffer.flip();
            File img = new File(outputDirectory.toFile(), "img"+x);
            img.createNewFile();

            try(FileChannel output = FileChannel.open(img.toPath(), StandardOpenOption.WRITE)){
                output.write(buffer);
            }

            buffer.clear();
        }
    }

}

我将解析 XML 文件留给您。

于 2015-06-09T01:26:11.063 回答