黑马程序员 <a href="http://www.itheima.com" target="blank">java培训</a>
第二十天
1.BufferedOutputStream写出数据
API:该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统
上面的这段话说了两个事:
A.这个流它有缓冲区
B.它是一个复合流
BufferedOutputStream构造方法:
A.new BufferedOutputStream(OutputStream os)
B.new BufferedOutputStream(OutputStream os,int size)
注意:在开发中,我们一般不指定它的缓冲区大小,因为它默认的缓冲区基本够用。
public class BufferedInputStreamDemo1 { public static void main(String[] args) throws IOException { // 1.创建BufferedInputStream BufferedInputStream bis = new BufferedInputStream(new FileInputStream( "a.txt")); // 2.读操作 // 可以 read() read(byte[] b) // 2.1 一个字节一个字节读 // int code=-1; // while((code=bis.read())!=-1){ // System.out.print((char)code); // } // 2.2 一次读取多个字节 byte[] b = new byte[10]; int len = -1; while ((len = bis.read(b)) != -1) { System.out.print(new String(b, 0, len)); } // 3.关闭 bis.close(); } }
2.BufferedInputStream读取数据
这个流用法与BufferedOutputStream类似,只还过它是一个输入流。
public class BufferedOutputStreamDemo1 { public static void main(String[] args) throws IOException { // 1.创建BufferedOutputStream // FileOutputStream fos = new FileOutputStream("a.txt"); // BufferedOutputStream bos = new BufferedOutputStream(fos); // 上面代码可以简化 BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("a.txt")); // 2.写操作 // 它的写操作方法 write(int code) write(byte[] b) String s = "hello world"; bos.write(s.getBytes()); // bos.flush(); // 3.关闭 bos.close(); //close方法在执行前,会自动的进行flush // 问题:bos这个流,它包装了一个FileOutputStream,只关闭bos就可以了吗? // 当我们使用复合流(包装流),它们关闭时,会自动将底层包装的流也关闭。 } }
3.字节流四种方式复制视频并测试效率
第一种 FileInputStream FileOutputStream 一个字节一个字节操作 182619
第二种 FileInputStream FileOutputStream 一次操作多个字节 247
第三种 BufferedInputStream BufferedOutputStream 一个字节一个字节操作 71829
第四种 BufferedInputStream BufferedOutputStream 一次操作多个字节 148
4.转换流出现的原因及格式
OutputStreamWriter :它是字符到字节的桥梁
InputStreamReader:它是字节到字符的桥梁
这两个流是转换流,它们的作用:
1.可以指定字符编码,进行操作。
2.这两个流是字节与字符流的桥梁
关于转换流的构造:
InputStreamReader的构造:
- new InputStreamReader(InputStream is);包装一个字节流
- new InputStreamReader(InputStream is,String charset)包装一个字节流并指定编码表。
OutputStreamWriter的构造:
- new OutputStreamWriter(OutputStream os)
- new OutputStreamWriter(OutputStream os,String charset)
5.String类中的编码和解码问题
常见编码表
UTF-8 它是一综合编码表,包含绝大部分国家的字符
GBK GB2312 GB18030 中文
ISO8859-1 西欧编码(拉丁)
US-ASCII
BIG-5 繁体编码
6.转换流InputStreamReader的使用
BufferedInputStream BufferedOutputStream可以包装字节流,以提高读写效率。
public class InputStreamReaderDemo1 { public static void main(String[] args) throws IOException { // 1.创建流 InputStreamReader isr = new InputStreamReader(new FileInputStream( "c.txt"), "UTF-8"); // 2.读操作 char[] ch = new char[10]; int len = isr.read(ch); // 一次读取多个 // 3.关闭 isr.close(); System.out.println(new String(ch, 0, len)); } }
7.字符缓冲输出流BufferedWriter的使用
BufferedWriter BufferedReader它可以包装字符流,以提高读写效率。
BufferedWriter流,本身是字符输出流,它也是一个复合流,它不可以直接使用,必须包装一个Writer,也可以指定缓冲区,但是一般不需要,底层自带的缓冲区够用了.
构造方法:
new BufferedWriter(Writer w);
new BufferedWriter(Writer w,int size)
public class BufferedWriterDemo1 {
public static void main(String[] args) throws IOException {
// 1.创建流
// BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
// 要涉及到编码操作
FileOutputStream fos = new FileOutputStream("a.txt"); // 对a.txt文件操作的一个字节流
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8"); // 对fos进行了包装,使用的OutputStreamWriter是一个字符流
BufferedWriter bw = new BufferedWriter(osw); //对osw进行了包装,BufferedWriter它的参数需要的是字符流
// 2.写操作
bw.write("我是一个好人");
bw.flush();
// 3.关闭
bw.close();
}
}
8.字符缓冲输入流BufferedReader的使用
它是用于对Reader流进行包装的,它可以提高读取效率。
方式1:可以一个字符一个字符复制
方式2:一次操作多个字符.
//使用BufferedReader来读取a.txt文件中内容 public class BufferedReaderDemo1 { public static void main(String[] args) throws IOException { // 1.创建流 // BufferedReader br = new BufferedReader(new FileReader("a.txt")); BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream("a.txt"), "utf-8")); // 2.读操作 char[] ch = new char[10]; int len = br.read(ch); System.out.println(new String(ch, 0, len)); // 3.关闭 br.close(); } }
9.字符缓冲流的特殊功能
BufferedReader提供的特殊方法:
public String readLine();一次读取一行,如果返回null,代表读到文件末尾。
读取到的数据中不包含换行符.
BufferedWriter提供的特殊方法
public void newline();写入一个换行符.
public class BufferedReaderDemo2 { public static void main(String[] args) throws IOException { // 1.创建流 BufferedReader br = new BufferedReader(new FileReader("b.txt")); // 2.读操作 // String line = br.readLine(); // System.out.println(line); // // String line1 = br.readLine(); // System.out.println(line1); // // String line2 = br.readLine(); // System.out.println(line2); // // String line3 = br.readLine(); // System.out.println(line3); String line=null; while((line=br.readLine())!=null){ System.out.println(line); } // 3.关闭 br.close(); } }
10.IO流小结图解
11.复制文本文件的5种方式案例
第一种 FileReader FileWriter 一次读取一个字符操作
第二种 FileReader FileWriter 一次读取多个字符操作
第三种 BufferedReader BufferedWriter一次读取一个字符操作
第四种 BufferedReader BufferedWriter 一次读取多个字符操作
第五种BufferedReader BufferedWriter 一次读取一行进行操作
不有其它的:
- 使用字节流操作可不可以。
- 使用转换流操作
12.复制图片的4种方式案例
第一种 FileInputStream FileOutputStream 一次一个字节
第二种 FileInputStream FileOutputStream 一次多个字节
第三种 BufferedInputStream BufferedOutputStream 一次一个字节
第四种 BufferedInputStream BufferedOutputStream 一次多个字节
13.装饰设计模式
问题:什么是装饰设计模式,它的作用是什么?
装饰设计模式可能解决的问题是功能的增强.
我们现在学习过的技术,可以通过继承进行重写的方式来对功能增强。
继承这种方案可以实现功能增强,但是会出现体系结构越来越庞大问题。(类爆炸)
对于以上的问题,我们可以使用装饰设计模式来解决。
步骤:
- 装饰类与被装饰要实现同一个接口或继承同一个父类.
- 装饰类中要持有一个被装饰类的引用。
- 重写方法,进行功能增强.