1.文件存储-File文件存储案例
1.1.案例要求
1.2参考代码
文件读取
百度安全验证
- 文件最终的保存的目录在/data/data/user/0/包/files下
(1)布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FileIODemoActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入文件名"
android:textSize="25dp"
/>
<EditText
android:id="@+id/filename"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入文件名"
android:textSize="25dp"
android:maxLines="1"
android:inputType="text"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入文件内容"
android:textSize="25dp"
/>
<EditText
android:id="@+id/filedesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入文件内容"
android:textSize="25dp"
android:maxLines="3"
android:inputType="text"
/>
<Button
android:id="@+id/btn_write"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写入"
/>
<Button
android:id="@+id/btn_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取"
/>
<EditText
android:id="@+id/fileread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="读取的的文件内容"
android:textSize="30dp"
/>
</LinearLayout>
(2)Java代码
//文件存储
public class FileIODemoActivity extends AppCompatActivity {
EditText filename,filedesc,fileread;
Button btn_write,btn_read;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_iodemo);
initView();
}
public void initView(){
filename=findViewById(R.id.filename);
filedesc=findViewById(R.id.filedesc);
fileread=findViewById(R.id.fileread);
btn_write=findViewById(R.id.btn_write);
btn_read=findViewById(R.id.btn_read);
//写入文件信息
btn_write.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
String f_name = filename.getText().toString();
//f_name.indexOf(".")==f_name.lastIndexOf(".")保证文件只有一个.
if (f_name.endsWith(".txt")&&f_name.indexOf(".")==f_name.lastIndexOf(".")){
Toast.makeText(FileIODemoActivity.this, ""+f_name, Toast.LENGTH_SHORT).show();
try {
FileOutputStream out= getApplicationContext().openFileOutput(f_name,MODE_PRIVATE+MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE);
String content=filedesc.getText().toString();
out.write(content.getBytes(StandardCharsets.UTF_8));
out.close();
} catch (FileNotFoundException e) {
Toast.makeText(FileIODemoActivity.this, "文件创建错误!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(FileIODemoActivity.this, "发生写入错误!", Toast.LENGTH_SHORT).show();
}
}
else {
Toast.makeText(FileIODemoActivity.this, "请输入以.txt为结尾的文件名", Toast.LENGTH_SHORT).show();
}
}
});
//读取文件信息
btn_read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String f_name = filename.getText().toString();
if (f_name.endsWith(".txt")&&f_name.indexOf(".")==f_name.lastIndexOf(".")){
try {
FileInputStream inputStream= openFileInput("hello.txt");
byte[] buf=new byte[inputStream.available()];
inputStream.read(buf);
fileread.setText(new String(buf));
} catch (FileNotFoundException e) {
Toast.makeText(getApplicationContext(),"文件不存在",Toast.LENGTH_SHORT);
} catch (IOException e) {
Toast.makeText(getApplicationContext(),"创建缓冲区失败!",Toast.LENGTH_SHORT);
}
}
Toast.makeText(getApplicationContext(),"请输入以.txt为结尾的文件名",Toast.LENGTH_SHORT);
}
});
}
}
(3)效果图
图1 效果图
图2 写入内容
图3 读取文件内容
2.文件存储-SD卡存储案例
2.1SD卡存储案例要求
要求:将文件及文件内容写入SD卡,并读取SD卡对应文件的内容。
注意:在android6.0及以上版本需要手动赋权限
1、在AndroidManifest.xml中添加SD权限,即:创建删除文件权限和写入数据权限。
2、模拟器上要释放应用程序的存储权限。
在设置(Setting)里-应用(Apps)—找到应用程序名-权限(permissions)-右上角
2.2SD卡读写步骤
1.========AndroidManifest中放开读写权限:创建、删除和写入的权限
<!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.========先判断SD卡是不是插入进去了,插入进去了并且可以读写
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
3.=====获取SD卡的外部目录,同时获取SD卡的路径
Environment.getExternalStorageDirectory().getCanonicalPath()+"/"+fileName
4.使用FileOutputStream,FileInputStream或者FileReader或FileWriter读写SD卡中的文件
2.3参考代码
(1)开启权限
1)AndroidManifest下开启权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2)开启存储空间读写权限。
(2)布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SDCardTestActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SD卡文件存储"
android:gravity="center"
android:textColor="@color/black"
android:textSize="30dp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入文件名"
android:textSize="25dp"
/>
<EditText
android:id="@+id/sdfilename"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入文件名"
android:textSize="25dp"
android:maxLines="1"
android:inputType="text"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入文件内容"
android:textSize="25dp"
/>
<EditText
android:id="@+id/sdfiledesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入文件内容"
android:textSize="25dp"
android:maxLines="3"
android:inputType="text"
/>
<Button
android:id="@+id/sdbtn_write"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写入"
/>
<Button
android:id="@+id/sdbtn_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取"
/>
<EditText
android:id="@+id/sdfileread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="读取的的文件内容"
android:textSize="30dp"
/>
</LinearLayout>
(3)Java代码
//SD卡的测试
public class SDCardTestActivity extends AppCompatActivity {
EditText sdfilename,sdfiledesc,sdfileread;
Button sdbtn_write,sdbtn_read;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sdcard_test);
initView();
}
public void initView(){
sdfilename=findViewById(R.id.sdfilename);
sdfiledesc=findViewById(R.id.sdfiledesc);
sdfileread=findViewById(R.id.sdfileread);
sdbtn_write=findViewById(R.id.sdbtn_write);
sdbtn_read=findViewById(R.id.sdbtn_read);
// 写入文件信息
sdbtn_write.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
String f_name = sdfilename.getText().toString();
// f_name.indexOf(".")==f_name.lastIndexOf(".")保证文件只有一个.
if (f_name.endsWith(".txt") && f_name.indexOf(".") == f_name.lastIndexOf(".")) {
Toast.makeText(getApplicationContext(), "文件格式正确!" + f_name, Toast.LENGTH_SHORT).show();
try {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File file = Environment.getExternalStorageDirectory();
//创建一个个人文件夹
File myFile = new File(file, "myFile");
if (!myFile.exists()) {
myFile.mkdir();
}
//创建要保存的文件
File mytxt = new File(myFile, f_name);
FileOutputStream out = new FileOutputStream(mytxt);
String content = sdfiledesc.getText().toString();
//写入
out.write(content.getBytes(StandardCharsets.UTF_8));
out.close();
Toast.makeText(SDCardTestActivity.this, "写入成功!", Toast.LENGTH_SHORT).show();
}
Toast.makeText(getApplicationContext(),"存储卡获取失败!",Toast.LENGTH_SHORT);
}
catch (FileNotFoundException e) {
Toast.makeText(getApplicationContext(), "文件创建错误!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "发生写入错误!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getApplicationContext(), "请输入以.txt为结尾的文件名", Toast.LENGTH_SHORT).show();
}
}
});
// 读取文件信息
sdbtn_read.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
String f_name = sdfilename.getText().toString();
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
if (f_name.endsWith(".txt") && f_name.indexOf(".") == f_name.lastIndexOf(".")) {
try {
/// storage/emulated/0
// 注意路径拼接是否正确
// File file=new
// File(Environment.getExternalStorageDirectory().getCanonicalPath()+"/myFile/"+f_name);或者是采用下面的方式
File file =
new File(
Environment.getExternalStorageDirectory().getCanonicalPath() + "/myFile",
f_name);
FileInputStream inputStream = new FileInputStream(file);
byte[] buf = new byte[inputStream.available()];
inputStream.read(buf);
sdfileread.setText(new String(buf));
Toast.makeText(SDCardTestActivity.this, "读取成功", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
Toast.makeText(getApplicationContext(), "文件不存在", Toast.LENGTH_SHORT);
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "创建缓冲区失败!", Toast.LENGTH_SHORT);
}
}
Toast.makeText(getApplicationContext(), "请输入以.txt为结尾的文件名", Toast.LENGTH_SHORT);
}
Toast.makeText(getApplicationContext(), "存储卡获取失败!", Toast.LENGTH_SHORT);
}
});
}
}
图1 启动效果图
图2 写入成功
图3 读取成功
图4 读取内容