IO流主要用于硬板、内存、键盘等处理设备上得数据操作
一.IO流分类
java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同角度对其分类:
1.按数据流的方向不同分为:输入流和输出流
2.按处理数据的单位不同分为:字节流和字符流
3.按功能不同分为:节点流和处理流
区别:
字符流和字节流的主要区别:
1.读取的字节数:在读取数据的时候,字节流每次只读取一个字节,读到一个字节就返回一个字节;
而字符流一次读取一个字符(中文对应的字节数,在ASCII码表中是2个,而在UTF-8码表中是3个)。每读到一个字符,就先去查指定的编码表,将查到的字符返回。
2.处理的数据类型:字节流可以处理所有类型数据(如:图片,MP3,AVI视频文件)
而字符流只能处理字符数据。
结论:只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
节点流和处理流的主要区别:
节点流:可以从或向一个特定的数据源(节点)读写数据。(如文件内存)
处理流:“连接”在一个已存在的流(节点流或处理流)之上,能够为程序提供更为强大的读写功能。
二、IO流的四大抽象类:
java.io包中所有流类型都分别继承自以下四种抽象流类型:
三、InputStream
继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit)。
InputStream的基本方法
//读取一个字节,返回一个整数(0~255)。 //结束:返回-1,表示已到输入流的结尾。 public abstract int read() throws IOException //阻塞式 //读取一系列字节,存在byte数组中。返回实际读取的字节数。 //结束:返回-1,表示已到输入流的结尾。 public int read(byte[] buffer) throws IOException //阻塞式 //1.尝试读取len个字节,并存储到byte数组中(设 k 为实际读取的字节数,这些字节将存储在 b[off] 到 b[off+k-1]);以整数形式返回实际读取的字节数。 //结束:返回-1,表示已到输入流的结尾 public int read(byte[] b, int off, int len) throws IOException //阻塞式 //2.关闭流并释放与该流关联的所有系统资源 public void close() throws IOException //3.跳过n个字节不读,返回实际跳过的字节数 public long skip(long n) throws IOException //4. public int available() throws IOException //5.标记当前位置, //readlimit - 在标记位置失效前可以读取字节的最大限制。 public void mark(int readlimit) //6.将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。 public void reset() throws IOException
四、OutputStream
继承自OutputStream的流都是用于向程序中输出数据,且数据的单位为字节(8bit)。
OutputStream的基本方法
//向输出流中写入一个字节数据,该字节数据为参数b的低8位 public abstract void write(int b) throws IOException //将一个字节数组中的数据写入输出流 public void write(byte[] b) throws IOException //1.将byte 数组中从偏移量 off 开始的 len 个字节写入此输出流 public void write(byte[] b, int off, int len) throws IOException //2.关闭此输出流并释放与此流有关的所有系统资源 public void close() throws IOException //3.刷新此输出流并强制写出所有缓冲的输出字节 public void flush() throws IOException
----输出流构造函数第二个参数置true:追加(在已有文件后进行输入)。
----此类流会抛出FileNotFoundException需要对其进行显示捕捉
五、Reader
继承自Reader的流都是用于向程序输入数据,且数据的单位为字符(16bit)
Reader的基本方法
//读取一个字符,返回一个整数(0~255)。 //结束:返回-1,表示已到输入流的结尾。 public abstract int read() throws IOException //阻塞式 //读取一系列字符,存在char数组中。返回实际读取的字符数。 //结束:返回-1,表示已到输入流的结尾。 public int read(char[] buffer) throws IOException //阻塞式 //1.尝试读取len个字符,并存储到char数组中(设 k 为实际读取的字符数,这些字符将存储在 b[off] 到 b[off+k-1]);以整数形式返回实际读取的字符数。 //结束:返回-1,表示已到输入流的结尾 public int read(char[] b, int off, int len) throws IOException //阻塞式 //2.关闭流并释放与该流关联的所有系统资源 public void close() throws IOException //3.跳过n个字符不读,返回实际跳过的字符数 public long skip(long n) throws IOException
六、Writer
继承自Writer的流都是输出数据,且数据的单位为字符(16bit)
Writer的基本方法
//向输出流中写入一个字符数据,该字符数据为参数c的低8位 public abstract void write(int c) throws IOException //将一个字符数组中的数据写入输出流 public void write(char[] cbuf) throws IOException //1.将char 数组中从偏移量 off 开始的 len 个字符写入此输出流 public void write(char[] cbuf, int off, int len) throws IOException //2.写入字符串 public void write(String str) throws IOException //写入字符串的某一部分。 public void write(String str, int off, int len) throws IOException //3.关闭此输出流并释放与此流有关的所有系统资源 public void close() throws IOException //4.刷新此输出流并强制写出所有缓冲的输出字符 public void flush() throws IOException
void write(int c) throws IOException 向输出流写入一个字符数据
void write(String str) throws IOException将一个字符串中的字符写入到输出流
void write(String str,int offset,int length)
将一个字符串从offset开始的length个字符写入到输出流
void flush() throws IOException
将输出流中缓冲的数据全部写出到目的地
七、节点流类型
八、处理流
九、缓冲流
缓冲流“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能。提高了读写效率,同时增加了一些新的方法。
四种缓冲流:
1.BufferedReader
构造方法:
// 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in) // 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in, int sz)
强大的方法:readLine() //一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,当读到末尾时,返回null。 跨平台
2.BufferedWriter
构造方法:
// 创建一个使用默认大小输出缓冲区的缓冲字符输出流。 BufferedWriter(Writer out) // 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。 BufferedWriter(Writer out, int sz)
强大的方法: newLine() //写入一个行分隔符。跨平台
3.BufferedInputStream
构造方法:
//创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。 BufferedInputStream(InputStream in) //创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。 BufferedInputStream(InputStream in, int size)
4.BufferedOutputStream
构造方法:
// 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。 BufferedOutputStream(OutputStream out) //创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。 BufferedOutputStream(OutputStream out, int size)
十一、转换流:主要作用将字节流转换成字符流。用处较大!
转换流在构造时可以指定其编码集合
构造函数:
InputStreamReader(InputStream); //通过该构造函数初始化,使用的是本系统默认的编码表GBK。 InputStreamWriter(InputStream,String charSet); //通过该构造函数初始化,可以指定编码表。
OutputStreamWriter(OutputStream); //通过该构造函数初始化,使用的是本系统默认的编码表GBK。 OutputStreamwriter(OutputStream,String charSet); //通过该构造函数初始化,可以指定编码表。
例:OutputStreamWriter osw = new OutputStreamWriter (new FileOutputStream(文件路径);
方法例:osw.getEncoding(); 获得流的编码方式
十二、数据流与字节数组流:
通常只要存取基本数据类型的数据如long,boolean,就需要通过DataStream进行包装。
数据流是字节流
DataInputStream需要和InputStream套接
DataOutputStream需要和OutputStream套接
DataInputStream方法:readBoolean() readInt() read……()……
DataOutputStream方法与DataInputStream方法对应
int readInt();//一次读取四个字节,并将其转成int值 writeInt(int);//一次写入四个字节,注意和write(int)不同,write(int)只将该整数的最低一个8位写入,剩余三个8为丢失 short readShort(); writeShort(short); String readUTF();//按照utf-8修改版读取字符,注意,它只能读writeUTF()写入的字符数据。 writeUTF(String);//按照utf-8修改版将字符数据进行存储,只能通过readUTF读取。
readUTF();//网络传输常用方法 读一个Unicode字符串
//此构造函数等于已可以往一个字节数组里输入内容 ByteArrayOutputStream baos = new ByteArrayOutputStream (); //此方法为获取一个字节数组方法返回字节数组 baos.toByteArray(); //此方法获取字节数组占了多少字节 new ByteArrayInputStream(一个字节数组)。available()
1ByteArrayOutputStream baos = 2 new ByteArrayOutputStream(); 3 DataOutputStream dos = 4 new DataOutputStream(baos); 5 try { 6 dos.writeDouble(Math.random()); 7 dos.writeBoolean(true); 8 ByteArrayInputStream bais = 9 new ByteArrayInputStream(baos.toByteArray()); 10 System.out.println(bais.available()); 11 DataInputStream dis = new DataInputStream(bais); 12 System.out.println(dis.readDouble()); 13 System.out.println(dis.readBoolean()); 14 dos.close(); dis.close(); 15 } catch (IOException e) { 16 e.printStackTrace(); 17 } |
十二、Print流
PrintStream:字节打印流,它的构造函数可以接受三种数据类型的参数:
1.字符串路径。 2.File对象 3.OutputStream
System.out对应的类型就是PrintStream;
PrintWriter和PrintStream的输出操作不会抛出异常
PrintWriter和PrintStream有自动flush功能
----System.setOut(接收OutputStream类):用于设置系统默认输出流
十二、Object流
序列化,用直接将Object写入或读出
transient关键字为不序列化此成员变量
需要序列化的类必须实现Serializable接口
主要方法:writeObject(Object); readObject();
读出为Object类型需要强转数据类型
1 import java.io.*;
2
3 public class TestObjectIO {
4 public static void main(String args[]) throws Exception {
5 T t = new T();
6 t.k = 8;
7 FileOutputStream fos = new FileOutputStrea("d:/share/java/io/testobjectio.dat");
8 ObjectOutputStream oos = new ObjectOutputStream(fos);
9 oos.writeObject(t);
10 oos.flush();
11 oos.close();
12
13 FileInputStream fis = new FileInputStream("d:/share/java/io/testobjectio.dat");
14 ObjectInputStream ois = new ObjectInputStream(fis);
15 T tReaded = (T)ois.readObject();
16 System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);
17
18 }
19 }
20
21 class T
22 implements Serializable
23 {
24 int i = 10;
25 int j = 9;
26 double d = 2.3;
27 transient int k = 15;
28 }