【问题标题】:Java - Write content from one file chunk by chunk (e.g. 8 Bytes) alternately into multiple filesJava - 将一个文件中的内容逐块(例如 8 字节)交替写入多个文件
【发布时间】:2021-03-12 04:53:50
【问题描述】:

所以我一直在尝试读取文本文件的内容并将内容逐块交替写入例如2 个新文件。

我已经尝试了多种方法来做到这一点,但它不起作用(OutputStream 和 FileOutputStream 似乎是最合适的)。

在我尝试分割文件之前,例如3 部分并将第一部分写在一个文件中,第二部分写在另一个文件中,依此类推。与 OutputStream 和 FileOutputStream 完美搭配。

但是当我想交替做时它不会起作用。

为了交替进行,我使用循环算法,它本身就可以正常工作。

如果你能给我一些例子,我将非常感激!

public void splitFile(String filePath, int numberOfParts, long sizeOfParts[]) throws FileNotFoundException, IOException, SQLException {
    long bytes = 8;
    
    OutputStream partsPath[] = new OutputStream[numberOfParts];
    long bytePositition[] = new long[numberOfParts];

    long copy_size[] = new long[numberOfParts];
    for (int i = 0; i < numberOfParts; i++) {
        copy_size[i] = sizeOfParts[i];
        partsPath[i] = new FileOutputStream(path); //Gets Path from my Database (works)
        //System.out.println(cloudsTable.getCloudsPathsFromDatabase(i) + '\\' + name + (i + 1) + fileType);
    }

    InputStream file = new FileInputStream(filePath);

    while (true) {
        boolean done = true;

        for (int i = 0; i < numberOfParts; i++) {

            if (copy_size[i] > 0) {
                done = false;
                if (copy_size[i] > bytes) {
                    copy_size[i] -= bytes;
                    bytePositition[i] += bytes;
                    
                    System.out.println("file " + i + " " + bytePositition[i]);
                    readWrite(file, bytePositition[i], partsPath[i]);
                } else {
                    bytePositition[i] += copy_size[i];
                    
                    System.out.println("rest file " + i + " " + bytePositition[i]);

                    readWrite(file, bytePositition[i], partsPath[i]);
                    copy_size[i] = 0;
                }
            }

        }


        if (done == true) {

            break;
        }

    }
    file.close();
    for (int i = 0; i < partsPath.length; i++) {
        partsPath[i].close();
    }

}

private void readWrite(InputStream file, long bytes, OutputStream path) throws IOException {
    byte[] buf = new byte[(int) bytes];
    while (file.read(buf) != -1) {
        path.write(buf);
        path.flush();
    }

}

代码所做的是,它只在第一次复制的文件中写入Originalfile的内容,后面的文件是空的

编辑: 为了阐明代码应该做什么,将前 8 个字节写入文件 1,第二个 8 个字节写入文件 2,第三个 8 个字节写入文件 3,第四个 8 个字节写入文件 1,依此类推,循环,直到文件 1 的长度为 sizeOfParts[0],文件 2 的长度为 sizeOfParts[1],文件 3 的长度为 sizeOfParts[2]。

【问题讨论】:

  • 向我们展示您尝试过的代码。现在,这个问题看起来像是在试图欺骗我们为您编写代码。
  • 我添加了它。不知道问一般问题会被解释为企图欺骗..
  • 我仍然不确定您要在这里做什么。 1) 为什么需要numberOfPartssizeOfParts.length 不是一回事吗? --- 2) sizeOfParts 的目的是什么?对结果有什么影响? --- 3) bytes 的目的是什么?对结果有什么影响?
  • 无论如何,您的代码无法正常工作(无论它尝试做什么),因为readWrite() 方法存在严重缺陷。您调用read(buf),但不要保存len 返回值,这是write(buf) 调用肯定需要的,因为该调用应该是write(buf, 0, len)。此外,readWrite() 会将输入流的全部复制到输出流中,这意味着第一个输出文件最终是输入文件的副本,其余的只是空的。跨度>
  • 好的,我尽力解释它: 1) numberOfParts 是原始文件应该被分割成多少的数字。例如:3 个部分 2) sizeOfParts 是每个部分应具有的字节大小。我计算它取决于目录的容量(我设置)和原始文件的大小。例如 1.File: 293 byte, 2.File: 323, 3.File 123. 这样在每个文件中交替写入一个块(8bytes),直到达到部分文件的大小。然后该块将仅写入剩余的部分。 3) bytes 是应该写入 Part-files 的块的大小

标签: java file outputstream fileoutputstream write


【解决方案1】:

主要问题是readWrite() 方法应该只复制一个 8 字节的字节块,但有一个循环使它复制输入文件中的所有剩余字节。

此外,应增强代码以使用try-finally 关闭文件,并正确处理文件结尾,以防输入文件短于部分总和。

我会去掉readWrite()方法,合并逻辑防止重复代码,像这样:

public void splitFile(String inPath, long[] sizeOfParts) throws IOException, SQLException {
    final int numberOfParts = sizeOfParts.length;
    
    String[] outPath = new String[numberOfParts];
    // Gets Paths from Database here
    
    InputStream in = null;
    OutputStream[] out = new OutputStream[numberOfParts];
    try {
        in = new BufferedInputStream(new FileInputStream(inPath));
        for (int part = 0; part < numberOfParts; part++)
            out[part] = new BufferedOutputStream(new FileOutputStream(outPath[part]));
        
        byte[] buf = new byte[8];
        long[] remain = sizeOfParts.clone();
        for (boolean done = false; ! done; ) {
            done = true;
            for (int part = 0; part < numberOfParts; part++) {
                if (remain[part] > 0) {
                    int len = in.read(buf, 0, (int) Math.min(remain[part], buf.length));
                    if (len == -1) {
                        done = true;
                        break;
                    }
                    remain[part] -= len;
                    System.out.println("file " + part + " " + (sizeOfParts[part] - remain[part]));
                    out[part].write(buf, 0, len);
                    done = false;
                }
            }
        }
    } finally {
        if (in != null)
            in.close();
        for (int part = 0; part < out.length; part++)
            if (out[part] != null)
                out[part].close();
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2016-02-28
    相关资源
    最近更新 更多