如何从文件中删除特定行

How to remove specific line from the file

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

my.java class 是:

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;
}

因此,问题出在您尝试同时打开文件进行读写的代码行下方

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

这一行:

FileOutputStream fos = new FileOutputStream(file);

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