Java、Android文件IO流

来源:互联网 发布:钢结构算量用什么软件 编辑:程序博客网 时间:2024/05/17 03:14

Java IO流这个体系so庞大,目前能接触到的只有文件操作呢。。。
IO流分为两个大类,

  • 字节流
    字节流以字节为单位输入、输出、读取数据。

  • 字符流
    字符流以一个字符大小(2字节)为单位输入、输出、读取数据。以以上何种方式写入文件并不重要,以何种方式读入文件也不重要,只要在最上层加入字符解析方式,就可以得到正确的字符串。

Android 6.0(API 23)以后,
对文件的操作要动态获取权限,
对文件的操作要动态获取权限,
对文件的操作要动态获取权限,
重要的事情说三遍!!!
只在Manifest文件中申请权限已经行不通了。
这个先在前面说一下。。

一、写入文件

FileOutputStream fOutStream = null;File file = new File(filePath + fileName);Byte [] bytes = "hello world!2016".getBytes();if (!file.exists()) {    file.createNewFile();    fOutStream = new FileOutputStream(file);    fOutStream.write(bytes);    fOutStream.close();} else {    System.out.println("File Already Exists!");    return;}

说明:
1.省去了try/catch块。
2.InputeStream和OutStream的read和write方法操作的都是字节数组。

二、读文件

StringBuffer sb = new StringBuffer();String line = null;BufferedReader buffer = null;FileInputStream inputStream = new FileInputStream(filePath + fileName);buffer = new BufferedReader(new InputStreamReader(inputStream));while ((line = buffer.readLine()) != null) {    sb.append(line);}buffer.close();return sb.toString();

说明:
1.省去了try/catch块。
2.InputstreamReader,把字节流按照字符流的方式去读取,输入为字节流,输出的是字符流;
BufferedReader,按照字符、字符数组或行的方式去解析输入的字符流。

三、问题
在调试程序的时候,遇到了程序的崩溃,代码是第一段代码:

try{    if(!file.exists()){        file.createNewFile();    }else{     System.out.println("File Already Exists!");     return;    }     fOutStream = new FileOutputStream(file);    fOutStream.write(bytes);}catch{    bulabula}finally{    output.close();}

区别就在于try/catch包括了整个if else statment。思路就是当文件已经存在的时候,打印信息并return。
在运行程序的时候程序崩溃了。。。。
syso断点打了好几个,发现是因为finally太强大,以至于return都跳不过去。
由于文件已经存在,return了一部分代码,但是finally没跳过去,也就是output并不存在,所以在close的时候出现问题。

四、动态获取权限
1.检查有没有权限
2.调取获取权限的dialog
3.覆写onRequestPermissionsResult方法,用户选择后会自动调取
4.写回调函数,步骤3中onRequestPermissionsResult要调取的函数
下面是标准的写法:

代码段1:

if (ActivityCompat.checkSelfPermission(this,    Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {    // 申请WRITE_EXTERNAL_STORAGE权限    System.out.println("if statment");    ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },                    WRITE_EXTERNAL_STORAGE_REQUEST_CODE);}else {    //自己实现的方法    writeToInternalStorge();}

代码段2:

@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    //回调函数    doNext(requestCode, grantResults);    }

代码段3:

private void doNext(int requestCode, int[] grantResults) {if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {    // Permission Granted    this.writeToInternalStorge();} else {    // Permission Denied}}}

五、Demo全部代码

package com.iotest;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import android.Manifest;import android.app.Activity;import android.content.pm.PackageManager;import android.os.Bundle;import android.os.Environment;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity {    int WRITE_EXTERNAL_STORAGE_REQUEST_CODE;    int READ_EXTERNAL_STORAGE_REQUEST_CODE;    String filePath = Environment.getExternalStorageDirectory() + File.separator;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 把字符串写入文件        if (hasPermission("write")) {            writeToInternalStorge("helloWorld.txt");        } else {            // 申请WRITE_EXTERNAL_STORAGE权限            ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },                    WRITE_EXTERNAL_STORAGE_REQUEST_CODE);        }        if (hasPermission("read")) {            String content = readFromInternalStorage("helloWorld.txt");            System.out.println(content);        } else {            // 申请READ_EXTERNAL_STORAGE权限            ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_EXTERNAL_STORAGE },                    READ_EXTERNAL_STORAGE_REQUEST_CODE);        }    }    //检查是否有操作权限    public boolean hasPermission(String kind) {        boolean hasPermission = false;        if ("write".equals(kind)) {            hasPermission = ActivityCompat.checkSelfPermission(this,                    Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;        } else if ("read".equals(kind)) {            hasPermission = ActivityCompat.checkSelfPermission(this,                    Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;        }        return hasPermission;    }    public void writeToInternalStorge(String fileName) {        //System.out.println("writeToInternalStorge");        String helloWorld = "hello,World!2016";        // 1.检查并创建文件        FileOutputStream fOutStream = null;            File file = new File(filePath + fileName);            if (!file.exists()) {                try {                    file.createNewFile();                                   fOutStream = new FileOutputStream(file);                    fOutStream.write(helloWorld.getBytes());                } catch (Exception e) {                    // TODO: handle exception                }finally {                    try {                        fOutStream.close();                    } catch (IOException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }                           } else {                System.out.println("File Already Exists!");                return;            }    }    public String readFromInternalStorage(String fileName) {        //System.out.println("readFromInternalStorage");        // TODO Auto-generated method stub        StringBuffer sb = new StringBuffer();        String line = null;        BufferedReader buffer = null;        try {            FileInputStream inputStream = new FileInputStream(filePath + fileName);            buffer = new BufferedReader(new InputStreamReader(inputStream));            while ((line = buffer.readLine()) != null) {                sb.append(line);            }        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();            System.out.println(e);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();            System.out.println(e);        }finally {            try {                buffer.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        return sb.toString();    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        //System.out.println("onRequestPermissionsResult");        doNext(requestCode, grantResults);    }    private void doNext(int requestCode, int[] grantResults) {        //System.out.println("doNext");        if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                // Permission Granted                this.writeToInternalStorge("helloWorld.txt");            } else {                // Permission Denied            }        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}

// 获取当前程序路径
getApplicationContext().getFilesDir().getAbsolutePath();

0 0
原创粉丝点击