Grant
Grant

Reputation: 4553

Pass data using the internal storage in an android application

I tried to implement this example to write and read data from internal storage, but when I'm trying to read written data from the same Android application it does not give me any result. What can be the error?? Following is the code I have used.

public class SecondScreen extends Activity {

  String FILENAME = "hello_file";
  String string = "hello world!";



  /** Called when the activity is first created. */
@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.secondscreen);

  //Using the Internal Storage
    try{
    FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
    fos.write(string.getBytes());
    fos.close();

    }

    catch(Exception e){

    }


     TextView result;
     result = (TextView)findViewById(R.id.status);

 try{

     String test = "";
     FileInputStream fis = openFileInput("hello_file");
     fis.read(test.getBytes());
     fis.close();
     result.setText(test);

    }

    catch(Exception e){

    }


}

manifest file :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wrd.ws"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".ReadWriteDataActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

</manifest>

The updated code :

public class ReadWriteDataActivity extends Activity {
    TextView tv;
String line;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    writeFileToInternalStorage();
    readFileFromInternalStorage();
    tv = (TextView) findViewById(R.id.textView);

// tv.setText(line);

}
private void writeFileToInternalStorage() 
{
    String eol = System.getProperty("line.separator");
    BufferedWriter writer = null;
    try 
    {

         File myFile = new File("/sdcard/mysdfile.txt");
         myFile.createNewFile();



      writer = new BufferedWriter(new OutputStreamWriter(openFileOutput("myFile.txt", MODE_WORLD_WRITEABLE)));
      writer.write("This is a test1."+ eol);
      writer.write("This is a test2." + eol);
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    } 
    finally 
    {
      if (writer != null) 
      {
        try 
        {
            writer.close();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
      }
    }
}



private void readFileFromInternalStorage() 
{
    String eol = System.getProperty("line.separator");
    BufferedReader input = null;
    try 
    {
        input = new BufferedReader(new InputStreamReader(openFileInput("myFile.txt")));
        //String line;
        StringBuffer buffer = new StringBuffer();
        while ((line = input.readLine()) != null) 
        {
            buffer.append(line + eol);
        }
         tv.setText(buffer.toString().trim());
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    } 
    finally 
    {
        if (input != null) 
        {
            try 
            {
                input.close();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    }
}

Thanks!

Upvotes: 0

Views: 694

Answers (2)

havexz
havexz

Reputation: 9590

Looks like you have problem in the below code:

String test = "";
FileInputStream fis = openFileInput("hello_file");
fis.read(test.getBytes());

You are passing test.getBytes() and test is of in-sufficient size. So the fix is to read bytes in an array.

byte[] allBytes = new byte[100];
int indexInAllBytes = 0;
int bytesRead = 0;
FileInputStream fis = openFileInput("hello_file");

while(bytesRead != -1) {
  bytesRead = fis.read(allBytes, indexInAllBytes, allBytes.length);

  indexInAllBytes+=bytesRead;

  if(indexInAllBytes >= allBytes.length) {
     // We are exceeding the buffer size. Need bigger bytes array
     break;
  }
  // Also you can convert into string using StringBuilder.
}

NOTE: BufferedReader(s) are good for reading/writing text files. If you want binary files then you can use the above logic with slight improvements.

Upvotes: 2

Lucifer
Lucifer

Reputation: 29672

I would like to suggest you to use BufferedWriter and BufferedReader class while dealing with Flie API. have a look at following methods,

Writing in File

private void writeFileToInternalStorage() 
{
    String eol = System.getProperty("line.separator");
    BufferedWriter writer = null;
    try 
    {
      writer = new BufferedWriter(new OutputStreamWriter(openFileOutput("myfile", MODE_WORLD_WRITEABLE)));
      writer.write("This is a test1." + eol);
      writer.write("This is a test2." + eol);
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    } 
    finally 
    {
      if (writer != null) 
      {
        try 
        {
            writer.close();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
      }
    }
}

Reading File

private void readFileFromInternalStorage() 
{
    String eol = System.getProperty("line.separator");
    BufferedReader input = null;
    try 
    {
        input = new BufferedReader(new InputStreamReader(openFileInput("myfile")));
        String line;
        StringBuffer buffer = new StringBuffer();
        while ((line = input.readLine()) != null) 
        {
            buffer.append(line + eol);
        }
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    } 
    finally 
    {
        if (input != null) 
        {
            try 
            {
                input.close();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    }
}

Upvotes: 3

Related Questions