Android之Stream(流)的理解
Android之Stream(流)的理解
在Java中,流是一个很重要的概念,特别是在做文件操作和网络读取这一块的时候,一定会用到流相应的派生类,那么,今天我们就来一起看看在Java以及Android中流到底是怎么一回事。
定义:
流是一个相对抽象的概念,所谓流就是一个传输数据的通道,这个通道可以传输相应类型的数据。进而完成数据的传输。这个通道被实现为一个具体的对象。
分类:
输入流:从外部空间(文件、网络连接、内存块)读入字节序列的管道(对象)。
输出流:可以向外部(文件、网络连接、内存块)写入字节序列的管道(对象)。
两种最基本的抽象类:
字节类:InputStream/OutputStream
字符类:Reader/Writer
其他重要方法:
(1)available():检查可读入字节的数量,避免造成线程阻塞。
(2)close():关闭当前的流,避免造成资源流失。
(3)flush():冲刷输出流,让数据成功的保存到目标地址(文件)。
流家族的构成:
读取字节的最顶级是InputStream(输入流)和OutputStream(输出流),读取字符的是Reader(输入流)和Writer(输出流)。
字节类.png字符类.png
常用流的介绍:
(1)对文件进行操作:FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流)。
(2)对管道进行操作:PipedInputStream(字节输入流),PipedOutStream(字节输出流),PipedReader(字符输入流),PipedWriter(字符输出流)。
(3)字节/字符数组:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了一个字节或字符数组。
(4)Buffered缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。
(5)转化流:InputStreamReader:在读入数据的时候将字节转换成字。OutputStreamWriter:在写出数据的时候将字符转换成字节。
(6)数据流:DataInputStream,DataOutputStream。
因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。
(7)打印流:printStream,printWriter,一般是打印到控制台,可以进行控制打印的地方和格式,其中的 print方法不会抛出异常,可以通过checkError方法来查看异常。
(8)对象流:ObjectInputStream,ObjectOutputStream,把封装的对象直接输出,而不是一个个在转换成字符串再输出。
(9)RandomAccessFile随机访问文件
(10)ZipInputStream、ZipOutputStream读取zip文档 getNextEntry、putNextEntry 得到或创建ZipEntry对象。
具体使用:
(一) FileInputStream和FileOutputStream
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
// 文件流的使用
File fileA = new File("G:\\", "a.txt");
if (!fileA.exists()) {
fileA.createNewFile();
}
File fileB = new File("G:\\", "b.txt");
if (!fileB.exists()) {
fileB.createNewFile();
}
// 创建字节输入流
fileInputStream = new FileInputStream(fileA);
fileOutputStream = new FileOutputStream(fileB);
byte[] b = new byte[1024];
int hasRead = 0;
System.out.println(System.currentTimeMillis());
while ((hasRead = fileInputStream.read(b)) != -1) {
fileOutputStream.write(b, 0, hasRead);
}
fileOutputStream.flush();
System.out.println(System.currentTimeMillis());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
(二) FileReader和FileWriter
Reader reader = null;
Writer writer = null;
try {
File fileA = new File("G:\\", "a.txt");
if (!fileA.exists()) {
fileA.createNewFile();
}
File fileB = new File("G:\\", "b.txt");
if (!fileB.exists()) {
fileB.createNewFile();
}
reader = new FileReader(fileA);
writer = new FileWriter(fileB);
char[] temp = new char[1024];
int hasRead = 0;
System.out.println(System.currentTimeMillis());
while ((hasRead = reader.read(temp)) != -1) {
writer.write(temp, 0, hasRead);
}
writer.flush();
System.out.println(System.currentTimeMillis());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
(三) BufferedInputStream和BufferedOutputStream
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
int bufferedSize = 1024;
try {
File fileA = new File("G:\\", "a.txt");
File fileB = new File("G:\\", "c.txt");
if (!fileB.exists()) {
fileB.createNewFile();
}
fileInputStream = new FileInputStream(fileA);
fileOutputStream = new FileOutputStream(fileB);
// 创建缓存流
bufferedInputStream = new BufferedInputStream(fileInputStream, bufferedSize);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream, bufferedSize);
byte[] buffer = new byte[bufferedSize];
int hasRead = 0;
long startTime = System.currentTimeMillis();
while ((hasRead = bufferedInputStream.read(buffer)) != -1) {
bufferedOutputStream.write(buffer);
}
bufferedOutputStream.flush();
long endTime = System.currentTimeMillis();
System.out.println("copy time:" + (endTime - startTime) / 1000 + "s");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bufferedInputStream.close();
bufferedOutputStream.close();
fileInputStream.close();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
(四) BufferedReader和BufferedWriter
Reader reader = null;
Writer writer = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
File fileA = new File("G:\\", "a.txt");
File fileB = new File("G:\\", "b.txt");
if (!fileB.exists()) {
fileB.createNewFile();
}
reader = new FileReader(fileA);
writer = new FileWriter(fileB);
bufferedReader = new BufferedReader(reader, 512);
bufferedWriter = new BufferedWriter(writer, 512);
String readBuff = null;
while ((readBuff=bufferedReader.readLine())!=null){
System.out.println(readBuff);
bufferedWriter.write(readBuff);
}
bufferedWriter.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
bufferedWriter.close();
writer.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}