Pizzret
Pizzret

Reputation: 95

Remove a specific line from a .txt file

I'm trying to remove a specific line from .txt file, that is stored on my android phone. This is how I'm trying to do it:

public void removeLineFrom (String filePath, String lineToRemove){
    try {
          File oldFile = new File(filePath);
          File tempFile = new File(externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/temp file.txt");

          BufferedReader br = new BufferedReader(new FileReader(filePath));
          PrintWriter pw = new PrintWriter(new FileWriter(tempFile));

          String line = null;

          //Read from the original file and write to the new
          //unless content matches data to be removed.
          while ((line = br.readLine()) != null) {

            if (!line.equals(lineToRemove)) {

              pw.write(line);
              pw.flush();
            }
          }
          pw.close();
          br.close();

          //Delete the original file
          oldFile.delete();

          //Rename the new file to the filename the original file had.
          tempFile.renameTo(recordedFiles);

        }
        catch (FileNotFoundException ex) {
          ex.printStackTrace();
        }
        catch (IOException ex) {
          ex.printStackTrace();
        }
}

Everytime I call this method like this:

removeLineFrom(externalStoragePath + File.separator + 
    "/Android/data/com.whizzappseasyvoicenotepad/recorded files.txt", 
    recordedFilesArray.get(toDelete));

The app crashes. This is the logcat error:

08-08 15:24:22.225: E/AndroidRuntime(6146): java.lang.IndexOutOfBoundsException: 
    Invalid index 1, size is 1

It says the problem is in the line posted above (calling the method). I don't know why the index would be invalid. This is toDelete variable:

toDelete = arg2;

Whole onItemLongClick if anyone needs:

listView.setOnItemLongClickListener(new OnItemLongClickListener(){

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            deleteAlert.setTitle("Warning");
            deleteAlert.setMessage("Are you sure you want to delete this?");
            toDelete = arg2;
            deleteAlert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    File directory = new File (externalStoragePath + File.separator + "Android/data/com.whizzappseasyvoicenotepad/");
                    File deleteFile = new File (directory, recordedFilesArray.get(toDelete) + ".mp3");
                    deleteFile.delete();
                    Log.i("TAG", "Deleting file: " + directory + recordedFilesArray.get(toDelete) + ".mp3");

                    listAdapter.remove(listAdapter.getItem(toDelete));
                    listAdapter.notifyDataSetChanged();

                    removeLineFrom(externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/recorded files.txt", recordedFilesArray.get(toDelete));

                    Toast toast = Toast.makeText(getApplicationContext(), "Deleted", Toast.LENGTH_SHORT);
                    toast.show();

                    dialog.dismiss();
                }
            });

            deleteAlert.setNegativeButton("No", null);
            deleteAlert.show();
            return false;
        }

    });

Upvotes: 0

Views: 1955

Answers (3)

Guy
Guy

Reputation: 6522

The problem is here:

listAdapter.remove(listAdapter.getItem(toDelete));
listAdapter.notifyDataSetChanged();

removeLineFrom(externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/recorded files.txt", recordedFilesArray.get(toDelete));

You are removing arg2 from the array, before you call your method, that's why when you call your method, the arg2 (toDelete) doesn't exist anymore. To make it work, simply call your method (removeLineFrom) before removing item from listAdapter.

Upvotes: 2

Gustek
Gustek

Reputation: 3760

Your recordedFilesArray has only one element but You trying to get a 2nd one, array indexes start at 0.

Upvotes: 0

spartygw
spartygw

Reputation: 3452

If size of the array is 1 and your index is 1 it is out of bounds just like it says. Arrays start at index 0.

Upvotes: 0

Related Questions