2012-09-29 39 views
2

我的意思是,我想从我的android文本中删除行。我如何删除? 我不想读取一个txt并使用删除行创建另一个txt。我想从我现有的txt删除行。 谢谢。如何从txt删除行?

+0

第一行?最后一行?中线? – Simon

+0

例如21.line –

+0

给我样本? –

回答

5

这是一个非常棘手的问题,尽管它看起来微不足道。在可变行长的情况下,可能您唯一的选择是逐行读取文件以识别目标行的offsetlength。然后复制文件的以下部分,从offset开始,最终将文件长度截断为其原始大小减去目标行的长度。我使用RandomAccessFile来访问内部指针,并且还可以通过行读取。

此程序需要两个命令行参数:

  • 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(); 
    } 
} 

Here is the full code,包括一个JUnit测试用例。使用这种解决方案的优势在于它应该对内存完全可扩展,即由于它使用固定缓冲区,其内存需求是可预测的,并且不会根据输入文件大小而改变。

3

尝试将文件存储到字符串缓冲区中替换您想要替换的文件,然后完全替换文件的内容。

+0

给样品? –

+0

我尝试感谢您的建议 –

0

您可以通过复制文件中的其余数据,然后清空文件并最终写入复制的数据来删除一行.Thr下面的代码搜索要删除的字符串并跳过要复制到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(); 
        }