以上这四大类流的分类,每个大的分类下都有不同的子类,每一个子类在继承了父类共性内容的基础上又都有自己特有的应用场景!
文件字节输出流的介绍与构造
FileOutStream是文件字节输出流,可以绑定文件之后以字节的方式写出数据。
也是最基本的字节输出流。
(1)public FileOutputStream(File file / String path) : 基于File对象/文件路径创建文件字节输出流(特点:文件不存在会自动创建,文件存在会自动清空内容)
以上这四大类流的分类,每个大的分类下都有不同的子类,每一个子类在继承了父类共性内容的基础上又都有自己特有的应用场景!
文件字节输出流的介绍与构造
FileOutStream是文件字节输出流,可以绑定文件之后以字节的方式写出数据。
也是最基本的字节输出流。
(1)public FileOutputStream(File file / String path) : 基于File对象/文件路径创建文件字节输出流(特点:文件不存在会自动创建,文件存在会自动清空内容)
FileOutputStream fos = new FileOutputStream(new File("chapter-09-io\\b.txt"));
(2)public FileOutputStream(File file / String path,boolean append) : 基于File对象/文件路径创建文件字节输出流(特点:文件不存在会自动创建,文件存在会基于append值追加写入)
FileOutputStream fos = new FileOutputStream(new File("chapter-09-io\\b.txt"), true);
文件字节输出流的写出数据方式
(1)public void write(int i) : 一次写一个字节数据 只能写单字节
fos.write('a');
(2)public void write(byte[] bytes) : 一次写一个字节数组到文件中
byte[] bytes = "狗腿子不得好死".getBytes();
fos.write(bytes);
(3)public void write(byte[] bytes,int off,int len) : 一次写一个字节数组的一部分到文件中,从off索引开始写len个
fos.write(bytes, 0, 9);
文件字符输入流的概述与构造
FileReader是字符输入流抽象父类Reader的常用子类。
可以以字符为基本单位进行数据读取。【解决读取文本文件不能完整读取】
(1)public FileReader(File f) : 创建文件字符输入流并绑定指定文件
FileReader fr = new FileReader(new File("chapter-10-io\\a.txt"));
(2)public FileReader(String path) : 创建文件字符输入流并绑定指定路径文件
FileReader fr2 = new FileReader("chapter-10-io\\a.txt");
文件字符输入流的读取数据的方式
public int read() : 一次读取一个字符内容返回,读取到末尾返回-1
int i;
while ((i = fr.read()) != -1) {
System.out.println((char) i); //如果读取到的是一个字符内容的int,强转为char可以看到原始内容
}
public int read(char[] chars) : 一次读取一个字符数组的数据,将读取到的有效字符数返回,读取到末尾返回-1
char[] chars = new char[1024];
int i;
while ((i = fr.read(chars)) != -1) {
//将char数组的从0索引开始转换i个内容变为字符串
System.out.println(new String(chars, 0, i));
}
文件字符输出流的概述与构造
FileWriter是字符输出流抽象父类Writer的子类。
可以以字符为基本单位进行数据写出。【解决不能字节流不能完整写出中文的问题】
(1)public FileWriter(File file) : 创建文件字符输出流并绑定指定文件
FileWriter fw = new FileWriter(new File("chapter-10-io\\b.txt"));
(1)public FileWriter(File file,boolean append) : 创建文件字符输出流并绑定指定文件(追加写入)
FileWriter fw = new FileWriter(new File("chapter-10-io\\c.txt",true));
追加写入可以不清空原有内容。
文件字符输出流的写出数据的方式
(1)public void write(int c) : 写一个字符
fw.write('a');
fw.write('0');
fw.write('我');
(2)public void write(String str) : 写一个字符串
fw.write("今天天气不错! 万里无云!");
(3)public void write(String str,int off,int len) : 写一个字符串的一部分
fw.write("今天天气不错! 万里无云!", 2, 4);
(4)public void write(char[] chars) : 写一个字符数组
char[] chars = new char[]{'出', '去', '玩'};
fw.write(chars);
(5)public void write(char[] chars,int off,int len) : 写一个字符数组的一部分
fw.write(chars, 0, 2);
缓冲流的概述与分类
缓冲流也分为字节缓冲流和字符缓冲流,每个缓冲流中都会提供一个缓冲区。
缓冲流的目的不是直接读写数据,真正读写数据的依然是字节流。缓冲流的核心功能是用于提供缓冲区,本身并不具备真正读写数据的功能。
但是有了缓冲区,就可以尽量少的调用系统底层的硬件资源,变相提高读写速度!
所以缓冲流创建出来要用于去包装(底层字节流,字符流)
字节缓冲输入流 BufferedInputStream
字节缓冲输出流 BufferedOutputStream
字符缓冲输入流 BufferedReader
字符缓冲输出流 BufferedWriter
缓冲流的构造方法
字节缓冲输入输出流的构造方法
(1)public BufferedInputStream(InputStream is) : 基于传递的字节输入流的子类对象完成包装创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("chapter-10-io\\a.txt")));
(2)public BufferedOutputStream(OutputStream os) : 基于传递的字节输出流的子类对象完成包装创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("chapter-10-io\\b.txt")));
字符缓冲输入输出流的构造方法
(1)public BufferedReader(Reader r) : 基于传递的字符输入流的子类对象进行包装创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader(new File("chapter-10-io\\出师表.txt")));
(1)public BufferedWriter(Writer w) : 基于传递的字符输出流进行包装创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("chapter-10-io\\出师表-sort.txt")));
缓冲流的读写数据方式与特有方法
字节缓冲流读写数据的方法与普通文件字节流一致,没有特有方法。
所以在使用字节缓冲流读写文件的时候直接包装好按照之前的方式使用即可。
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(targetFile);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[1024];
int i;
while ((i = bis.read(bytes)) != -1) {
bos.write(bytes, 0, i);
}
//释放资源
bis.close();
bos.close();
字符缓冲输入流读数据的方法与普通字符输入流一致,但是有特有方法。
public String readLine() : 读取一行数据返回,返回null表示为文件末尾
String line;
while ((line = br.readLine()) != null) {
strList.add(line); //将每次读取到的数据添加到集合中
}
读取的一行数据不包含最后的换行符!
字符缓冲输出流写数据的方法与普通字符输出流一致,但是有特有方法。
public void newLine() : 根据当前系统写出一个换行符for (String str : strList) {
bw.write(str);
//public void newLine() : 根据当前系统写出一个换行符
bw.newLine();
}
之后如果没有特殊情况的前提下,对于非文本文件的操作就使用字节缓冲流,对于文本文件的操作就使用字符缓冲流即可!
转换流的概述与构造
使用FileWriter/FileReader默认都是按照平台编码方式UTF-8执行的。
如果之后需要按照指定的字符集读取内容,写出内容。就可以基于转换流操作。
转换流:需要按照指定字符集对内容进行读取和写出的进行使用。
InputStreamReader的构造方法
public InputStreamReader(InputStream is,String charset) : 基于传递绑定文件的原始字节流并指定字符集的方式创建字节输入转换流
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("chapter-10-io\\d.txt")), "GBK");
如果按照默认的UTF-8解码,没有必要使用该类,使用FileReader即可。
OutputStreamWriter
public OutputStreamWriter(OutputStream os,String charset) : 基于传递绑定目标文件的字节输出流与指定字符集名称创建字符转换输出流
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File("chapter-10-io\\c.txt")), "GBK");
如果按照默认的UTF-8编码,没有必要使用该类,使用FileWriter即可。
转换流的读写数据方式
InputStreamReader和OutputStreamWriter都是Reader和Writer的子类。
没有特有方法,依然是read和write两个共性方法。
//创建字节转换输入流按照GBK的方式解码 / 创建字节转换输出流按照Big5的方式编码
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("chapter-10-io\\出师表-GBK.txt")), "GBK");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File("chapter-10-io\\出师表-Big5.txt")), "Big5");
//基于一次读写一个字符的方式拷贝
int i;
while ((i = isr.read()) != -1) {
osw.write(i);
}
isr.close();
osw.close();
打印流的概述与构造
打印流就是一个专门用于输出的流。
基于打印流输出内容方便,不需要担心换行问题,其次构造方法支持的创建方式也非常多。
有字节打印流PrintStream,字符打印流PrintWriter,但是二者没有任何的区别!
打印流的写数据方式与特点
基于特有的
public void println(任意内容); 打印内容后换行
public void print(任意内容); 打印内容后不换行
方法可以将任意内容打印后换行 / 打印后不换行。
数据流的概述与构造
数据流是字节流的一种,特点:可以在读写数据的时候声明好要写出数据的类型与要读取数据的类型。
public DataInputStream(InputStream is) : 基于传递字节输入流创建数据输入流
DataInputStream dis = new DataInputStream(new FileInputStream(new File("chapter-10-io\\f.txt")));
publiu DataOutputStream(OutputStream os) : 基于传递字节输出流创建数据字节输出流
DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File("chapter-10-io\\f.txt")));
数据流的读写数据方式与特点
DataOutputStream写数据的特点:提供写出各种类型数据的方法 writeXXX
特点:当调用writeInt方法的时候(写一个int数据到目的地) 参数类型限制为int,并且会将int类型随着数据一并写入到文件中
dos.writeInt(10);
dos.writeUTF("张二狗");
dos.writeBoolean(true);
DataInputStream读数据的特点:提供读取各种类型数据的方法 readXXX
特点:当调用readInt方法的时候(尝试从目标文件中读一个int数据) 返回值类型限制为int 如果文件夹中那么即可读取
注意事项:当时写入的时候按照什么顺序,读取的时候也要按照什么顺序,一旦顺序有误,则不保证数据读取的正确性!
int value = dis.readInt();
System.out.println("value : " + value);
String str = dis.readUTF();
System.out.println("str : " + str);
boolean flag = dis.readBoolean();
System.out.println("flag : " + flag);
序列化流的概述与构造
序列化流和反序列化流是字节流。可以将对象转换为字节序列也可以将字节序列转换为内存中的一个对象。
public ObjectOutputStream(OutputStream out) : 基于传递的字节输出流对象创建序列化流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("chapter-10-io\\obj.txt")));
public ObjectInputStream(InputStream is) : 基于传递字节输入流创建反序列化流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("chapter-10-io\\obj.txt")));
序列化流的读写数据方式
public void writeObject(Object obj) : 序列化对象
oos.writeObject(zhiZhuJing);
public Object readObject(): 反序列化对象
ZhiZhuJing zhiZhuJing = (ZhiZhuJing) ois.readObject();
序列化流的注意事项
正常的输入流,FileOutputStream、FileReader读数据的流,当读取到文件末尾的时候会返回-1或者null。
反序列化流比较特殊,正常如果文件中有字节序列尚未读取,可以反序列化对象,但是如果文件没有字节序列可以被读取,反序列化流会抛异常!
正常读取到文件末尾,抛异常才是正常操作!
解决方案:将多个要序列化的对象封装到一个集合中,将集合序列化,反序列化将集合反序列化。
IO框架的介绍与引入方式
框架就是半成品的软件,别的开发者针对于某一类问题编写了一组类/接口进行解决。
就可以将.class文件打包为一个jar包给别人使用。