Skip to content

Files - Write, Read and Delete - Examples

In this tutorial we will explore how to write into and read and delete from files in Android. These files are saved to and read from the internal storage.

Example 1: Write,Read,Delete Files with Runtime Permissions

A simple example written in Java on how to read from or write into Files in Android. We also handle runtime permissions appropriately. We will read, write and delete in a background thread using AsyncTask.

Here is a demo of the created project:

read_write_delete_files

Step 1: Create Project

Start by creating an empty Android Studio project.

Step 2: Dependencies

No external or special dependency is needed.

Step 3: Design Layout

Design your MainActivity layout by including Button, EditText and TextView as widgets as follows:

activity_main.xml

<?xml version="1.0" encoding="UTF-8"?>

<RelativeLayout
    tools:context="com.example.ankitkumar.asynctask.MainActivity"
    android:background="#F58F"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/activity_main"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

<LinearLayout
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:id="@+id/ll_for_enter_data"
    android:weightSum="3"
    android:orientation="horizontal">

    <EditText
        android:background="#ffffF1"
        android:layout_height="75dp"
        android:layout_width="0dp"
        android:id="@+id/ed_enter_data"
        android:layout_weight="2.25"/>

    <Button
        android:layout_height="75dp"
        android:layout_width="0dp"
        android:id="@+id/button_add"
        android:layout_weight="0.75"
        android:text="Add Data"/>

</LinearLayout>

<TextView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:id="@+id/tv_title"
    android:text="Content from file"
    android:textColor="#eae8c2"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="10dp"
    android:layout_below="@+id/ll_for_enter_data"
    android:textSize="18sp"/>

<TextView
    android:background="#303F9F"
    android:layout_height="100dp"
    android:layout_width="match_parent"
    android:id="@+id/tv_show_data"
    android:text="Data from file"
    android:textColor="#000000"
    android:layout_marginTop="10dp"
    android:layout_below="@+id/tv_title"
    android:textSize="16sp"/>

<Button
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:id="@+id/button_delete"
    android:text="Delete File"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"/>

</RelativeLayout>

Step 4: Write Code

The following method will allow us to check for permissions at runtime and ask the user for them:

    private void askForPermission(String permission, Integer requestCode) {
        if (ContextCompat.checkSelfPermission(MainActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
                //This is called if user has denied the permission before
                //In this case I am just asking the permission again
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
            } else {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
            }
        } else {
            //Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
        }
    }

And when granted permission we either write to the filesystem or read from it:

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED){
            switch (requestCode) {

                case 3:
                    writeFile();
                    break;
                //Read External Storage
                case 4:
                    Intent imageIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(imageIntent, 11);
                    break;
            }

            Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
        }
    }

The following method will allow us write into a File using the FileOutputStream class. In this case we are writing the text the user types in an edittext to the Filesystem:

    public void writeFile(){
        // write on SD card file data in the text box
        try {
            FileOutputStream fOut = new FileOutputStream(myFile);
            final OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
            String temp=editTextForSave.getText().toString();

            myOutWriter.append(temp);
            myOutWriter.append("\n");

            myOutWriter.close();
            fOut.close();
            Log.e("MA : ","Done writing SD");

        } catch (Exception e) {
            Log.e("catch : ",e.getMessage());
        }

    }

