读/写文件到内部/外部存储android时使用什么类和方法?

Moh*_*Ali 5 android

我有谷歌很多,阅读javadoc,加上搜索不同的论坛,包括这个阅读问题,但没有找到我的问题的正确答案.下面的代码片段工作正常,但我想知道在android中读取/写入文件的确切使用的函数.可以使用OutputStream,FileOutputSteam.write()写入内部存储,其他是使用OutputStreamWriter(FileOutputSteam).write(),进一步使用BufferedWriter(OutputStreamWriter).write(),最后使用PrintWriter.write().

对于InputStream情况,是否使用InputStream,FileInputSteam.read(),InputSreamReader(FileInputStream).read(),BufferedReader(InputStreamReader)也是如此.

我想知道哪种方法最合适.请帮助我完全与此混淆.

public class MainActivity extends Activity {

private static final String TAG = MainActivity.class.getName();
private static final String FILENAME = "students.txt";
private EditText stdId;
private Button Insert;
private Button Search;
private Button Update;
private Button Delete;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final String TAG = MainActivity.class.getName(); //output: com.fyp2.testapp.MainActivity

    //value used for insert/delete/search
    stdId = (EditText) findViewById(R.id.editTxtId);

    //insert value in application sandbox file
    Insert = (Button) findViewById(R.id.btnInsert);
    Insert.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            String IdToInsert = stdId.getText().toString().trim();
            if(IdToInsert.length() > 0) {
                myInsertFunc(IdToInsert);
            }
            else {
                Toast.makeText(getApplicationContext(), "Id cannot be null!", Toast.LENGTH_SHORT).show();
                stdId.requestFocus();
            }   
        }
    });

    //search value from application sandbox file
    Search = (Button) findViewById(R.id.btnSearch);
    Search.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            String IdToSearch = stdId.getText().toString().trim();
            if(IdToSearch.length() > 0) {
                mySearchFunc(IdToSearch);
            }
            else {
                Toast.makeText(getApplicationContext(), "Id cannot be null!", Toast.LENGTH_SHORT).show();
                stdId.requestFocus();
            }
        }
    });


    //delete value from application sandbox file
    Delete = (Button) findViewById(R.id.btnDelete);
    Delete.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            String IdToDelete = stdId.getText().toString().trim();
            if(IdToDelete.length() > 0) {
                myDeleteFunc(IdToDelete);
            }
            else {
                Toast.makeText(getApplicationContext(), "Id cannot be null!", Toast.LENGTH_SHORT).show();
                stdId.requestFocus();
            }
        }
    });
}

//function to insert
private void myInsertFunc(String data) {
    //If student id already exist don't write it again -> Not handled at the moment
    //Other exceptions may not have been handled properly
    try {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(FILENAME, Context.MODE_APPEND));
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.append(data);
        bufferedWriter.newLine();

        Toast.makeText(getApplicationContext(), "Student ID: " + data + " Inserted Successfully!", Toast.LENGTH_SHORT).show();

        bufferedWriter.close();
        outputStreamWriter.close();
    }
    catch (IOException e) {
        Log.e(TAG, "File write failed: " + e.toString());
    } 
}

//function to search
private void mySearchFunc(String data) {
    //Id id not found show toast to user -> Not handled at the moment
    try {
        InputStream inputStream = openFileInput(FILENAME);

        if (inputStream != null) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String receiveString = "";
            while ((receiveString = bufferedReader.readLine()) != null) {
                if(receiveString.contains(data))
                {
                    Toast.makeText(getApplicationContext(), "Found Student ID: " + data , Toast.LENGTH_SHORT).show();
                    break;
                }
            }

            bufferedReader.close();
            inputStream.close();
        }
    }
    catch (FileNotFoundException e) {
        Log.e(TAG, "File not found: " + e.toString());
    } catch (IOException e) {
        Log.e(TAG, "Can not read file: " + e.toString());
    }
}

private void myDeleteFunc(String data) {
    /* I have found a solution to delete a specific line from the file.
     * But the problem is that it needs to scan the whole file line by line and copy the file contents that not matches the string to temp file.
     * This solution can reduce the effeciency. Consider search 20,000 records in a file.
     * Need to work around on it.
     */
}

private void myUpdateFunc(String data) {
    /* Same goes to the update process...
     * Need to scan all records and copy content in temp file and put the updated data in that file.
     * Need to work around on this issue too...
     */
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

}

wts*_*g02 0

它们都有一个目的。有最好的正确方法,因为每个作家都是有原因的。通常,如果您有多次读/写/刷新,那么任何已缓冲的内容都会更有效。

Android 和 Java 文档都会有所帮助,并且 java 文档为您提供了有关这些作者的更多描述。查看这些文档。尝试阅读更详细的javase6:

Android_FileWriter

Java_FileWriter

Android_OutputStreamWriter

Java_OutputStreamWriter

Android_BufferedWriter

Java_BufferedWriter