注意:本篇文章是本人阅读相关文章的总结,方便以后查阅,所有内容非原创,侵权删。
本篇文章内容来自于
1.Android基础之IO流
目录
一、File类
--1.1 File类的构造方法
--1.2 File类的创建方法
--1.3 File类的常用方法
二、IO流
1.IO流分类
2.InputStream/OutputStream(字节流基类 拷贝用这个)
3.Reader/Writer(字符流基类 只读或者只写用这个)
4.FileInputStream/FileOutputStream(文件输入输出流,一般都用这个)
5.BufferedInputStream/BufferedOutputStream(字节缓冲流,减少与硬盘的交流次数,加快速度,需要flush()才可写入)
6.IO流如何处理异常
7.FileReader/FileWriter(文件字符流)
8.BufferedReader/BufferedWriter(缓冲字符流,需要flush()才可写入)
9.InputStreamReader/OutputStreamWriter转换流(将字节流转换成字符流)
10.ByteArrayInputStream/ByteArrayOutputStream(数组字符流,可以将流写入到内存中,然后获取所有结果)
11.DataInputStream/DataOutputStream(基本数据流,可以以基本数据的形式写入和读取)
12.ObjectInputStream/ObjectOutputStream(对象操作流,可以序列化或者反序列化)
三、IO流应用
1.处理流(BufferedXXX)配合节点流(XXXInputStream和XXXWriter/Reader)
2.输入流(FileInputStream等)配合使用ByteArrayOutputStream(内存数组流),将输入流内容一次性输出
3.使用ObjectOutputStream将得到的密钥Key对象存储
一、File类
1.1 File类的构造方法
public File(String pathname)
public File(String parent, String child)
public File(File parent, String child)
public File(URI uri)
1.2 File类的创建方法
文件有无后缀都会创建
public boolean createNewFile() //创建文件,文件存在则不创建
public boolean mkdir() //创建文件夹,存在则不创建
public boolean mkdirs() //创建文件夹,父文件夹不存在也会创建
1.3 File类的常用方法
//重命名功能
//把文件重命名为指定的文件路径。如果路径相同,则改名即可;如果路径不同,则改名且将文件移动到指定目录下。
public boolean renameTo(File dest)
//删除功能
//删除文件或者文件夹(其中文件夹中不能有其他文件或文件夹)
public boolean delete()
//判断功能
public boolean isDirectory()//判断是否是目录
public boolean isFile()//判断是否是文件
public boolean exists()//判断是否存在
//获取功能
public String getAbsolutePath()//获取绝对路径
public String getPath()//获取路径 指在new File(xxx)时传的参数
public String getName()//获取文件/文件夹名
public long length()//获取长度 字节数
public long lastModified()//获取最后一次的修改时间 ms值
public String[] list()//获指定目录下的所有文件/文件夹的名称
public File[] listFiles()//获指定目录下的所有文件/文件夹
二、 IO流
IO程序书写规范:
使用前要导入IO包中的类
使用时要进行IO异常处理
使用后要释放资源
1. IO流分类
输入流/输出流(按流向分)
输入流是写入到内存 InputStream、Reader
输出流是写出到存储设备 OutputStream、Writer
字节流/字符流(按操作类型分)
字节流可操作任何数据 InputStream、OutputStream
字符流只能操作纯字符数据 Reader、Writer
什么时候用字符流?什么时候用字节流?
字符流->用于只读只写,这样就不会出现半个中文的情况
字节流->用于拷贝(如果用字符流,还要进行字节到字符到字节的转换,还会乱码)
节点流/处理流
节点流的的构造参数是物理IO节点,比如public FileInputStream(File file)
处理流的构造参数是已经存在的流(装饰设计模式),比如public BufferedOutputStream(OutputStream out)
常用节点流
常用处理流
2. InputStream/OutputStream 字节流
InputStream是字节输入流的抽象基类
//InputStream的三个重要方法
//都是将内容以字节(byte)的形式读取到输入流中。
int read()
int read(byte[] b)
int read(byte[] b , int off ,int len)
OutputStream是字节输入流的抽象基类
//OutputStream的三个重要方法
void write(byte[] b)
void write(byte[] b, int off, int len)
void write(int b)
3. Reader/Writer 字符流
Reader是字符输入流的抽象基类
//Reader的重要方法
//都是将内容以字符(char)的形式读取到输入流中。
int read()
int read(char[] b)
int read(char[] b , int off ,int len)
Writer是字符输出流的抽象基类
void write(char[] b)
void write(char[] b, int off, int len)
void write(int b)
void write(String str)
void write(String str, int off, int len)
Writer append(char c)
Writer append(CharSequence csq)
Writer append(CharSequence csq, int start, int end)
4.FileInputStream/FileOutputStream
Android-IO流之文件输入输出字节流FileInputStream/FileOutputStream
5.BufferedInputStream/BufferedOutputStream
Android-IO流之缓冲字节流BufferedInputStream/BufferedOutputStream
6.IO流如何处理异常
处理方式一:
File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, "abc.txt");
File dst = new File(dir, "dst1.text");
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis= new FileInputStream(file);
fos= new FileOutputStream(dst);
//读写步骤
...
} catch (Exception e) {
e.printStackTrace();
}finally {
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
fis = null; //手动关流
}
}
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
fos = null; //手动关流
}
}
}
处理方式二:
File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, "abc.txt");
File dst = new File(dir, "dst1.text");
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis= new FileInputStream(file);
fos= new FileOutputStream(dst);
//读写步骤
...
} catch (Exception e) {
e.printStackTrace();
}finally {
//能关一个是一个
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
7.FileReader/FileWriter
Android-IO流之文件字符流FileReader/FileWriter
8. BufferedReader/BufferedWriter
Android-IO流之缓冲字符流BufferedReader/BufferedWriter
9.InputStreamReader/OutputStreamWriter转换流(extends Reader)
Android-IO流之转换流InputStreamReader/OutputStreamWriter
10.ByteArrayInputStream/ByteArrayOutputStream
Android-IO流之数组内存字节流ByteArrayInputStream/ByteArrayOutputStream
11.DataInputStream/DataOutputStream数据流
Android-IO流之数据流DataInputStream/DataOutputStream
12.ObjectInputStream/ObjectOutputStream对象操作流
Android-IO流之对象操作流ObjectInputStream/ObjectOutputStream
三、IO流应用
1.处理流(BufferedXXX)配合节点流(XXXInputStream/OutputStream和XXXWriter/Reader)
实例:当系统提供的方法返回的是FileOutputStream时,想写入字符串,则配合使用缓存流BufferedWriter和转换流OutputStreamWriter
String data = "hello my life";
FileOutputStream fileOutputStream = openFileOutput("hello.txt", Context.MODE_PRIVATE);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
bw.write(data);
bw.close();
实例:当系统提供的方法返回是FileInputStream时,想读出字符串信息。则配合使用BufferedReader和InputStreamReader
FileInputStream fileInputStream = openFileInput("hello.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
Log.d("xl", sb.toString());
br.close();
2. 输入流(FileInputStream等)配合使用ByteArrayOutputStream(内存数组流),将输入流内容一次性输出
实例:将文件中的内容读出显示
String fileName = "sdcontent.txt";
File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, fileName);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer,0,len);
}
Log.d("xl", baos.toString());
fis.close();
3.使用ObjectOutputStream将得到的密钥Key对象存储
//生成随机秘钥
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
//序列化秘钥到磁盘上
FileOutputStream fos = new FileOutputStream(new File("heima.key"));
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(secretKey);
//从磁盘里读取秘钥
FileInputStream fis = new FileInputStream(new File("heima.key"));
ObjectInputStream ois = new ObjectInputStream(fis);
Key key = (Key) ois.readObject();