The following function will allow us to read from the filesystem and show in a TextView:

    public void showData(){
        try {
            FileInputStream fis = new FileInputStream(myFile);
            DataInputStream in = new DataInputStream(fis);
            BufferedReader br =  new BufferedReader(new InputStreamReader(in));
            String strLine;
            while ((strLine = br.readLine()) != null) {
                myData = myData + "\n" + strLine;
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

The following function will allow us to delete a file:

    public void deleteFile(){
        myFile.delete();
        myData = "";
        textViewForShowData.setText("File no Longer Exist.");
        Log.e("MA : ","File Deleted");
    }

Here's the full code:

MainActivity.java

import android.Manifest;
        import android.content.Intent;
        import android.content.pm.PackageManager;
        import android.os.AsyncTask;
        import android.os.Bundle;
        import android.os.Environment;
        import android.support.v4.app.ActivityCompat;
        import android.support.v4.content.ContextCompat;
        import android.support.v7.app.AppCompatActivity;
        import android.util.Log;
        import android.view.View;
        import android.widget.Button;
        import android.widget.EditText;
        import android.widget.TextView;
        import android.widget.Toast;

        import java.io.BufferedReader;
        import java.io.DataInputStream;
        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    static final Integer LOCATION = 0x1;
    static final Integer CALL = 0x2;
    static final Integer WRITE_EXST = 0x3;
    static final Integer READ_EXST = 0x4;
    static final Integer CAMERA = 0x5;
    static final Integer ACCOUNTS = 0x6;
    static final Integer GPS_SETTINGS = 0x7;
    String myData = "";

    final File myFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/TestFile.txt");

    Button buttonAdd, buttonDelete;
    EditText editTextForSave;
    TextView textViewForShowData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextForSave = (EditText) findViewById(R.id.ed_enter_data);
        textViewForShowData = (TextView) findViewById(R.id.tv_show_data);

        buttonAdd = (Button) findViewById(R.id.button_add);
        buttonDelete = (Button) findViewById(R.id.button_delete);
        buttonAdd.setOnClickListener(this);
        buttonDelete.setOnClickListener(this);
    }

    private void askForPermission(String permission, Integer requestCode) {
        if (ContextCompat.checkSelfPermission(MainActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
                //This is called if user has denied the permission before
                //In this case I am just asking the permission again
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
            } else {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
            }
        } else {
            //Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
        }
    }

    public void ask(View v){
        switch (v.getId()){

            case R.id.button_add:
                askForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,WRITE_EXST);
                new MyAsynTask().execute();

                break;
            case R.id.button_delete:
                askForPermission(Manifest.permission.READ_EXTERNAL_STORAGE,READ_EXST);
                deleteFile();
                break;

            default:
                break;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED){
            switch (requestCode) {

                case 3:
                    writeFile();
                    break;
                //Read External Storage
                case 4:
                    Intent imageIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(imageIntent, 11);
                    break;
            }

            Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onClick(View v) {
        ask(v);
    }

    public void writeFile(){
        // write on SD card file data in the text box
        try {
            // buttonAdd.setEnabled(false);

            FileOutputStream fOut = new FileOutputStream(myFile);
            final OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
            String temp=editTextForSave.getText().toString();

            myOutWriter.append(temp);
            myOutWriter.append("\n");

            myOutWriter.close();
            fOut.close();
            Log.e("MA : ","Done writing SD");

        } catch (Exception e) {
            Log.e("catch : ",e.getMessage());
        }
//        editTextForSave.setText("");
        // buttonAdd.setEnabled(true);
    }

    public void showData(){
        try {
            FileInputStream fis = new FileInputStream(myFile);
            DataInputStream in = new DataInputStream(fis);
            BufferedReader br =  new BufferedReader(new InputStreamReader(in));
            String strLine;
            while ((strLine = br.readLine()) != null) {
                myData = myData + "\n" + strLine;
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
//        textViewForShowData.setText(myData);
    }

    public void deleteFile(){
        myFile.delete();
        myData = "";
        textViewForShowData.setText("File no Longer Exist.");
        Log.e("MA : ","File Deleted");
    }

    // The definition of our task class
    private class MyAsynTask extends AsyncTask<String, Integer, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {
            writeFile();
            showData();
            return "All Done!";
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            buttonAdd.setEnabled(false);
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            textViewForShowData.setText(myData);
            editTextForSave.setText("");
            buttonAdd.setEnabled(true);
        }
    }
}

Run

Copy the code or download it in the link below, build and run.

Reference

Here are the reference links:

Number Link
1. Download Example
2. Follow code author

Example 2: How to Save a String to a File to and Read it

This example will teach you how to save a String in memory to internal storage as a File and also how to check that the file exists.

Here is the demo screenshot:

Save String to File and read it

Step 1: Create Project

Start by creating an empty Android Studio project.

Step 2: Dependencies

No external or special dependencies are needed for this project.

Step 3: Design Layout

Design a simple layout for our MainActivity with two buttons, one for saving the String into a File, the other for checking if the File exists:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:gravity="center"
    tools:context="com.acadgild.android.internalfile.MainActivity">

    <Button
        android:id="@+id/save_file"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save File" />

    <Button
        android:id="@+id/check_file"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Check File"
        android:layout_below="@id/save_file"
        android:layout_marginTop="20dp"/>

</RelativeLayout>

Step 4: Write Code

Here is how you write our String into a File using the FileOutputStream class:

                String fileName = "MyFile";
                String content = "hello world";
                FileOutputStream outputStream = null;
                try {
                    outputStream = openFileOutput(fileName, Context.MODE_PRIVATE);
                    outputStream.write(content.getBytes());
                    outputStream.close();
                    Toast.makeText(MainActivity.this, "File Saved !!", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }

And here is how we check if the File Exists:

                String path=getFilesDir().getAbsolutePath()+"/MyFile";
                File file = new File ( path );

                if ( file.exists() )
                {
                    // Toast File is exists
                    Toast.makeText(MainActivity.this, "File exist !!", Toast.LENGTH_SHORT).show();
                }
                else
                {
                    // Toast File is not exists
                    Toast.makeText(MainActivity.this, "File not exist !!", Toast.LENGTH_SHORT).show();
                }

Here is the full code:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button save_btn= (Button)findViewById(R.id.save_file);
        save_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String fileName = "MyFile";
                String content = "hello world";
                FileOutputStream outputStream = null;
                try {
                    outputStream = openFileOutput(fileName, Context.MODE_PRIVATE);
                    outputStream.write(content.getBytes());
                    outputStream.close();
                    Toast.makeText(MainActivity.this, "File Saved !!", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        Button chk_btn= (Button)findViewById(R.id.check_file);
        chk_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String path=getFilesDir().getAbsolutePath()+"/MyFile";
                File file = new File ( path );

                if ( file.exists() )
                {
                    // Toast File is exists
                    Toast.makeText(MainActivity.this, "File exist !!", Toast.LENGTH_SHORT).show();
                }
                else
                {
                    // Toast File is not exists
                    Toast.makeText(MainActivity.this, "File not exist !!", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

Run

Copy the code or download it in the link below, build and run.

Reference

Here are the reference links:

Number Link
1. Download Example
2. Follow code author