一、存储空间
对Andriod来说,存储空间分为内部存储空间和外部存储空间。
外部存储空间也就是常说的SD卡,可以分为私有存储空间和公共存储空间。
内部存储空间和外部存储空间的私有存储空间,都是每个APP独有的,不允许其他APP访问。
公共存储空间则是所有APP都可以访问,空间也更大,可以用于存储一些大的音频文件。
那么很自然地可以得出,当APP卸载后,内部存储空间和外部存储空间的私有存储空间的文件都被清空了,但公共存储空间的文件不会被删除。
二、在Andriod中存储文本文件
在这三个空间存储,需要获得不同的路径:
//外部存储私有空间 dir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString(); //外部存储公共空间 dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString(); //内部存储空间 dir = getFilesDir().toString();
其中读写外部存储公共空间时,需要修改APP权限:
完整代码:
package com.example.study06;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Environment;
import android.util.Log;import com.example.study06.util.FileUtil;import java.io.File;
import java.io.IOException;public class FileWriteActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_file_write);writeFile();//readFile();}protected void writeFile(){String text = "text for inner";String path = null;String fileName = System.currentTimeMillis() + ".txt";String dir = null;//外部存储私有空间dir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();//外部存储公共空间dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();//内部存储空间dir = getFilesDir().toString();path = dir + File.separator + fileName;FileUtil.saveText(path,text);Log.d("test", path);}private void readFile() {String path = "/storage/emulated/0/Android/data/com.example.study06/files/Download/1685064570930.txt";String text = null;try {text = FileUtil.readText(path);} catch (IOException e) {throw new RuntimeException(e);}Log.d("output ", text);}}
读写工具类:
package com.example.study06.util;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class FileUtil {public static void saveText(String path, String text){BufferedWriter writer = null;try {writer = new BufferedWriter(new FileWriter(path));writer.write(text);} catch (IOException e) {throw new RuntimeException(e);}finally {if(writer!=null){try {writer.close();} catch (IOException e) {e.printStackTrace();}}}}public static String readText(String path) throws IOException {BufferedReader reader = null;StringBuilder text = new StringBuilder();try {reader = new BufferedReader(new FileReader(path));String line = null;while((line=reader.readLine())!=null){text.append(line);}} catch (FileNotFoundException e) {throw new RuntimeException(e);}finally {if(reader!=null){try{reader.close();}catch (IOException e){e.printStackTrace();}}}return text.toString();}}
结果:在对应路径可以看到文件
三、外部存储空间储存图片
和之前读写文本一样,在工具类中用文件的输入输出Stream流来编写读写函数:
public static void saveImage(String path, Bitmap bm){FileOutputStream out = null;try {out = new FileOutputStream(path);bm.compress(Bitmap.CompressFormat.PNG, 90, out);} catch (FileNotFoundException e) {throw new RuntimeException(e);}finally {if(out!=null){try {out.close();} catch (IOException e) {throw new RuntimeException(e);}}}}public static Bitmap readImage(String path){FileInputStream in = null;Bitmap bt = null;try {in = new FileInputStream(path);bt = BitmapFactory.decodeStream(in);} catch (FileNotFoundException e) {throw new RuntimeException(e);}finally {if(in!=null){try {in.close();} catch (IOException e) {throw new RuntimeException(e);}}}return bt;}
然后使用:
package com.example.study06;import static android.util.Log.d;
import static android.webkit.ConsoleMessage.MessageLevel.LOG;import androidx.appcompat.app.AppCompatActivity;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;import com.example.study06.util.FileUtil;import java.io.File;public class ImageWriteActivity extends AppCompatActivity implements View.OnClickListener {private Button btn_save;private Button btn_read;private ImageView iv;private String path;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_write);btn_save = findViewById(R.id.btn_save);btn_read = findViewById(R.id.btn_read);iv = findViewById(R.id.iv);btn_save.setOnClickListener(this);btn_read.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch(view.getId()){case R.id.btn_save:String fileName = System.currentTimeMillis() + ".png";path = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + File.separator + fileName;Bitmap bt = BitmapFactory.decodeResource(getResources(), R.drawable.img);FileUtil.saveImage(path, bt);Log.d("test ", path);break;case R.id.btn_read://method 1//Bitmap bt_r = FileUtil.readImage(path);//iv.setImageBitmap(bt_r);//method 2//Bitmap bt_r = BitmapFactory.decodeFile(path);//iv.setImageBitmap(bt_r);//method 3iv.setImageURI(Uri.parse(path));break;}}
}