缓冲流
概述
缓冲流也叫高效流,是对四个基本流的增强。原理:在创建流对象的时候,会自动创建一个内置的默认大小的缓冲区数组,通过缓冲区读写。减少IO次数,提高效率。
字节缓冲流
缓冲字节输入流(BufferedInputStream)
构造方法: public BufferedInputStream(InputStream in);//传入普通的字节流
缓冲字节输出流(BufferedOutputStream)
构造方法: public BufferedInputStream(OutputStream out);//传入普通的字节流
public static void main(String[] args) throws IOException {
//创建普通流
FileOutputStream ff = new FileOutputStream("1.txt");
FileInputStream ff2 = new FileInputStream("copy.txt");
//创建缓冲流
BufferedInputStream fos = new BufferedInputStream(ff2);
BufferedOutputStream fis = new BufferedOutputStream(ff);
//复制文件
long start = System.currentTimeMillis();
int b = 0;
while (((b = fos.read()) != -1)) {
fis.write(b);
}
long end = System.currentTimeMillis();
fis.close();
fos.close();
}
}
缓冲字符输入流(BufferedReader)
构造方法: public BufferedReader(Reader r);//传入普通的字符流
特有方法:
public String readLine();//一次读取一行内容
缓冲字符输出流(BufferedWriter)
构造方法:public BufferedWriter(Writer w);//传入普通的字符流
特有方法:
public void newLine();//写一个换行符
public static void main(String[] args) throws IOException {
//缓冲字符输出流【写流】
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("1.txt"));
for (int i = 0; i < 5; i++) {
bufferedWriter.write("java");
//写入一个换符
bufferedWriter.newLine();
}
//释放资源
bufferedWriter.close();
//缓冲字符输入流【读流】
BufferedReader bufferedReader = new BufferedReader(new FileReader("2.txt"));
//读一行,如果读完,【输出null】
//String s = bufferedReader.readLine();
//System.out.println(s);
//bufferedReader.close();
//一次读取一行的循环代码
String j = "";//用来保存读取的数据【读取、赋值、判断是否=null】
while ((j = bufferedReader.readLine()) != null) {
System.out.println(j);
}
//释放资源
bufferedReader.close();
}
}
注意:
一次读取一行的标准循环,不会因为有一行为“null"字符串或者有一行为空字符串内容而停止。
只有读取到文件的末尾,没有内容返回值null才能停止!!
案例:文本排序
读取文本中的内容,按照序号排序,排序后从头到尾写入新的文件中。
public static void main(String[] args) throws IOException {
//读取文件内容
ArrayList<String> list = new ArrayList<>();
BufferedReader bufferedReader = new BufferedReader(new FileReader("csb.txt"));
String a = "";
while (((a = bufferedReader.readLine()) != null)) {
list.add(a);
}
bufferedReader.close();
//对集合排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//按照字符串的首字母排序
return o1.charAt(0) - o2.charAt(0);
}
});
//写入到新的文件
BufferedWriter writer = new BufferedWriter(new FileWriter("new.txt"));
for (String s : list) {
writer.write(s);//一次写一行
writer.newLine();//换行
}
writer.close();
}
}
转换流
读文件时指定编码,写文件时指定编码。
编码和解码
按照某种规则,将字符存储存储到计算机中——编码(‘a’——>97)
把字节转换成字符——解码(97——>‘a’)
字符编码和字符集
字符集:一个系统支持的所有字符对的集合。
字符编码
字符编码:字符与二进制一一对应的一套规则。
字符集
常见的字符集和字符编码【重点】
ASCII字符集——ASCII编码,规定ASCII字符集中所有的字符都占1个字节。
GBK字符集——GBK编码,规定所有的中文字符,都占2个字节。
Unicode字符集——Utf—8编码,规定所有的中文字符都占3个字节。
ISO——8859-1字符集,是西欧国家的字符集。
编码引出的问题
Idea默认使用UTF—8编码,windows默认使用GBK编码。
解决方案:
1、把文件的编码改成UTF—8和idea一致。
2、把IDEA的编码改成GBK和文件的一致。
使用转换输入流InputStreamReader解决读取中文的问题
转换输入流 InputStreamReader extends Reader
构造方法:
public InputStreamReader(InputStream in ,String charsetName);//使用指定编码格式读文件
public InputStreamReader(InputStream in);//使用工具默认编码读文件
使用转换输出流OutputStreamWriter写不同编码的中文的问题
转换输出流 OutputStreamWriter extends Writer
构造方法:
public OutputStreamWriter(OutputStream in ,String charsetName);//使用指定编码写文件
public OutputStreamWriter(OutputStream in);//使用工具默认编码写文件
案例:转换文件编码
将GBK编码文本文件,转为utf-8编码的文本文件
分析:
1、先把GBK编码的文本文件用GBK编码读出来
2、再把数据写入到utf-8文件中
public static void main(String[] args) throws IOException {
//使用GBK编码读GBK文件
InputStreamReader inputStreamReader1 = new InputStreamReader(new FileInputStream("gbk.txt"), "GBK");
//用utf-8编码写文件
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("iop.txt"), "UTF-8");
//写入
int a = 0;
while (((a = inputStreamReader1.read()) != -1)) {
outputStreamWriter.write(a);
}
outputStreamWriter.close();
inputStreamReader1.close();
}
}
序列化流
序列化流:写对象的流
ObjectOutputStream的介绍和使用
构造方法:
public ObjectOutputStream(OutputStream out);//需要接受一个普通字节输出流
想要序列化,必须实现java.io.Serializable接口,该接口中没有方法,一般称为标记接口。
反序列化流:读取对象的流
ObjectInputStream的介绍和使用
构造方法:
public ObjectInputStream(InputStream in);//需要接受一个普通字节输入流
关于序列化异常的问题
ClassNouFoundException:出现原因是因为,序列化之后,反序列化之前,删除了用来序列化的那个类。
InvalidClassException:序列化之后,反序列化之前,修改了用来序列化的那个类。
实际上序列化流判断类是否有效通过,SerialVersionUID来识别的。
如果需要序列化多个对象怎么操作?
序列化流,只适合序列化一个对象,但是我们可以把多个对象保存到一个集合中,序列化集合对象即可。
打印流
PrintStream流中重写了各种类型的方法。
PrintStream常用方法
构造方法:
public PrintStream(String path);
public PrintStream(File file);
public PrintStream(OutputStream out);
成员方法:
public void print();
public void println();
装饰者模式
概述
不同的设计模式解决不同的问题,装饰者模式则是在不改变原类,不使用继承的继承,对原类的功能的一个扩展。
装饰者模式4个步骤
1、装饰类和被装饰类(原类)必须实现一致的接口
2、在装饰类中必须传入被装饰类的引用
3、在装饰类中对需要扩展的方法进行扩展
4、在装饰者类中对不需要扩展的方法,调用与原类中同名的方法
commons-io工具包
概述
commons-io是简化IO操作的工具包
使用
将commons-io工具包中解压后的文件commons-io.jar复制到我们创建的lib文件夹下。
常用API介绍
commons-io.IOUtils中的方法:
1、copy();接受两个流,输入流与输出流———复制文件(2GB以下的文件)。
2、copyLarge();接受两个流,输入流与输出流———复制文件(2GB以上的文件)。
3、FileUtils.copyFileToDirectory();将某文件复制到文件夹里面。
4、FileUtils.copyDirectoryToDirectory();将某文件夹复制到某文件夹。
小结
java中的流相关的问题暂时解决啦。要开始web阶段啦!!!