本文目錄
Android文件讀寫概述
在Androi中文件讀寫一共有以下目錄
- raw目錄
- asserts目錄
- data/data/包名
- sdcard目錄
其中raw
下的和asserts
下的文件可以以資源文件的形式讀取,這些目錄的數據只能讀取,不能寫入,兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。
data/data/包名
和sdcard
目錄文件可讀可寫。其中data/data/包名
目錄不需要申請權限,sdcard
目錄需要申請權限
讀取raw目錄文件
Android工程默認是沒有raw
文件夾的在讀文件前我們先把raw
文件夾以及文件建好
- 點中工程的
res
目錄 右鍵New
->Directory
-> 彈窗中輸入raw
- 點中剛剛新建的
raw
目錄 右鍵New
->File
-> 彈窗中輸入test.txt
- 點開剛剛新建的
test.txt
文件 ,往裏面輸入hello world
讀數據方法
InputStream inputStream = null;
Reader reader = null;
BufferedReader bufferedReader = null;
try {
//得到資源中的Raw數據流
inputStream = getResources().openRawResource(R.raw.test);
reader = new InputStreamReader(inputStream);// 字符流
bufferedReader = new BufferedReader(reader); //緩衝流
StringBuilder result = new StringBuilder();
String temp;
while ((temp = bufferedReader.readLine()) != null) {
result.append(temp);
}
Log.i("MainActivity", "result:" + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
從打印的結果中我們可以看出數據讀取成功
讀取assets目錄文件
Android工程默認是沒有assets
文件夾的,在讀文件前我們先把assets
文件夾以及文件建好
- 點中工程 右鍵
New
->Folder
->Assets Folder
- 點中剛剛新建的
Assets Folde
目錄 右鍵New
->File
-> 彈窗中輸入test.txt
- 點開剛剛新建的
test.txt
文件 ,往裏面輸入hello world
讀去assets
文件中的數據方法
InputStream inputStream = null;
Reader reader = null;
BufferedReader bufferedReader = null;
try {
//得到資源中的asset數據流
inputStream = getResources().getAssets().open("test.txt");
reader = new InputStreamReader(inputStream);// 字符流
bufferedReader = new BufferedReader(reader); //緩衝流
StringBuilder result = new StringBuilder();
String temp;
while ((temp = bufferedReader.readLine()) != null) {
result.append(temp);
}
Log.i("MainActivity", "result:" + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
從打印的結果中我們可以看出數據讀取成功
data/data/(包名) 目錄文件讀寫
將數據以普通文件的形式保存在 /data/data/包名
中,該方法不需要申請權限。
存放在數據區(/data/data/包名
)的文件可以使用openFileOutput
和openFileInput
進行操作。
也可以直接指定文件/data/data/包名
路徑讀寫。
該目錄存放文件類型規則如下:
路徑 | 功能 |
---|---|
data/data/包名/shared_prefs |
存放SharedPreferences數據 |
data/data/包名/databases |
存放數據庫數據 |
data/data/包名/files |
存放普通數據 |
data/data/包名/cache |
存放緩存文件 |
寫數據
方法1:openFileOutput
FileOutputStream fileOutputStream = null;
try {
String text = "hello world";
fileOutputStream = openFileOutput("test.txt", MODE_PRIVATE);
fileOutputStream.write(text.getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
openFileOutput
方法參數詳解
@Override
public FileOutputStream openFileOutput(String name, int mode)
throws FileNotFoundException {
}
- name 存儲文件名字
- mode 存儲方式 其值的含義如下
參數值 | 參數含義 |
---|---|
Context.MODE_PRIVATE | 指定該文件數據只能被本應用程序讀、寫 |
Context.MODE_WORLD_READABLE | 指定該文件數據能被其他應用程序讀,但不能寫 |
Context.MODE_WORLD_WRITEABLE | 指定該文件數據能被其他應用程序讀 |
Context.MODE_APPEND | 該模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件; |
方法2:傳統方法讀寫
String text = "hello world";
File file1=new File("/data/data/com.lucashu.file/","test.txt");
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file1);
fileOutputStream.write(text.getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
執行以後我們可以看到添加了一個文件
讀數據
方法1:openFileInput
FileInputStream fileInputStream = null;
Reader reader = null;
BufferedReader bufferedReader = null;
try {
fileInputStream = openFileInput("test.txt");
reader = new InputStreamReader(fileInputStream);// 字符流
bufferedReader = new BufferedReader(reader); //緩衝流
StringBuilder result = new StringBuilder();
String temp;
while ((temp = bufferedReader.readLine()) != null) {
result.append(temp);
}
Log.i("MainActivity", "result:" + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法2:openFileInput
InputStream inputStream = null;
Reader reader = null;
BufferedReader bufferedReader = null;
try {
File file=new File("/data/data/com.lucashu.file/", "test.txt");
inputStream = new FileInputStream(file);
reader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(reader);
StringBuilder result = new StringBuilder();
String temp;
while ((temp = bufferedReader.readLine()) != null) {
result.append(temp);
}
Log.i("MainActivity", "result:" + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
從打印的結果中我們可以看出數據讀取成功
我們也可以用一下方法來獲取改文件的路徑
getFilesDir();// data/data/包名/files 目錄
getFilesDir().getParent(),;// data/data/包名/ 目錄
sdcard文件讀寫
sdcard
讀寫的數據將數據保存在 /mnt/sdcard
目錄,該目錄讀寫需要先申請動態權限,動態權限申請方法如下
申請動態權限
首先需要在manifest.xml
中添加權限
<!--文件讀寫權限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
如果是AndroidQ
或者更高的版本還需要在manifest.xml
文件中的application
節點下加入
android:requestLegacyExternalStorage="true"
申請動態權限方法:
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"};
private void checkPermission() {
//檢查權限(NEED_PERMISSION)是否被授權 PackageManager.PERMISSION_GRANTED表示同意授權
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission
.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this, "請開通相關權限,否則無法正常使用本應用!", Toast.LENGTH_SHORT).show();
}
//申請權限
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
} else {
Toast.makeText(this, "已授權成功!", Toast.LENGTH_SHORT).show();
writeSdcard();
}
}
Activity中動態權限的回調方法
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_EXTERNAL_STORAGE: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "授權成功!", Toast.LENGTH_SHORT).show();
writeSdcard();
} else {
Toast.makeText(this, "授權被拒絕!", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
寫數據
private void writeSdcard() {
String text = "hello world";
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File storage = Environment.getExternalStorageDirectory();
File tmepfile = new File(storage.getPath());
if (! tmepfile.exists()) {
tmepfile.mkdirs();
}
File file1=new File(tmepfile,"test.txt");
if (!file1.exists()){
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file1);
fileOutputStream.write(text.getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
執行以後我們可以看到添加了一個文件
讀數據
private void readSdcard() {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
InputStream inputStream = null;
Reader reader = null;
BufferedReader bufferedReader = null;
try {
File storage = Environment.getExternalStorageDirectory();
File tmepfile = new File(storage.getPath());
File file=new File(tmepfile, "test.txt");
inputStream = new FileInputStream(file);
reader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(reader);
StringBuilder result = new StringBuilder();
String temp;
while ((temp = bufferedReader.readLine()) != null) {
result.append(temp);
}
Log.i("MainActivity", "result:" + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
sdcard文件讀寫完整代碼
package com.lucashu.file;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkPermission();
}
private void writeSdcard() {
String text = "hello world";
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File storage = Environment.getExternalStorageDirectory();
File tmepfile = new File(storage.getPath());
if (! tmepfile.exists()) {
tmepfile.mkdirs();
}
File file1=new File(tmepfile,"test.txt");
if (!file1.exists()){
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file1);
fileOutputStream.write(text.getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
private void readSdcard() {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
InputStream inputStream = null;
Reader reader = null;
BufferedReader bufferedReader = null;
try {
File storage = Environment.getExternalStorageDirectory();
File tmepfile = new File(storage.getPath());
File file=new File(tmepfile, "test.txt");
inputStream = new FileInputStream(file);
reader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(reader);
StringBuilder result = new StringBuilder();
String temp;
while ((temp = bufferedReader.readLine()) != null) {
result.append(temp);
}
Log.i("MainActivity", "result:" + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"};
private void checkPermission() {
//檢查權限(NEED_PERMISSION)是否被授權 PackageManager.PERMISSION_GRANTED表示同意授權
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission
.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this, "請開通相關權限,否則無法正常使用本應用!", Toast.LENGTH_SHORT).show();
}
//申請權限
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
} else {
Toast.makeText(this, "已授權成功!", Toast.LENGTH_SHORT).show();
readSdcard();
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_EXTERNAL_STORAGE: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "授權成功!", Toast.LENGTH_SHORT).show();
readSdcard();
} else {
Toast.makeText(this, "授權被拒絕!", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
}