2012-06-08 3 views
0

Я попытался реализовать this example для записи и чтения данных из внутреннего хранилища, но когда я пытаюсь читать записанные данные из одного и того же приложения для Android, это не дает мне никакого результата. Какая может быть ошибка? Ниже приведен код, который я использовал.Передача данных с использованием внутреннего хранилища в приложении android

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){ 

    } 


} 

файл манифеста:

<?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> 

Обновленный код:

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 (линия);

} 
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(); 
      } 
     } 
    } 
} 

Спасибо!

+1

Можете ли вы поместить исключение с помощью исключения для печати? – havexz

+0

Нет сообщений об исключениях. Он работает нормально, но не показывает записанную строку («hello world!») В файл. – Grant

+0

метод write() будет писать в байтовом формате, поэтому вы не можете его прочитать с помощью обычного текстового редактора, например, блокнота @Grant – Lucifer

ответ

3

Я предлагаю вам использовать BufferedWriter и BufferedReader класс при работе с API Flie. взглянуть на следующие методы,

Запись в файл

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(); 
     } 
     } 
    } 
} 

Чтение файла

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(); 
      } 
     } 
    } 
} 
+0

Нужно ли добавлять права на чтение/запись на внешнее хранилище в файл манифеста моего приложения? – Grant

+0

конечно .. ... – Lucifer

+0

Я не могу получить результат из вашего кода. В чем причина? – Grant

2

Похоже, у вас есть проблемы в коде ниже:

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

Y ou проходят test.getBytes() и test имеет достаточный размер. Поэтому исправление заключается в чтении байтов в массиве.

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. 
} 

ПРИМЕЧАНИЕ: BufferedReader (ы) хороши для чтения/записи текстовых файлов. Если вам нужны двоичные файлы, вы можете использовать приведенную выше логику с небольшими улучшениями.

Смежные вопросы