2

つまり、Androidのテキストから行を削除したいのです。どうすれば削除できますか?1つのtxtを読み取って、行を削除して別のtxtを作成したくありません。既存のtxtから行を削除したい。ありがとう。

4

3 に答える 3

6

些細な問題に見えますが、これはかなりトリッキーな問題です。行の長さが可変の場合、おそらく唯一のオプションは、ファイルを1行ずつ読み取ってoffsetlengthターゲット行を識別することです。次に、から始まるファイルの次の部分をコピーしoffset、最終的にファイルの長さを元のサイズからターゲット行の長さを引いたサイズに切り捨てます。私はaを使用しRandomAccessFileて内部ポインターにアクセスし、行ごとに読み取ります。

このプログラムには、2つのコマンドライン引数が必要です。

  • args[0]ファイル名です
  • args[1]はターゲット行番号です(1ベース:最初の行は#1です)
public class RemoveLine {
    public static void main(String[] args) throws IOException {
        // Use a random access file
        RandomAccessFile file = new RandomAccessFile(args[0], "rw");
        int counter = 0, target = Integer.parseInt(args[1]);
        long offset = 0, length = 0;

        while (file.readLine() != null) {
            counter++;
            if (counter == target)
                break; // Found target line's offset
            offset = file.getFilePointer();
        }

        length = file.getFilePointer() - offset;

        if (target > counter) {
            file.close();
            throw new IOException("No such line!");
        }

        byte[] buffer = new byte[4096];
        int read = -1; // will store byte reads from file.read()
        while ((read = file.read(buffer)) > -1){
            file.seek(file.getFilePointer() - read - length);
            file.write(buffer, 0, read);
            file.seek(file.getFilePointer() + length);
        }
        file.setLength(file.length() - length); //truncate by length
        file.close();
    }
}

これは、JUnitテストケースを含む完全なコードです。このソリューションを使用する利点は、メモリに関して完全にスケーラブルである必要があることです。つまり、固定バッファを使用するため、メモリ要件は予測可能であり、入力ファイルサイズに応じて変化しません。

于 2012-09-29T13:58:47.740 に答える
3

ファイルを文字列バッファに保存して、置き換えようとしているものを置き換えてから、ファイルの内容を完全に置き換えてみてください。

于 2012-09-29T12:32:42.210 に答える
0

ファイル内の残りのデータをコピーし、ファイルをフラッシュして、最後にコピーしたデータを書き込むことで、行を削除できます。次のコードは、削除する文字列を検索し、stringBuiderにコピーするコードをスキップします。stringBuilderの内容は、フラッシュ後に同じファイルにコピーされます

         try {
                InputStream inputStream = openFileInput(FILENAME);
                FileOutputStream fos = openFileOutput("temp", Context.MODE_APPEND);

                if (inputStream != null) {
                    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    String receiveString = "";
                    String deleteString = "<string you want to del>";
                    StringBuilder stringBuilder = new StringBuilder();

                    while ((receiveString = bufferedReader.readLine()) != null) {
                        if (!reciveString.equals(deleteline)) {
                            stringBuilder.append(receiveString);
                        }
                    }
                    fos.flush();

                    fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
                    fos.write(stringBuilder.toString().getBytes());
                    fos.close();
                    inputStream.close();
                   }
于 2015-12-23T21:50:59.680 に答える