首先在AndroidManifest中添加读写权限:
<!-- 写外部存储-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 读外部存储-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- android 10 读写sd卡权限-->
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"
tools:ignore="ProtectedPermissions" />
public class FileWriteReadActivity extends Activity {
private static final String TAG="FileWriteReadActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_new_bd_meige);
//将内容为"test read file222" 的文本文件baa.txt存到/sdcard目录下
writeFile("test read file222","/sdcard","baa.txt");
try {
Thread.sleep(3000);
//从/sdcard目录中读baa.txt文件中的内容
String fileActivateData = getFileActivateData("/sdcard","baa.txt");
Log.e(TAG,"fileActivateData==="+fileActivateData);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 写文本文件到指定目录下
* @param content 文本内容 "test read file222"
* @param rootPath 指定要存放的目录 此示例中是/sdcard
* @param authName 文件名称 "baa.txt"
*/
public void writeFile(String content,String rootPath,String authName) {
try {
//判断实际是否有SD卡,且应用程序是否有读写SD卡的能力,有则返回true
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
String path = rootPath;
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
File targetFile = new File(path +"/"+authName);
Log.e("FilePackUtil", "targetFile.getPath()===" + targetFile.getPath());
// 方式一:使用RandomAccessFile是在原有的文件基础之上追加内容,
// RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
// raf.seek(targetFile.length()); //光标移到原始文件最后,再执行写入
// raf.write(content.getBytes());
// raf.close();
// 方式二:而使用outputstream则是要先清空内容再写入
FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
byte[] buffer=content.getBytes();
fileOutputStream.write(buffer, 0, buffer.length);// 开始写入数据到这个文件。
fileOutputStream.flush();
fileOutputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读取指定目录下指定文件的内容
* @param fileAbsolutePaht 指定的目录 /sdcard
* @param txtName 指定的文件 "baa.txt"
* @return
*/
private String getFileActivateData(String fileAbsolutePaht,String txtName) {
ArrayList<String> result = new ArrayList<String>();
File file = new File(fileAbsolutePaht);
File[] files = file.listFiles();
if (files != null) {
//筛选指定目录下是否有指定文件
for (int i = 0; i < files.length; ++i) {
if (!files[i].isDirectory()) {
String fileName = files[i].getName();
if (fileName.equals(txtName)) {
result.add(fileName);
}
}
}
//若有指定文件,则读文件内容
if (result.size() != 0) {
return readTxtFile(fileAbsolutePaht + "/"+ result.get(0));
}
}
return "";
}
/**
* 读文件中的内容
* @param strFilePath /sdcard/baa.txt
* @return
*/
public String readTxtFile(String strFilePath) {
String path = strFilePath;
Log.e("FilePackUtil", "strfilePath===" + path);
String content = ""; //文件内容字符串
//打开文件
File file = new File(path);
//如果path是传递过来的参数,可以做一个非目录的判断
if (file.isDirectory()) {
Log.d("TestFile", "The FaceAuthFile doesn't not exist.");
} else {
try {
InputStream instream = new FileInputStream(file);
if (instream != null) {
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line;
//分行读取
while ((line = buffreader.readLine()) != null) {
content += line;
}
instream.close();
}
} catch (java.io.FileNotFoundException e) {
Log.d("TestFile", "The File doesn't not exist.");
} catch (IOException e) {
Log.d("TestFile", e.getMessage());
}
}
return content;
}
}
踩坑提醒:
若报错/sdcard/....:open failed:EACCES(Permission denied) 则表示没有权限向sdcard中写文件
解决方法:
1、更换文件存储目录为外部存储。如使用getExternalCacheDir(),存放路径一般是/storage/sdcard/Android/data/<应用包名>/cache目录。 文章来源:https://www.toymoban.com/news/detail-684962.html
2、将应用打包成系统应用。在AndroidManifest.xml 中manifest节点下添加 android:sharedUserId="android.uid.system",还需要系统签名。文章来源地址https://www.toymoban.com/news/detail-684962.html
到了这里,关于Android如何写文件到sdcard目录或指定目录,读指定目录中指定文件的内容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!