【发布时间】: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) 为什么需要
numberOfParts?sizeOfParts.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