当前位置: 首页 > 知识库问答 >
问题:

Java-从一个文件中逐个块写入内容(例如。8字节)交替进入多个文件

郏扬
2023-03-14

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

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

在我尝试将文件分成三部分之前,我将第一部分写在一个文件中,第二部分写在另一个文件中,依此类推。它在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();
    }

}

代码所做的是,它只在第一个复制的文件中写入原始文件的内容,而下面的文件是空的

编辑:为了澄清代码应该做的是写第一个8字节到文件1,第二个8字节到文件2,第三个8字节到文件3,第四个8字节到文件1,以此类推,一轮Robin,直到文件1为sizeOfParts[0]长,文件2为sizeOfParts[1]长,文件3为sizeOfParts[2]长。

共有1个答案

萧英睿
2023-03-14

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

此外,应增强代码,以使用try finally关闭文件,并在输入文件短于部分之和的情况下正确处理文件结尾。

我将消除readWrite()方法,并整合逻辑以防止代码重复,如下所示:

java prettyprint-override">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();
    }
}
 类似资料:
  • 问题内容: 我有一个带有汉字文本的文件,我想将这些文本复制到另一个文件中。但是文件输出混乱了中文字符。注意,在我的代码中,我已经在使用“ UTF8”作为编码了: 问题答案: 在这种情况下,请勿使用FileReader,因为它不允许您指定输入编码。在FileInputStream上构造一个InputStreamReader。 像这样:

  • 问题内容: 用最简单的方法,在java中如何创建一个文件并写入内容? 问题答案: 创建一个文本文件: 创建一个二进制文件: Java 7+用户可以使用Files该类来写入文件: 创建一个文本文件: 创建一个二进制文件:

  • 问题内容: 我有20个线程用println()函数写入一个名为result.txt的文件。我该如何同步它们? 我注意到每次我的程序运行时,results.txt中的文本行数都会不同。 谢谢。 问题答案: 通过包含同步方法以写入文件的类访问文件。一次仅一个线程将能够执行该方法。 我认为Singleton模式适合您的问题: 每次需要写入文件时,只需调用:

  • 我有从多个文件读取并写入多个文件的Spring批处理配置。是否可以只写入从多个读取的一个文件。假设我收到巨大的XML文件,我将XML拆分为小文件并使用分区器并行读取小文件。但我需要将从不同的小xml文件读取的所有数据写入一个输出文件。Spring批处理是否可以做到这一点?我知道通过使写入器同步是可能的,但我正在寻找任何其他可能的方式作业配置 我得到错误组织。springframework。一批项目

  • 问题内容: 我想将五个文件的内容照原样复制到一个文件中。我尝试使用cp为每个文件执行此操作。但这会覆盖从先前文件复制的内容。我也试过 它没有用。 我希望我的脚本在每个文本文件的末尾添加换行符。 例如。文件1.txt,2.txt,3.txt。将1,2,3的内容放入0.txt 我该怎么做 ? 问题答案: 您需要(concatenate的简称)命令,并使用shell重定向()进入输出文件

  • 问题内容: 我正在尝试创建一个程序,将所有数据从excel写入多个csv文件。 目前,我的程序创建了 n 个文件,并且只有excel的最后一行写入了最后一个csv文件。 编程背景观察: 似乎文件正在写入。但是对于每个写入的行,它都会以某种方式创建相同的文件250次。它将擦除最后写入的行。 使用 OutputStream 或 BufferedWriter 可能会遇到一些问题。我只是不知道那是什么。