Android学习笔记7-2
推荐新手向学习视频:B站https://www.bilibili.com/video/av38409964点我传送
7-2 File
7-2-1 Android存储概念
内部存储
外部存储
7-2-2 File 内部存储
-
FileOutputStream FileInputStream
-
activity_file.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="15dp"> <EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入内容"/> <Button android:id="@+id/btn_save" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="保存"/> <Button android:id="@+id/btn_show" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="显示"/> <TextView android:id="@+id/tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"/> </LinearLayout>
-
效果
-
FileActivity.java
package com.ylw.helloworld.datastorage; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import com.ylw.helloworld.R; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileActivity extends AppCompatActivity { private EditText mEtName; private Button mBtnSave,mBtnShow; private TextView mTvContent; private final String mFileName = "test.txt"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file); mEtName = findViewById(R.id.et_name); mBtnSave = findViewById(R.id.btn_save); mBtnShow = findViewById(R.id.btn_show); mTvContent = findViewById(R.id.tv_content); mBtnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { save(mEtName.getText().toString()); } }); mBtnShow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mTvContent.setText(read()); } }); } //用来存储数据 private void save(String content){ FileOutputStream fileOutputStream = null; try { fileOutputStream = openFileOutput(mFileName,MODE_PRIVATE); fileOutputStream.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } //如来读取数据 private String read(){ FileInputStream fileInputStream = null; try { fileInputStream = openFileInput(mFileName); byte[] buff = new byte[1024]; //每次读取1024个字节 StringBuilder sb = new StringBuilder(""); int len = 0; while( (len=fileInputStream.read(buff))>0){ //把读取到的字节进行拼接 sb.append(new String(buff,0,len)); } return sb.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (fileInputStream != null){ try{ fileInputStream.close(); } catch (IOException e){ e.printStackTrace(); } } } return null; } }
-
效果
7-2-3 File 外部储存
和上面相比更改了几行代码,xml文件是一样的
-
FileActivity.java
package com.ylw.helloworld.datastorage; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import com.ylw.helloworld.R; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileActivity extends AppCompatActivity { private EditText mEtName; private Button mBtnSave,mBtnShow; private TextView mTvContent; private final String mFileName = "test.txt"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file); mEtName = findViewById(R.id.et_name); mBtnSave = findViewById(R.id.btn_save); mBtnShow = findViewById(R.id.btn_show); mTvContent = findViewById(R.id.tv_content); mBtnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { save(mEtName.getText().toString()); } }); mBtnShow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mTvContent.setText(read()); } }); } //用来存储数据 private void save(String content){ FileOutputStream fileOutputStream = null; try { // fileOutputStream = openFileOutput(mFileName,MODE_PRIVATE);//内部存储 //在SD卡里寻找文件夹 File dir = new File(Environment.getExternalStorageDirectory(),"ylw"); if (!dir.exists()){ dir.mkdirs(); //找不到就创建,mkdirs和mkdir的区别是,前一个可以创建多个文件夹,如"ylw/a/b",可以创建这三个文件夹 } File file = new File(dir,mFileName); if (!file.exists()){ file.createNewFile(); //找不到文件就创建文件 } fileOutputStream = new FileOutputStream(file);//外部存储写到这,替换上面的一行内部存储 fileOutputStream.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } //如来读取数据 private String read(){ FileInputStream fileInputStream = null; try { // fileInputStream = openFileInput(mFileName);//内部读取 //在...的路径下,有一个名为mFileName的文件。File.separator+"ylw"相当于"/ylw" File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"ylw",mFileName); fileInputStream = new FileInputStream(file);//内部读取写到这,替换上面的一行外部读取 byte[] buff = new byte[1024]; //每次读取1024个字节 StringBuilder sb = new StringBuilder(""); int len = 0; while( (len=fileInputStream.read(buff))>0){ //把读取到的字节进行拼接 sb.append(new String(buff,0,len)); } return sb.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (fileInputStream != null){ try{ fileInputStream.close(); } catch (IOException e){ e.printStackTrace(); } } } return null; } }
-
在AndroidManifest.xml中添加向SD卡写入的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 第二个是外加SD卡权限,现在不常用了,可写可不写。 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
-
在MainActivity里onCreate方法中请求权限
//请求权限 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
-
效果图和上面一样,这里就不展示了