0

ADから1行(4 MB)までの4194304文字のシーケンスを含むテキストファイルがあります。ランダムに文字をポイントし、次の文字セットを100文字の長さの別のファイルに置き換えて、ファイルに書き出すにはどうすればよいですか?私は現在これを実際に行うことができますが、それを数回繰り返すと本当に非効率的だと感じます。

これが私が上で述べたことの実例です: Imageshackへのリンク

これが私が現在これを達成している方法です:

Random rnum = new Random();
FileInputStream fin = null;
FileOutputStream fout = null;
int count = 10000;
FileInputStream fin1 = null;

File file1 = new File("fileWithSet100C.txt");

int randChar = 0;
while(cnt > 0){
    try {
        int c = 4194304 - 100;

        randChar = rnum.nextInt(c);
        File file = new File("file.txt");

                    //seems inefficient to initiate these guys over and over 
        fin = new FileInputStream(file);
        fin1 = new FileInputStream(file1);

        //would like to remove this and have it just replace the original
        fout = new FileOutputStream("newfile.txt");

        int byte_read;
        int byte_read2;

        byte[] buffer = new byte[randChar]; 
        byte[] buffer2 = new byte[(int)file1.length()]; //4m

        byte_read = fin.read(buffer);
        byte_read2 = fin1.read(buffer2);

        fout.write(buffer, 0, byte_read);
        fout.write(buffer2, 0, byte_read2);

        byte_read = fin.read(buffer2);
        buffer = new byte[4096]; //4m
        while((byte_read = (fin.read(buffer))) != -1){
            fout.write(buffer, 0, byte_read);
        }

        cnt--;
    }
    catch (...) {
        ...
    }
    finally {
          ...
    }
    try{
        File file = new File("newfile.txt");
        fin = new FileInputStream(file);
        fout = new FileOutputStream("file.txt");
        int byte_read;
        byte[] buffer = new byte[4096]; //4m
        byte_read = fin.read(buffer);
    while((byte_read = (fin.read(buffer))) != -1){
        fout.write(buffer, 0, byte_read);
    }
    }
    catch (...) {
        ...
    }
    finally {
          ...
    }

読んでくれてありがとう!

編集:好奇心旺盛な人のために、前述の問題を解決するために使用したコードは次のとおりです。

String stringToInsert = "insertSTringHERE";
byte[] answerByteArray = stringToInsert.getBytes();
ByteBuffer byteBuffer = ByteBuffer.wrap(answerByteArray);
Random rnum = new Random();
randChar = rnum.nextInt(4194002); //4MB worth of bytes

File fi = new File("file.txt");

RandomAccessFile raf = null;
try {
    raf = new RandomAccessFile(fi, "rw");
} catch (FileNotFoundException e1) {
    // TODO error handling and logging
}

FileChannel fo = null;
fo = raf.getChannel();

// Move to the beginning of the file and write out the contents
// of the byteBuffer.
try {
    outputFileChannel.position(randChar);
    while(byteBuffer.hasRemaining()) {
        fo.write(byteBuffer);
}
} catch (IOException e) {
    // TODO error handling and logging
}
try {
    outputFileChannel.close();
} catch (IOException e) {
    // TODO error handling and logging
}
try {
    randomAccessFile.close();
} catch (IOException e) {
    // TODO error handling and logging
}
4

2 に答える 2

1

おそらく、Javaのランダムアクセスファイル機能を使用したいと思うでしょう。Sun / Oracleには、おそらく役立つランダムアクセスファイルのチュートリアルがあります。

Java 7を使用できない場合は、シーク機能も備えており、Java1.0以降に存在するRandomAccessFileを確認してください。

于 2012-05-20T00:58:29.087 に答える
-1

まず、ファイルの場合、ファイルをグローバル変数として使用できます。これにより、ファイルを再度読み取ることなく、必要なときにいつでもファイルを使用できます。また、新しいファイルを作成し続けると、すでに取得したデータが失われることに注意してください。

例えば:

public class Foo {

  // Gloabal Vars //
  File file;

  public Foo(String location) {
     // Do Something
    file = new File(location);
  }

  public add() {
    // Add
  }

}

あなたの質問に答えて、私は最初に両方のファイルを読み、次にメモリに必要なすべての変更を加えます。すべての変更を行った後、変更をファイルに書き込みます。

ただし、ファイルが非常に大きい場合は、ディスク上ですべての変更を1つずつ行います...速度は遅くなりますが、この方法でメモリが不足することはありません。あなたがしていることについては、それがどれほど遅くなるかに対抗するのを助けるためにあなたがバッファを使うことができるとは思えません。

私の全体的な提案は、配列を使用することです。たとえば、私は次のことを行います...

public char[] addCharsToString(String str, char[] newChars, int index) {
        char[] string = str.toCharArray();
        char[] tmp = new char[string.length + newChars.length];
        System.arraycopy(string, 0, tmp, 0, index);
        System.arraycopy(newChars, index, tmp, index, newChars.length);
        System.arraycopy(string, index + newChars.length, tmp, index + newChars.length, tmp.length - (newChars.length + index));
        return tmp;
}

お役に立てれば!

于 2012-05-20T00:59:17.557 に答える