读/写文件到内部专用存储

我将应用程序从Symbian / iPhone移植到Android,其中一部分是将一些数据保存到文件中。 我使用FileOutputStream将文件保存到私有文件夹/ data / data / package_name / files中

FileOutputStream fos = iContext.openFileOutput( IDS_LIST_FILE_NAME, Context.MODE_PRIVATE ); fos.write( data.getBytes() ); fos.close(); 

现在我正在寻找一种方法来加载它们。 我正在使用FileInputStream ,但它允许我逐字节地读取文件,这是非常低效的:

 int ch; StringBuffer fileContent = new StringBuffer(""); FileInputStream fis = iContext.openFileInput( IDS_LIST_FILE_NAME ); while( (ch = fis.read()) != -1) fileContent.append((char)ch); String data = new String(fileContent); 

所以我的问题是如何更好地阅读文件的方式?

Solutions Collecting From Web of "读/写文件到内部专用存储"

使用FileInputStream.read(byte [])可以更有效地读取。

一般来说,您不希望将任意大小的文件读入内存。

大多数parsing器将采用InputStream 。 也许你可以让我们知道你是如何使用该文件,我们可以build议更好的适合。

这里是你如何使用read()的字节缓冲区版本:

 byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) != -1) { fileContent.append(new String(buffer)); } 

这不是真正的Android特定的,但更多的Java面向。

如果您更喜欢面向行的阅读,则可以将FileInputStream包装在InputStreamReader中,然后传递给BufferedReader。 BufferedReader实例有一个readLine()方法,可以用来逐行阅读。

 InputStreamReader in = new InputStreamReader(fis); BufferedReader br = new BufferedReader(in); String data = br.readLine() 

或者,如果您使用Google Guava库 ,则可以在ByteStreams中使用便利function:

 String data = new String(ByteStreams.toByteArray(fis)); 

//来写

 String data = "Hello World"; OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(FILENAME, Context.MODE_PRIVATE)); outputStreamWriter.write(data); outputStreamWriter.close(); 

//读书

 String ret = ""; try { InputStream inputStream = openFileInput(FILENAME); if ( inputStream != null ) { InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String receiveString = ""; StringBuilder stringBuilder = new StringBuilder(); while ( (receiveString = bufferedReader.readLine()) != null ) { stringBuilder.append(receiveString); } inputStream.close(); ret = stringBuilder.toString(); } } catch (FileNotFoundException e) { Log.e(TAG, "File not found: " + e.toString()); } catch (IOException e) { Log.e(TAG, "Can not read file: " + e.toString()); } return ret; }