所以我一直在尝试读取文本文件的内容,并将内容逐块交替写入例如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]长。
主要的问题是,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 可能会遇到一些问题。我只是不知道那是什么。