【问题标题】:How to remove specific line from the file如何从文件中删除特定行
【发布时间】:2018-06-21 02:46:59
【问题描述】:

我正在尝试从文件中删除特定行,但是当我运行它时,它会返回所有已删除的文件。更具体地说,我在视频片段上有一个最喜欢的按钮,当用户按下它时,我想在文件中写入视频的标题(已经完成),当松开它时将其删除....

my.java 类是:

private void writeToFile(String g,Context context) {
    try {
        File file=new File("/data/data/com.holomedia.holomedia/config.txt");
        FileOutputStream fos = new FileOutputStream(file,true);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos);
        if (!file.exists()) {outputStreamWriter.write(g);}
        outputStreamWriter.append("\n"+g +"\n");
        outputStreamWriter.close();
    } catch (IOException e) {
        Log.e("Exception", "File write failed: " + e.toString());
    }
}

private void deleteToFile(String g,Context context) {
    try {
        File file=new File("/data/data/com.holomedia.holomedia/files/config.txt");
        FileOutputStream fos = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos);
        if (file.exists()) {
            BufferedReader br = new BufferedReader(new FileReader(file));
            StringBuilder text = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                if (!line.equals(g) && !g.equals("\n")){
                    text.append(line);
                    text.append('\n');
                }
            }
            br.close();
            outputStreamWriter.write(text.toString());
        }
        outputStreamWriter.close();
    } catch (IOException e) {
        Log.e("Exception", "File write failed: " + e.toString());
    }
}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.favorite:
            if(showingFirst==true) {
                Context context = getActivity();
                CharSequence text = "Added to Favorites";
                int duration = Toast.LENGTH_SHORT;
                item.setIcon(R.drawable.heart_off);
                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
                writeToFile(title,context);
                showingFirst=false;
            } else {
                Context context = getActivity();
                CharSequence text = "Deleted from Favorites";
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
                deleteToFile(title,context);
                item.setIcon(R.drawable.heart_wh);
                showingFirst=true;
            }
            break;
        case R.id.home:
            Intent k=new Intent(getActivity(),MainActivity.class);
            Log.i(TAG, "onNavigationItemSelected: ");
            startActivity(k);
            break;
    }
    return false;
}

【问题讨论】:

  • 您应该在写入文件之前尝试关闭 BufferedReader,而不是之后。
  • @BenjaminRacette 我试了一下,但它不起作用......
  • 别告诉你试过了,秀。代码,如果你愿意的话。请总是在被要求之前。
  • @johnV 你是说最终文件是空白的吗?
  • 好吧...编辑完成...!

标签: java android file bufferedreader fileoutputstream


【解决方案1】:

所以,问题在于您尝试同时打开文件进行读取和写入的代码行

File file=new File("/data/data/com.holomedia.holomedia/files/config.txt");
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos);
if (file.exists()) {
    BufferedReader br = new BufferedReader(new FileReader(file));

相反,我建议您完全阅读文件,然后在最后写入文件(覆盖)。

try {
    File file=new File("/data/data/com.holomedia.holomedia/files/config.txt");

    if (file.exists()) {
        BufferedReader br = new BufferedReader(new FileReader(file));
        StringBuilder text = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            if (!line.equals(g) && !g.equals("\n")){
                text.append(line);
                text.append('\n');
            }
        }
        br.close();

        //start writing from here
        FileOutputStream fos = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos);
        outputStreamWriter.write(text.toString());
        outputStreamWriter.flush();
        outputStreamWriter.close();
    } 
} catch (IOException e) {
    Log.e("Exception", "File write failed: " + e.toString());
}

【讨论】:

  • 为什么它永远不满足?只有当它不等于它得到的字符串时,我才想写入文本。你有什么建议吗?
  • @johnV 您还在寻找解决方案吗?
  • @johnV 我可能知道问题出在哪里。稍等几分钟,我会更新我的帖子
  • @johnV 检查我更新的帖子。它会给你一些提示,很可能它会起作用。如果您仍有问题,请告诉我。
【解决方案2】:

这一行:

FileOutputStream fos = new FileOutputStream(file);

重置文件的内容(即用空文件替换它)。我建议您添加日志记录和/或调试代码,以便您更好地了解正在发生的事情。

【讨论】:

  • 我之前说过,我在视频片段上有一个收藏按钮,我希望当用户按下它时将视频标题写入文件(已经完成),当按下它时删除它...... .
  • 这会如何改变您正在清除文件内容的事实?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2018-10-08
  • 2017-11-23
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多