Java、Android文件IO流

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:

@Override
public 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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值