文件存储

activity_main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:columnCount="2" android:rowCount="9" tools:context="com.xiesir.example15datastoragebyfile.MainActivity"> <TextView android:layout_columnSpan="2" android:layout_gravity="fill" android:text="个人信息" android:textAlignment="center" android:textSize="28sp" /> <TextView android:text="姓名" /> <EditText android:id="@+id/etName" android:layout_gravity="right" android:gravity="right" android:minWidth="180dp" android:hint="请输入姓名" /> <TextView android:text="性别" /> <Switch android:id="@+id/sSex" android:layout_gravity="center_horizontal" android:minWidth="120dp" android:showText="true" android:textOff="男" android:textOn="女" /> <TextView android:layout_gravity="center_vertical" android:text="颜值" /> <RatingBar android:id="@+id/rbBeauty" style="@style/Widget.AppCompat.RatingBar.Indicator" android:isIndicator="false" android:layout_gravity="right" android:layout_width="wrap_content" android:numStars="5" android:rating="3.5" android:stepSize="0.5" /> <TextView android:text="生日" /> <EditText android:id="@+id/etBirthday" android:layout_gravity="end" android:gravity="right" android:minWidth="180dp" android:inputType="date" android:hint="请输入出生日期" /> <TextView android:text="年薪" /> <EditText android:id="@+id/etSalary" android:layout_gravity="end" android:gravity="right" android:minWidth="180dp" android:inputType="number" android:hint="请输入年薪" /> <CheckBox android:id="@+id/cbRaw" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存在内存" /> <CheckBox android:id="@+id/cbSD" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存在外存" /> <Button android:id="@+id/btnSave" android:text="保存" android:onClick="click" /> <Button android:id="@+id/btnRead" android:layout_gravity="center_horizontal" android:text="读出" android:onClick="click" /> </GridLayout>
FileIO.java文件:
package com.xiesir.example15datastoragebyfile; import android.content.Context; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * Created by xiegly on 2016/5/22. */ public class FileIO { private Context mContext; public FileIO() { } public FileIO(Context mContext) { super(); this.mContext = mContext; } /* * 这里定义的是一个文件保存的方法,写入到文件中,所以是输出流 * */ public void save(String filename, String filecontent) throws Exception { // FileOutputStream output = mContext.openFileOutput(filename, Context.MODE_PRIVATE); // //这里我们使用私有模式,创建出来的文件只能被本应用访问,并且还会覆盖原文件 //// Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。 //// Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 //// //// MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; //// MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。 // try { // output.write(filecontent.getBytes()); //将String字符串以字节流的形式写入到输出流中 // } catch (Exception e) { // e.printStackTrace(); // } finally { // output.close(); //关闭输出流 // } // File file = new File("data/data/com.xiesir.example15datastoragebyfile/info.txt"); // getCacheDir() 等同于 "data/data/当前包名/Cache",是临时缓存文件夹 // File file = new File(mContext.getCacheDir(), filename); // getFilesDir() 等同于 "data/data/当前包名/files" File file = new File(mContext.getFilesDir(), filename); FileOutputStream fos = new FileOutputStream(file); try { fos.write(filecontent.getBytes()); } catch (Exception e) { e.printStackTrace(); } finally { fos.close(); } } /* * 这里定义的是文件读取的方法 * */ public String read(String filename) throws IOException { // FileInputStream input = mContext.openFileInput(filename); // byte[] temp = new byte[1024]; // StringBuilder sb = new StringBuilder(""); // try { // int len = 0; // //读取文件内容: // while ((len = input.read(temp)) > 0) { // sb.append(new String(temp, 0, len)); // } // } catch (Exception e) { // e.printStackTrace(); // } finally { // //关闭输入流 // input.close(); // return sb.toString(); // } // File file = new File("data/data/com.xiesir.example15datastoragebyfile/info.txt"); // getCacheDir() 等同于 "data/data/当前包名/Cache",是临时缓存文件夹 // File file = new File(mContext.getCacheDir(), filename); // getFilesDir() 等同于 "data/data/当前包名/files" File file = new File(mContext.getFilesDir(), filename); if (file.exists()) { FileInputStream fis = new FileInputStream(file); byte[] temp = new byte[1024]; StringBuilder sb = new StringBuilder(""); try { int len = 0; while ((len = fis.read(temp)) > 0) sb.append(new String(temp, 0, len)); } catch (Exception e) { e.printStackTrace(); } finally { fis.close(); return sb.toString(); } } else return ""; } }
MainActivity.java文件:
package com.xiesir.example15datastoragebyfile; import android.Manifest; import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Path; import android.os.Build; import android.os.Environment; import android.os.StatFs; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.NumberPicker; import android.widget.RatingBar; import android.widget.SeekBar; import android.widget.Switch; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.Format; import java.util.Formatter; public class MainActivity extends AppCompatActivity { final public static int EXTERNAL_STORAGE_REQ_CODE = 10; private Context mContext; private EditText etName; private EditText etBirthday; private EditText etSalary; private Switch sSex; private RatingBar rbBeauty; private CheckBox cbRaw; private CheckBox cbSD; private String io; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = getApplicationContext(); etName = (EditText) findViewById(R.id.etName); etBirthday = (EditText) findViewById(R.id.etBirthday); etSalary = (EditText) findViewById(R.id.etSalary); sSex = (Switch) findViewById(R.id.sSex); rbBeauty = (RatingBar) findViewById(R.id.rbBeauty); cbRaw = (CheckBox) findViewById(R.id.cbRaw); cbSD = (CheckBox) findViewById(R.id.cbSD); // // 获取 SD 卡剩余空间 // File SD = Environment.getExternalStorageDirectory(); // StatFs stat = new StatFs(SD.getPath()); // long blockSize = stat.getBlockSizeLong(); // long totalBlocks = stat.getBlockCountLong(); // long availableBlocks = stat.getAvailableBlocksLong(); // String availableSize = android.text.format.Formatter.formatFileSize(this, blockSize * availableBlocks); // etName.setText(availableSize); } public void click(View v) { if (cbRaw.isChecked()) { switch (v.getId()) { case R.id.btnSave: FileIO fout = new FileIO(mContext); String name = etName.getText().toString(); String birthday = etBirthday.getText().toString(); String salary = etSalary.getText().toString(); double beauty = rbBeauty.getRating(); String sex = sSex.isChecked() ? "T" : "F"; try { fout.save("myinfo.txt", name + '\n' + birthday + '\n' + salary + '\n' + beauty + '\n' + sex); Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show(); } break; case R.id.btnRead: String detail = ""; FileIO fin = new FileIO(getApplicationContext()); try { detail = fin.read("myinfo.txt"); String info[] = detail.split("\n"); etName.setText(info[0]); etBirthday.setText(info[1]); etSalary.setText(info[2]); rbBeauty.setRating(Float.parseFloat(info[3])); sSex.setChecked(info[4].equals("T")); } catch (IOException e) { e.printStackTrace(); } // Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_LONG).show(); break; } } else if (cbSD.isChecked()) { switch (v.getId()) { case R.id.btnSave: io = "Save"; break; case R.id.btnRead: io = "Read"; break; } requestPermission(); } } private void sdio() throws IOException { // Environment.MEDIA_REMOVED: SD卡不存在 // Environment.MEDIA_UNMOUNTED: SD卡存在,但是未挂载 // Environment.MEDIA_CHECKING: SD卡正在检测 // Environment.MEDIA_MOUNTED: SD卡可用 // Environment.MEDIA_MOUNTED_READ_ONLY: SD卡可用,但是只读 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // File file = new File("sdcard/myinfo.txt"); File file = new File(Environment.getExternalStorageDirectory(), "myinfo.txt"); switch (io) { case "Save": String name = etName.getText().toString(); String birthday = etBirthday.getText().toString(); String salary = etSalary.getText().toString(); double beauty = rbBeauty.getRating(); String sex = sSex.isChecked() ? "T" : "F"; FileOutputStream fos = new FileOutputStream(file); try { fos.write((name + '\n' + birthday + '\n' + salary + '\n' + beauty + '\n' + sex).getBytes()); Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show(); } finally { fos.close(); } break; case "Read": if (file.exists()) { FileInputStream fis = new FileInputStream(file); byte[] temp = new byte[1024]; StringBuilder sb = new StringBuilder(""); try { int len = 0; while ((len = fis.read(temp)) > 0) sb.append(new String(temp, 0, len)); } catch (Exception e) { e.printStackTrace(); } finally { fis.close(); } String info[] = sb.toString().split("\n"); etName.setText(info[0]); etBirthday.setText(info[1]); etSalary.setText(info[2]); rbBeauty.setRating(Float.parseFloat(info[3])); sSex.setChecked(info[4].equals("T")); } break; } } else Toast.makeText(getApplicationContext(), "SD卡不可用哦,亲。", Toast.LENGTH_SHORT).show(); } public void requestPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Build.VERSION_CODES.M == 23,即 Android 6.0 ,也即 API 23 //判断当前Activity是否已经获得了该权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toast.makeText(this, "请赋予相应的权限", Toast.LENGTH_SHORT).show(); } else { //进行权限请求 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_REQ_CODE); return; } } else try { sdio(); } catch (IOException e) { e.printStackTrace(); } } else try { sdio(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case EXTERNAL_STORAGE_REQ_CODE: { // 如果请求被拒绝,那么通常grantResults数组为空 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //申请成功,进行相应操作 try { sdio(); } catch (IOException e) { e.printStackTrace(); } } else { //申请失败,可以继续向用户解释。 Toast.makeText(getApplicationContext(), "拒绝访问外部存储器", Toast.LENGTH_SHORT).show(); } return; } } } }
参考:
浙公网安备 33010602011771号