零、复习昨日

File:通过路径代表一个文件或目录
方法:创建新,查找类

一、作业

给定路径删除文件夹

public static void main(String[] args){deletDir(new File("F:\\qf"));}// 删除文件夹public static void deletDir(File file){File[] files = file.listFiles();for (File file1 : files) {if (file1.isFile()){file1.delete();} else {deletDir(file1);}}file.delete();}

二、缓冲字节流

拷贝一首歌

   public static void main(String[] args) throws Exception {// 拷贝歌曲,耗时 183372毫秒long begin = System.currentTimeMillis( );FileInputStream fis = new FileInputStream("E:\\Angel.mp3");FileOutputStream fos = new FileOutputStream("E:\\Angel2.mp3");int b = -1;while((b = fis.read()) != -1) {fos.write(b);}fis.close();fos.close();long end = System.currentTimeMillis( );System.out.println("拷贝歌曲,耗时 " + (end - begin) + "毫秒" );}

很慢很慢~~

原因:一次读写一个字节,但是歌曲10M的有1100万多个字节


一次读多个写多个,就是 缓冲区字节流

缓冲区字节输入流 BufferedInputStream(没有空参);缓冲区字节输出流 BufferedOutputStream。
之所以快,是因为他们==内部有一个缓冲区数组(长度8192)==,一次读取或者写出的时候通过数组完成,即一次读取或者写出多个
使用缓冲区输入/输出流,需要给构造方法传入对应输入/输出流(高效流)

   public static void main(String[] args) throws Exception {// 拷贝歌曲,耗时 183372毫秒long begin = System.currentTimeMillis( );FileInputStream fis = new FileInputStream("E:\\Angel.mp3");FileOutputStream fos = new FileOutputStream("E:\\Angel2.mp3");// 创建缓冲区输入.输出流BufferedInputStream bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(fos);int b = -1;while((b = bis.read()) != -1) {bos.write(b);}bis.close();bos.close();// 内部是数组传输数据,最后一次输出数据时,数组不一定装满// 如果执行close,会关流的同时会强制刷新剩余数据输出// 也可以执行flush手动刷新// bos.flush();long end = System.currentTimeMillis( );System.out.println("拷贝歌曲,耗时 " + (end - begin) + "毫秒" );}

三、字符流

字节流适合读取二进制文件,读取字符数据可能会乱码!建议读取字符,采取字符流!

字符流有两个抽象父类
Reader (字符输入流)
Writer (字符输出流)

一般使用其子类
FileReader
FileWriter

3.1 FileReader

构造方法
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。

方法
int read() 读取单个字符。 读完末尾返回-1
int read(char[] cbuf) 将字符读入数组。
void close() 关闭该流并释放与之关联的所有资源。

public static void main(String[] args) throws Exception {FileReader fileReader = new FileReader("F:\\qf\\a.txt");int ch = -1;while ((ch = fileReader.read()) != -1){System.out.print((char) ch);}fileReader.close();
}
FileReader fileReader = new FileReader("F:\\qf\\a.txt");char[] chars = new char[4];fileReader.read(chars);System.out.println(chars);fileReader.close();

3.2 FileWriter

FileWriter在创建时,内部默认构造一个缓冲数组,数组长度为 1kb = 1024字节

构造方法
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

append指定成true,在原文件后面追加,指定成false,覆盖原文件
如果不知道,默认就是false

方法
void close() 关闭此流,但要先刷新它。
void flush() 刷新该流的缓冲。
void write(char[] cbuf) 写入字符数组。
void write(int c) 写入单个字符。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分。

FileWriter fileWriter = new FileWriter("F:\\qf\\a.txt");
// 写字符
fileWriter.write('j');
// 写字符串
fileWriter.write("java");// 写字符数组
char[] chars = {'我','爱','祖','国'};
fileWriter.write(chars);// 写字符串数组
String str = "我爱祖国!";
fileWriter.write(str,2,3);fileWriter.flush();

3.3 练习:复制小说

FileReader fileReader = null;
FileWriter fileWriter = null;
try{fileReader = new FileReader("F:\\java素材\\Java书籍\\《雪中悍刀行》.txt");fileWriter = new FileWriter("F:\\qf\\《雪中悍刀行》.txt");int ch = -1;while ((ch = fileReader.read()) != -1){fileWriter.write((char)ch);}
} catch (IOException e){e.printStackTrace();
} finally {try {fileReader.close();fileWriter.close();} catch (IOException e){e.printStackTrace();}
}

3.4 练习

使用字符流把a文件中的数据转换后写到b文件中

要求:1) 大写转换为小写 2)小写转换为大写 3)删除数字

