在安卓项目中有时会涉及到文件内容的读取,比如说离线数据,在没有网络的时候,需要保存好一些数据,在有网络的时候在上传,除了使用数据库外,也可以使用文件的读写。闲话少说,直接代码:
activity:
package dayin.com.myapplication.io; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import dayin.com.myapplication.R; /** * Created by lake * 此类的功能:读写文件的测试 */ public class IOActivity extends AppCompatActivity implements View.OnClickListener { private Button ceshi; private Button ceshi1; final String sFileName = "lake.txt";//创建的文件名字 private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE" }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ioativity); verifyStoragePermissions(this); ceshi = findViewById(R.id.ceshi); ceshi1 = findViewById(R.id.ceshi1); ceshi.setOnClickListener(this); ceshi1.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.ceshi: WriteFile("lake45"); break; case R.id.ceshi1: Log.e("ioceshi", "onClick: " + isFileExist()); Log.e("ioceshi11", "onClick: " + ReadMsg()); break; } } //测试io流 public void WriteFile(String info) { File root = Environment.getExternalStorageDirectory(); File file = new File(root, sFileName); try { FileWriter Writer = new FileWriter(file); Writer.write(info); Writer.flush(); Writer.close();//记得要关闭,否则你懂得 } catch (IOException e) { e.printStackTrace(); } } public String ReadMsg() { String content = null; File root = Environment.getExternalStorageDirectory(); File file = new File(root, sFileName); try { if (file.exists()) { FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = 0; while ((len = fis.read(buffer)) != -1) { baos.write(buffer, 0, len); } byte[] data = baos.toByteArray(); baos.close(); fis.close();//记得关闭 content = new String(data); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return content; } //判断是否存在读取的文件 public boolean isFileExist() { File file = new File(Environment.getExternalStorageDirectory() + "/" + sFileName); return file.exists(); } //删除文件 public boolean delFile() { File file = new File(Environment.getExternalStorageDirectory() + "/" + sFileName); return file.delete(); } //6.0以后动态获取读取sd卡的权限,这里只是简单的写一下,用的时候可以在优化。 public static void verifyStoragePermissions(Activity activity) { try { //检测是否有写的权限 int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE"); if (permission != PackageManager.PERMISSION_GRANTED) { // 没有写的权限,去申请写的权限,会弹出对话框 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE); } } catch (Exception e) { e.printStackTrace(); } } }
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"> <Button android:id="@+id/ceshi" android:text="写入数据" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="30dp" /> <Button android:text="读取数据" android:id="@+id/ceshi1" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="30dp" /> </LinearLayout>
权限: <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 读取扩展卡 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />