Reputation: 4553
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
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
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