4

マージしたいファイルの配列があります。これは私が試したものですが、うまくいきませんでした。

 public static void joinf(File f1, File f2){

    try{

        InputStream in = new FileInputStream(f1);


        OutputStream out = new FileOutputStream(f2,true);

        byte[] buf = new byte[8192];
        int len;
        while ((len = in.read(buf)) > 0){
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
        System.out.println("File copied.");
    }
    catch(FileNotFoundException ex){
        System.out.println(ex.getMessage() + " in the specified directory.");
        System.exit(0);
    }
    catch(IOException e){
        System.out.println(e.getMessage());            
    }
}


public void pro(File a,File[]b){
    for(int i=0;i<b.length;i++){


        joinf(a,b[i]);
    }
}
4

2 に答える 2

19

これを行うには、 IOUtilsを使用します。私の例を参照してください:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.io.IOUtils;

public class SourceCodeProgram {

    public static void main(String[] args) throws Exception {
        IOCopier.joinFiles(new File("D:/d.txt"), new File[] {
                new File("D:/s1.txt"), new File("D:/s2.txt") });
    }
}

class IOCopier {
    public static void joinFiles(File destination, File[] sources)
            throws IOException {
        OutputStream output = null;
        try {
            output = createAppendableStream(destination);
            for (File source : sources) {
                appendFile(output, source);
            }
        } finally {
            IOUtils.closeQuietly(output);
        }
    }

    private static BufferedOutputStream createAppendableStream(File destination)
            throws FileNotFoundException {
        return new BufferedOutputStream(new FileOutputStream(destination, true));
    }

    private static void appendFile(OutputStream output, File source)
            throws IOException {
        InputStream input = null;
        try {
            input = new BufferedInputStream(new FileInputStream(source));
            IOUtils.copy(input, output);
        } finally {
            IOUtils.closeQuietly(input);
        }
    }
}

IOUtils libを使用できない場合は、独自の実装を作成してください。例:

class IOUtils {
    private static final int BUFFER_SIZE = 1024 * 4;

    public static long copy(InputStream input, OutputStream output)
            throws IOException {
        byte[] buffer = new byte[BUFFER_SIZE];
        long count = 0;
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }

    public static void closeQuietly(Closeable output) {
        try {
            if (output != null) {
                output.close();
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}
于 2013-02-03T13:53:03.107 に答える
0

現在の形式では、proメソッドは fileaを各ファイルに追加しbます。その理由は、メソッドが fileに file をjoinf(a, b)追加するためであり、その逆ではないためです。ab

それを修正するには、これ:

joinf(a,b[i]);

これに変更する必要があります:

joinf(b[i], a);

またはそのようなもの。


参考までに、コードには他にもさまざまな問題があります。次回はより良いコードを書くことができるように、それらを確認してください...

  • 特定の状況では、joinf メソッドがファイル記述子をリークする可能性があります。リソースは、(明示的または暗黙的に) finally.
  • そのようなライブラリ メソッドを呼び出すSystem.exit()と、再利用が難しくなります。
  • スタック トレースを破棄しています。これにより、現場で展開されたアプリのコピーのデバッグが困難になります。
  • IOException を処理する戦略が間違っています。そこで予期しない IOException が発生した場合は、何か重大な問題があります。印刷して続行するのは本当に悪い考えです。
  • 名前proと名前joinfは悪い選択です。
  • javadoc なし
于 2013-02-03T13:42:32.470 に答える