温故而知新(六)Java基础:IO流(此文章暂时未写完)
输入流和输出流的类层次图
I/O简介
Java提供了两种类型的输入输出流:一种是面向字节的流,数据的处理以字节为基本单位;另一种是面向字符的流,用于字符数据的处理。
字节流
字节流(Byte Stream)每次读写8位二进制数,也称为二进制字节流字符流
字符流一次读写16位二进制数,并将其做一个字符而不是二进制位来处理注意:为满足字符的国际化表示,Java语言的字符编码采用的是16位的Unicode码,而普通文本文件中采用的是8位ASCⅡ码
常用I/O流
从上图可以看出,流的结构层次来说有很多。这里只介绍常用的几种。
字节流
- InputStream字节输入流
FileInputStream : 从文件中读取的输入流
BufferedInputStream : 缓存输入流
//构造方法
InputStream f = new FileInputStream("D:/aa.apk");
//或:
File f = new File("D:/aa.apk");
InputStream out = new FileInputStream(f);
常用方法:
- OutputStream字节输出流
FileOutputStream : 写入文件的输出流
BufferedOutputStream : 缓冲输出流
//构造方法
// 创建一个向指定File对象表示的文件中写入数据的文件输出流
FileOutputStream(File file)
// 创建一个向指定File对象表示的文件中写入数据的文件输出流
FileOutputStream(File file, boolean append)
// 创建一个向具有指定名称的文件中写入数据的输出文件流
FileOutputStream(String name)
// 创建一个向具有指定name的文件中写入数据的输出文件流
FileOutputStream(String name, boolean append)
常用方法:
字符流
- Reader字符输入流
InputStreamReader :(转换流)将字节转换到字符的输入流 ——> FileReader : 从文件读取的输入流
BufferedReader : 缓冲输入字符流
- Writer 字符输出流
OutputStreamWriter:(转换流)将字节转换到字符的输出流 ——> FileWriter: 输出到文件的输出流
BufferedWriter: 缓冲输出字符流
使用详解
- FileInputStream / FileOutputStream
public class Test {
public static void main(String[] args) {
try {
long timeMillis = System.currentTimeMillis();
InputStream is = new FileInputStream("D:/aa.apk");
OutputStream os = new FileOutputStream("D:/ec.apk");
/**
* 指定数组的大小,一次读取一个数组 之所以用1024,因为在计算机下的表示二进制,编译器你这些2的幂次方得数据处理特别快。
*/
/**
* 1024*1024(是1m)和 1024*1024*1024 (10m) 这样读取文件时他们的速度为什么会比4*1024慢,影响的原因是什么
* 如果是1m或更大,这样读写时相当于先读1M在写1M,这样循环速度就慢了,但是循环次数也少了。
*
*
* 数组大在内存中长度就越大,站的内存也越大,但是循环次数减少。 数组小在内存中长度就越小,占的内存小,但是循环次数变多了。
*
*
* 数组给的太大也不好,太小也不好。所以影响读写速度的关键在于设备当前的内存和cpu来决定速度的
*
*/
byte[] i = new byte[4 * 1024];// 作为一个缓冲区
int i2 = 0;
try {
while ((i2 = is.read(i)) != -1) {
System.out.print(new String(i, 0, i2) + " ");// AB CD
os.write(i, 0, i2);
}
is.close();
os.close();
long timeMillis1 = System.currentTimeMillis();
System.out.println(String.valueOf(timeMillis1 - timeMillis) + ">>>>>>>>>>>");
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}