つまり、Androidのテキストから行を削除したいのです。どうすれば削除できますか?1つのtxtを読み取って、行を削除して別のtxtを作成したくありません。既存のtxtから行を削除したい。ありがとう。
3 に答える
些細な問題に見えますが、これはかなりトリッキーな問題です。行の長さが可変の場合、おそらく唯一のオプションは、ファイルを1行ずつ読み取ってoffset
、length
ターゲット行を識別することです。次に、から始まるファイルの次の部分をコピーし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テストケースを含む完全なコードです。このソリューションを使用する利点は、メモリに関して完全にスケーラブルである必要があることです。つまり、固定バッファを使用するため、メモリ要件は予測可能であり、入力ファイルサイズに応じて変化しません。
ファイルを文字列バッファに保存して、置き換えようとしているものを置き換えてから、ファイルの内容を完全に置き換えてみてください。
ファイル内の残りのデータをコピーし、ファイルをフラッシュして、最後にコピーしたデータを書き込むことで、行を削除できます。次のコードは、削除する文字列を検索し、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();
}