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();