[英]Reading contents in multiples files block by block and writing them block by block in a single file using Java
这是我的源代码。 我有阅读部分,但我的写作部分需要一个简单的逻辑,但我没有得到。在我当前的逻辑中,数据被覆盖,并且我始终能够在我的书面文件中看到读取数据的最后一块。
import java.io.File;
import java.io.FileInputStream;
java.io.FileNotFoundException;
java.io.FileOutputStream;
import java.io.IOException;
public class LoadTest
{
public void readFiles(File file) throws FileNotFoundException
{
int fsize = (int) file.length();
int part = (fsize/4)+(fsize%4);
byte[] block = new byte[part];
FileInputStream fin = new FileInputStream(file);
try
{
int val=-1;
do
{
int bytesread =0;
while(bytesread<part)
{
val = fin.read(block, bytesread, part-bytesread);
if (val<0)
break;
bytesread += val;
}
writeFiles(block,bytesread);
}
while(val>=0);
fin.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
public void writeFiles(byte[] block, int len) throws IOException
{
int byteswritten = 0;
FileOutputStream fout = new FileOutputStream("input.csv");
fout.write(block, byteswritten, len+byteswritten);
byteswritten +=len;
fout.close();
}
public static void main(String[] args) throws FileNotFoundException
{
LoadTest testobj = new LoadTest();
String folder = "/Users/NiranjanSubramanian/Desktop/TestFiles";
File dir = new File(folder);
File[] files = dir.listFiles();
System.out.println("Started");
for( File entry: files)
{
testobj.readFiles(entry);
}
System.out.println("Ended");
}
}
请参阅我的评论,了解如何以简单的方式解决问题。 但是,让我建议您一个简单的选择来完成您的要求。
final Path dir = Paths.get("/Users/NiranjanSubramanian/Desktop/TestFiles");
try (final OutputStream out = Files.newOutputStream(Paths.get("input.csv"))) {
for (final Path file : Files.newDirectoryStream(dir)) {
Files.copy(file, out);
}
}
这依赖于Java 7的新文件API,但是(至少在我看来)是一种更为简洁的解决方案。
有一些库可以为您甚至是NIO处理它,但是最简单的方法如下:
int read = 0;
byte[] buff = new byte[1024];
FileInputStream fis = new FileInputStream(yourInputFile);
FileOutputStream fos = new FileOutputStream(yourOutputFile);
while((read = fis.read(buff)) >= 0){
fos.write(buff, 0, read);
}
fos.flush();
fos.close();
fis.close();
在追加模式下打开文件。由于默认值是覆盖而不是追加,因此您的代码将被覆盖。
要追加,您需要将append参数传递为true。 更改
FileOutputStream fout = new FileOutputStream("input.csv");
至
FileOutputStream fout = new FileOutputStream("input.csv", true);
如何在Java中复制流:
byte[] buffer = new byte[8192]; // or whatever you like really
int count;
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
请注意,在开始写入之前不需要全部输入在内存中,因此可以节省时间和空间。 处理部分读取(包括可能的最后一个读取)非常容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.