Reading & Writing File in Android Android by Rajesh Kumar Sahanee - April 13, 2016September 12, 20170 Post Views: 6,382 Hello Friends, Today I am writing this post to share that how to read and write file to external storage in Android. In the latest version of android Marshmallow, we cannot read and write file directly in external storage even we declare permission in manifest file but in lower version we can use external storage after declaring permission in manifest file. To access external storage in Marshmallow we need to take permission at runtime. From the code below we can read & write file to external storage on any android version. AndroidManifest.xml AndroidManifest.xml XHTML <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zatackcoder.storefile"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 12345678910111213141516171819202122 <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zatackcoder.storefile"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> activity_main.xml activity_main.xml XHTML <?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" tools:context="com.zatackcoder.storefile.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="File Content and Information will be shown here" android:id="@+id/data_and_info" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Write" android:id="@+id/writeB" android:layout_alignParentBottom="true" android:layout_toLeftOf="@+id/readB" android:layout_toStartOf="@+id/readB" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Read" android:id="@+id/readB" android:layout_marginRight="74dp" android:layout_marginEnd="74dp" android:layout_alignTop="@+id/writeB" android:layout_alignRight="@+id/data_and_info" android:layout_alignEnd="@+id/data_and_info" /> </RelativeLayout> 12345678910111213141516171819202122232425262728293031323334353637 <?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" tools:context="com.zatackcoder.storefile.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="File Content and Information will be shown here" android:id="@+id/data_and_info" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Write" android:id="@+id/writeB" android:layout_alignParentBottom="true" android:layout_toLeftOf="@+id/readB" android:layout_toStartOf="@+id/readB" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Read" android:id="@+id/readB" android:layout_marginRight="74dp" android:layout_marginEnd="74dp" android:layout_alignTop="@+id/writeB" android:layout_alignRight="@+id/data_and_info" android:layout_alignEnd="@+id/data_and_info" /></RelativeLayout> MainActivity.java MainActivity.java package com.zatackcoder.storefile; import android.Manifest; import android.content.pm.PackageManager; import android.os.Build; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback{ TextView dataAndInfoTV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dataAndInfoTV = (TextView)findViewById(R.id.data_and_info); Button writeB = (Button)findViewById(R.id.writeB); Button readB = (Button)findViewById(R.id.readB); writeB.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { if(isExternalStorageWritable()){ Toast.makeText(getApplicationContext(), "External Storage Writable", Toast.LENGTH_LONG).show(); File file = new File(Environment.getExternalStorageDirectory(),"storagefile"); if(!file.exists()){ if(file.mkdir()){ Toast.makeText(getApplicationContext(), "Directory created", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "Directory already available", Toast.LENGTH_LONG).show(); dataAndInfoTV.setText(file.getAbsolutePath()); } File newfile = new File(file.getAbsolutePath()+"/testfile.txt"); try { if(!newfile.exists()){ newfile.createNewFile(); } FileOutputStream outputStream = new FileOutputStream(newfile); outputStream.write("This is file content".getBytes()); outputStream.close(); Toast.makeText(getApplicationContext(), "File created", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error while creating File", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "External Storage Not Writable", Toast.LENGTH_LONG).show(); } } }); readB.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/storagefile/testfile.txt"); if(file != null && file.exists()){ try { FileInputStream fis = new FileInputStream(file); String str = ""; int data; while((data = fis.read()) != -1){ str += (char)data; } dataAndInfoTV.setText(str); } catch (FileNotFoundException e) { Toast.makeText(getApplicationContext(), "File not found", Toast.LENGTH_LONG).show(); } catch (IOException e) { Toast.makeText(getApplicationContext(), "Error while reading File", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "File does not exists", Toast.LENGTH_LONG).show(); } } }); //Getting permission for Marshmallow or higher version at runtime getExternalStorageWritePermission(); } /* Checks if external storage is available for read and write */ private boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } private void getExternalStorageWritePermission(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ // Should we show an explanation? if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { } else { //Requesting permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } } } } @Override //Override from ActivityCompat.OnRequestPermissionsResultCallback Interface public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission granted } return; } } } } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 package com.zatackcoder.storefile; import android.Manifest;import android.content.pm.PackageManager;import android.os.Build;import android.os.Environment;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback{ TextView dataAndInfoTV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dataAndInfoTV = (TextView)findViewById(R.id.data_and_info); Button writeB = (Button)findViewById(R.id.writeB); Button readB = (Button)findViewById(R.id.readB); writeB.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { if(isExternalStorageWritable()){ Toast.makeText(getApplicationContext(), "External Storage Writable", Toast.LENGTH_LONG).show(); File file = new File(Environment.getExternalStorageDirectory(),"storagefile"); if(!file.exists()){ if(file.mkdir()){ Toast.makeText(getApplicationContext(), "Directory created", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "Directory already available", Toast.LENGTH_LONG).show(); dataAndInfoTV.setText(file.getAbsolutePath()); } File newfile = new File(file.getAbsolutePath()+"/testfile.txt"); try { if(!newfile.exists()){ newfile.createNewFile(); } FileOutputStream outputStream = new FileOutputStream(newfile); outputStream.write("This is file content".getBytes()); outputStream.close(); Toast.makeText(getApplicationContext(), "File created", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error while creating File", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "External Storage Not Writable", Toast.LENGTH_LONG).show(); } } }); readB.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/storagefile/testfile.txt"); if(file != null && file.exists()){ try { FileInputStream fis = new FileInputStream(file); String str = ""; int data; while((data = fis.read()) != -1){ str += (char)data; } dataAndInfoTV.setText(str); } catch (FileNotFoundException e) { Toast.makeText(getApplicationContext(), "File not found", Toast.LENGTH_LONG).show(); } catch (IOException e) { Toast.makeText(getApplicationContext(), "Error while reading File", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getApplicationContext(), "File does not exists", Toast.LENGTH_LONG).show(); } } }); //Getting permission for Marshmallow or higher version at runtime getExternalStorageWritePermission(); } /* Checks if external storage is available for read and write */ private boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } private void getExternalStorageWritePermission(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ // Should we show an explanation? if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { } else { //Requesting permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } } } } @Override //Override from ActivityCompat.OnRequestPermissionsResultCallback Interface public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission granted } return; } } }} Screen Shot Download Android Studio Project StoreFile 1 file(s) 6.87 MB Download Thanks