IO流常用类的总结
主要对常用的相关IO进行总结,如果哪里不懂仔细查看API。
可以从三个方面去看待IO流。
第一个从处理数据的类型去看可分为:字节流,字符流,转换流。
第二是从流向去看分为:输出和输入流
第三个是从是不是操作的节点分为:节点流和处理流(装饰流)
我们主要从第三个方面去分析。所谓的节点流就是:直接可以从或向一个特定的地方(如磁盘、内存、设备等)读写数据。处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。为了方便和提高性能。可以理解给节点流穿衣服。
坐稳开车!
我大概画了一个思维导图,粉红色的是常用的节点流,黄色的是常用的处理流。接下来我们将一一分析如下的流。
一、节点流。
1.InputStream
读取字节流
构造方法:InputStream()
主要方法:int read() 从输入流中读取数据的下一个字节。返回 0
到 255
范围内的 int
字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1
。
2.OutputStream
写出字节流
构造方法:OutputStream()
主要方法:
void write(int b) 将指定的字节写入此输出流
void write(byte[] b) 将 b.length
个字节从指定的 byte 数组写入此输出流。
void write(byte[] b,int off,int len) 将指定 byte 数组中从偏移量 off
开始的 len
个字节写入此输出流。
void close() 关闭此流并释放与此流相关的系统资源。注意的是不是代码直接去和操作系统打交道,而是有java虚拟机通知操作系统去关闭。
void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
3.FileInputStream
构造方法:
主要方法:
int read() 从此流中读取一个数据字节。
int read(byte[] b) 从此流中将b.length个字节的数据读入到一个byte数组中
int read(byte[] b,int off,int len) 从off开始将len个字节读入到byte数组中
void close()
4.FileOutputStream
void write(int b) void write(byte[] b) void write(byte[] b,int off,int len) void close() void flush()
5.ByteArrayInputStream
ByteArrayInputStream内部包含了以缓冲红区,该缓冲区包含从流中读取字节。内部计数器跟踪下一个字节。
注意: ByteArrayInputStream不用像FileInputStream一样通过操作系统去读取,而是同在内存中的,他直接是由垃圾回收机制管控的,所以不用释放。这个内存可以是电脑上的,也可以是服务器上的。
主要方法:继承InputStream
6.ByteArrayOutStream
主要方法:继承OutputStream
byte[] toString()获取流内容。默认使用平台使用的字符集,将字节解码为字符串
byte[] toByteArray()获取到字节内容
注意: 1.ByteArrayInputStream不用像FileInputStream一样通过操作系统去读取,而是同在内存中的,他直接是由垃圾回收机制管控的,所以不用释放。这个内存可以是电脑上的,也可以是服务器上的。
2.构造方法里面不用自己创建源
3.要获取流中的内容通过tobyteArray()和toString()去获取。
7.Reader
用于读取字符流的抽象类。
.
主要方法:和InputStream差不多。
8.Writer
写入字符流的抽象类。
主要方法:和OutputStream类似
9.FileReader
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
10.FileWriter
用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
写一个例子来看看如何使用字节流,其他的思想类似。
package cn.liu.io2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 1、创建源(nnn.txt相对路径是在study02下)
* 2、选择流
* 3、操作
* 4、释放
* @author Administrator
*
*/
public class IOTset02 {
public static void main(String[] args) {
//1、创建源
File src = new File("nnn.txt");
//2、选择流
InputStream is =null;
try
{
is = new FileInputStream(src);
//3、操作(读取)
int len;
while((len = is.read())!=-1) {
System.out.println((char)len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//4、释放资源
try {
if(is!=null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
二、处理流(装饰流)
装饰流也都大同小异。
以BufferedInputStream和BufferedOutputStream为例
字节缓冲流就是利用装饰器来对节点流进行装饰。在内部提供一个缓冲区。对字节流的缓冲,提高操作的性能。缓冲区默认 8k。
装饰流必须借助节点流去实现,装饰流只是为了便利或提高性能。就相当于给节点流穿上了一件衣服。
package cn.liu.io3;
import java.io.BufferedInputStream;
/**
* 用装饰器装饰过的字节缓冲流
* @author Administrator
*
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class BufferTest {
public static void main(String[] args) {
//1.创建流
File src = new File("nnn.txt");
//InputStream is = null;
BufferedInputStream is = null;
try {
//2、选择流
//is = new FileInputStream(src);
//a = new BufferedInputStream(is);
is = new BufferedInputStream(new FileInputStream(src));
//操作(分段读取)
byte[] flush = new byte[1024*1];//缓冲字符数组 1k
int len = -1;//接受长度
while((len=is.read(flush))!=-1) {//len是得到了字节长度
//解码:
String aa = new String(flush,0,len);
System.out.println(aa);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//释放资源
try {
if(is!=null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
IO流只要将节点流的原理搞清楚,装饰流也会很快掌握。
IO流一切都是输入和输出。灵活应用。