四、缓冲字符流

BufferedReader BufferedWriter
缓冲区字符输入输出流,内部在创建对象是会构建一个缓冲区数组(长度8192)

BufferedReader

构造方法
BufferedReader (Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流

方法
int read() 读取单个字符。
String readLine() 读取一个文本行。
void close() 关闭该流并释放与之关联的所有资源。

BufferedWriter

构造方法
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。

方法
void close() 关闭此流,但要先刷新它。
void flush() 刷新该流的缓冲。
void newLine() 写入一个行分隔符。
void write(int c) 写入单个字符。
void write(String s) 写入字符串

    public static void main(String[] args) {long begin = System.currentTimeMillis( );FileReader fr = null;FileWriter fw = null;BufferedReader br = null;BufferedWriter bw = null;try {fr = new FileReader("E:\\《雪中悍刀行》.txt");fw = new FileWriter("E:\\血刀.txt");br = new BufferedReader(fr);bw = new BufferedWriter(fw);int ch  = -1;// 一次读一个放入缓冲区// while((ch = br.read()) != -1) {//     bw.write(ch);// 写一个字符// }String line = null;// 一次读取一行,读取到换行终止符结束并返回,但是不包含终止符while((line = br.readLine()) != null) {bw.write(line); // 写一行字符串// 写出一个换行符// bw.write("\r\n");bw.newLine();}} catch (Exception e) {e.printStackTrace( );} finally {try {br.close();bw.close();} catch (IOException e) {e.printStackTrace( );}}long end = System.currentTimeMillis( );System.out.println("拷贝小说,耗时 " + (end - begin) + "毫秒" );}

练习

读取一个文本,按行倒着输出,即读取的第一行输出在最后一行,读取的第二行,输出在倒数第二行.

思路: 不能读完直接输出了,而是读一行,向集合中存一行.读取完毕后,倒着遍历集合即可

FileReader fr = new FileReader("F:\\qf\\a.txt");FileWriter fw = new FileWriter("F:\\qf\\b.txt");BufferedReader br = new BufferedReader(fr);BufferedWriter bw = new BufferedWriter(fw);ArrayList<String> list = new ArrayList<>();String line = null;while ((line = br.readLine()) != null){list.add(line);}for (int i = list.size() - 1; i >= 0; i--) {bw.write(list.get(i));bw.newLine();}br.close();bw.close();

将上面歌词内容存放到本地磁盘D根目录,文件命名为 word.txt
选择合适的IO流读取word.txt文件的内容
统计每个单词出现的次数(单词忽略大小写)
如果出现组合单词如 you're按一个单词处理
将统计的结果存储到本地磁盘D根目录下的wordcount.txt文件
【该题使用缓冲字符流更好】
wordcout.txt每行数据个数如下
you --> 9次
my --> 9次
I --> 9次

FileReader fr = new FileReader("F:/qf\\word.txt");
FileWriter fw = new FileWriter("F:/qf\\wordCount.txt");
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);HashMap<String,Integer> map = new HashMap<>();
String line = null;
while ((line = br.readLine()) != null){String[] str = line.split(" ");for (String s : str) {String s1 = s.toLowerCase();if (map.containsKey(s1)){Integer count = map.get(s1);count++;map.put(s1,count);} else {map.put(s1,1);}}
}// 输出
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
for (Map.Entry<String, Integer> entry : entries) {bw.write(entry.getKey()+"--->"+entry.getValue());bw.newLine();
}br.close();
bw.close();

五、总结

画思维导图 https://www.processon.com/view/link/6360e893f346fb33540a61c1

六、匿名内部类

思考一个问题?
假如有一个接口,现在让你创建一个接口的实现类对象,该怎么做?
换句话,有个方法,参数列表是接口,应该如何调用?

解决:
先创建一个类,实现接口,重写方法
创建对象

现在有个更简单的写法,可以不用创建类就可以实现出一个接口的实现类

// 接口
public interface USB {void run();
}
public static void main(String[] args) {// 有一个接口,现在让你创建一个接口的实现类对象// new USBImpl();// test(new USBImpl());// 就相当于是创建了USB接口的实现类,并且重写了方法// 这就是匿名内部类test(new USB(){@Overridepublic void run() {System.out.println("匿名实现.." );}});// 这样是将匿名内部类,取了名字叫usbUSB usb = new USB(){@Overridepublic void run() {System.out.println("匿名实现.." );}};test(usb);
}public static void test(USB usb) {usb.run();
}

总结: 匿名内部类就是简化了创建子类对象的过程.

实战

使用匿名内部类完成. 创建TreeSet时指定比较器.

Java 字节区/字符区缓冲流相关推荐

  1. Java-IO流(File操作,字符输入输出流,字节输入输出流,缓冲流,对象流)

    File对象 File的介绍 File 类 就是当前系统中 文件或者文件夹的抽象表示      通俗的讲  就是 使用File对象 来操作我们电脑系统中的文件或者文件夹 学习File类 其实就是学习 ...

  2. File类,字节字符输入输出流,缓冲流,标准流,对象序列化流

    一,File文件类 1 File类创建功能:    public boolean createNewFiLe():当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件       如果文件 ...

  3. 【26天高效学习Java编程】Day22:Java中的属性集-缓冲流-转换流-序列化流详解

    本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址:26天高效学习Java编程 相关软件地址:软件地址 所有代码地址:代码地址 如果 ...

  4. Java进阶(十一)缓冲流

    十一.缓冲流 需要学会什么? 缓冲流:之前学习的流都属于基础流,性能不是最好的,缓冲流读写数据的性能更好. 转换流:使用字符流读取中文不会乱码原始是什么?如果读取的文件编码与代码编码不一致怎么办? 序 ...

  5. Java 字节和字符流的读写+Buffered

    一个关于IO流的导图 IO流字节的读写,实现复制 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

  6. java字节流转字符流的步骤_字节流-java入门基础笔记-51CTO博客

    [14]字节流 一.字节流 1.什么是字节流是IO流中的一种, 可以用来读写字节数据. 2.字节流和字符流的区别计算机中存储任何数据都是以字节的形式, 所以字节流可以读写任意类型的数据. 在读写的数据 ...

  7. java 字节转字符_Java 字符串 之 字符,字节,字符串的转换

    /** 题目: String 类的相关操作 1. 字符与字符串转换操作 2. 字节与字符串转换操作 3. 判断操作 4. 替换操作 5. 字符串的截取 6. 字符串的拆分 7. 字符串的查找 8. 字 ...

  8. fileoutputstream 字节乱码_吃透Java IO:字节流、字符流、缓冲流

    前言 有人曾问fastjson的作者(阿里技术专家高铁):"你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?" 高铁答道:"因为热爱本身 ...

  9. Java IO流之缓冲流:字节缓冲流BufferedOutputStream BufferedInputStream、字符缓冲流BufferedWriter、BufferedReader

    文章目录 缓冲流 1.字节缓冲流 构造方法 2.字符缓冲流 构造方法 练习:文章段落排序 缓冲流 缓冲流在基础的字节流和字符流上做功能的增强,能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储 ...

最新文章

  1. 重磅《美国机器智能国家战略》
  2. python stringstrip方法详解_Python 的技巧和方法你了解多少?
  3. java中对象的序列化和反序列化
  4. POJ3026 bfs+prim
  5. Android中网络请求创建单个线程池的方法
  6. 如何提高web应用的响应速度(性能)
  7. 谷歌死磕亚马逊,CES 舞台上的语音入口争夺战
  8. 自动控制原理实验验优报告(资料区附matlab代码)
  9. Android四大组件详解
  10. Matlab 根号的输入
  11. 计算机视觉的网站收集
  12. matlab实现拉依达准则,拉依达准则matalb程序
  13. ffmpeg学习 pcm文件转wav文件
  14. ROS1云课→19仿真turtlebot(stage)
  15. 容迟网络中的路由算法学习笔记
  16. 【TS】<T> 泛型
  17. 浙大计算机专业博士后,赵莎 - 学科博士后 - 浙江大学 | LinkedIn
  18. 华云数据董事长许广彬接受中央电视台采访:推动职业教育发展 打造信创人才核心竞争力
  19. STM32驱动W5500动态分配IP
  20. SAP FICO 通用三栏明细账开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

热门文章

  1. EL表达式和thymeleaf
  2. 中级篇——虚拟机网络设置:桥接模式、NAT模式、仅主机模式3种网络模式讲解
  3. 进销存商城前几名的运营方法|三招提高微信商城用户黏性
  4. 浪潮云跻身中国政务大数据管理平台市场领导者位置
  5. IOI车机系统刷机和改包笔记
  6. 百度中科大“大学生创业家成长计划”开始啦!
  7. vlc3.0.4在ubuntu16.04x64上的交叉编译全过程记录
  8. As5600数据跳变
  9. python利用集合的无重复性_python集合类型用法分析
  10. 5G资源:增压网络时代的CAD与仿真