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();
- Java、Android文件IO流
- android文件与java IO
- Java IO文件流
- JAVA IO-文件流
- java 文件IO流
- Java - 文件(IO流)
- java io流读写文件
- java学习---文件IO流
- 《java----IO流---文件复制》
- Java IO流读取文件
- Java IO流读取文件
- java文件IO流复习
- Java IO流读取文件
- Java IO 流读取文件
- Java IO流文件操作
- java IO流读写文件
- Java IO流读取文件
- java IO流遍历文件
- Linux教程:10条秘诀确保Linux桌面安全性
- Android-ViewPagerAdapter显示导航页(例)
- RANSAC算法及其代码解析
- python中编码问题
- Codeforces Round #266 (Div. 2)-E. Information Graph(dfs+并查集)
- Java、Android文件IO流
- 自定义布局VerticalView(倒置流式布局)
- Hadoop Yarn 框架原理及运作机制
- leetcode---Excel Sheet Column Number
- UVa213
- 梯度下降法
- 参数绑定bind
- 菜鸟路上遇到的问题---NoClassDefFoundError
- maven启动失败问题