繁体   English   中英

逐块读取多个文件中的内容,然后使用Java将它们逐块写入单个文件中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM