缓冲流

mac2022-06-30  10

概述:

缓冲流的概述BufferedInputStream: 字节输入缓冲流BufferedOutputStream: 字节输出缓冲流四种方式复制字符缓冲流文本排序字符流读字符乱码问题InputStreamReader转换流读取字符数据OutputStreamWriter转换流写字符数据转换文件编码

1.缓冲流的概述:

我们知道在操作流的时候使用不带数组读取的次数很多,效率低.带数组,提高效率.既然带数组可以提高效率,Java自己写好了4个类,带数组,提高效率.这四个带数组可以提高效率的类我们称为缓冲流/高效流,里面的数组称为缓冲区

缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类:

字节缓冲流:BufferedInputStream,BufferedOutputStream字符缓冲流:BufferedReader , BufferedWriter

缓冲流的优点?

内部带一个8192的数组,提高效率

2.BufferedInputStream: 字节输入缓冲流:

/* BufferedInputStream: 字节输入缓冲流 继承InputStream,使用的就是InputStream的那些read读数据的方法 构造方法: BufferedInputStream​(InputStream in) 缓冲流内部提供一个数组作为缓冲区,真正操作文件靠的是参数传入的流 */ public static void test02() throws IOException { // FileInputStream fis = new FileInputStream("day10demo\\abc\\bos.txt"); // BufferedInputStream bis = new BufferedInputStream(fis); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day10demo\\abc\\bos.txt")); int b; // 保存读取到的内容 while ((b = bis.read()) != -1) { System.out.println((char)b); } bis.close(); }

3.BufferedOutputStream: 字节输出缓冲流:

/* BufferedOutputStream: 字节输出缓冲流 继承OutputStream,使用的就是OutputStream的那些write写数据的方法 构造方法: BufferedOutputStream​(OutputStream out) 缓冲流内部提供一个数组作为缓冲区,真正操作文件靠的是参数传入的流 */ public static void test01() throws IOException { FileOutputStream fos = new FileOutputStream("day10demo\\abc\\bos.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write(97); bos.write(new byte[] {65, 66, 67, 68}); bos.close(); }

4.四种方式复制:

基本流读取一个字节基本流读取一个字节数组缓冲流读取一个字节缓冲流读取一个字节字节数组 public static void main(String[] args) throws IOException { long start = System.currentTimeMillis(); //消耗时间对比 // copy01(); // 27753 // copy02(); // 12 // copy03(); // 127 copy04(); // 22 long end = System.currentTimeMillis(); System.out.println("消耗时间: " + (end - start)); } // 缓冲流读取一个字节字节数组 public static void copy04() throws IOException { BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day10demo\\abc\\高清无码.flv")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("c:/MyFileTest/高清无码3.flv")); // 循环读写一个数组 byte[] buf = new byte[1024 * 8]; int len; while ((len = bis.read(buf)) != -1) { bos.write(buf, 0, len); } bos.close(); bis.close(); } // 缓冲流读取一个字节 public static void copy03() throws IOException { BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day10demo\\abc\\高清无码.flv")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("c:/MyFileTest/高清无码3.flv")); // 循环读写一个字节 int b; while ((b = bis.read()) != -1) { bos.write(b); } bos.close(); bis.close(); } // 基本流读取一个字节数组 public static void copy02() throws IOException { // 创建输入流,读取数据 FileInputStream fis = new FileInputStream("day10demo\\abc\\高清无码.flv"); // 创建输出流,写数据 FileOutputStream fos = new FileOutputStream("c:/MyFileTest/高清无码2.flv"); // 循环读写,一个字节数组 byte[] buf = new byte[1024 * 8]; int len; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } // 关流 fos.close(); fis.close(); } // 基本流读取一个字节 public static void copy01() throws IOException { // 创建输入流,读取数据 FileInputStream fis = new FileInputStream("day10demo\\abc\\高清无码.flv"); // 创建输出流,写数据 FileOutputStream fos = new FileOutputStream("c:/MyFileTest/高清无码1.flv"); // 循环读写 int b; while ((b = fis.read()) != -1) { fos.write(b); } // 关流 fos.close(); fis.close(); }

5.字符缓冲流

字符缓冲流的构造方法?

public BufferedReader(Reader in) :创建一个 新的缓冲输入流。public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。

2.BufferReader特有方法?

String readLine(); 读取一行

3.BufferedWriter特有方法?

void newLine(); 写一个换行符

readLine 方法演示,代码如下:

public class BufferedReaderDemo { public static void main(String[] args) throws IOException { // 创建流对象 BufferedReader br = new BufferedReader(new FileReader("in.txt")); // 定义字符串,保存读取的一行文字 String line = null; // 循环读取,读取到最后返回null while ((line = br.readLine())!=null) { System.out.print(line); System.out.println("------"); } // 释放资源 br.close(); } }

newLine 方法演示,代码如下:

public class BufferedWriterDemo throws IOException { public static void main(String[] args) throws IOException { // 创建流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt")); // 写出数据 bw.write("我"); // 写出换行 bw.newLine(); bw.write("最"); bw.newLine(); bw.write("帅"); bw.newLine(); // 释放资源 bw.close(); } } 输出效果: 我 最 帅

6.文本排序

文本:

3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨 之,然后施行,必得裨补阙漏,有所广益。 8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛 下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。 4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使 行阵和睦,优劣得所。 2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏 私,使内外异法也。 1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖 追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路 也。 9.今当远离,临表涕零,不知所言。 6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世 之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐付托不效,以伤先帝之明,故五月渡泸,深入不毛。今南方 已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。 至于斟酌损益,进尽忠言,则攸之、祎、允之任也。 5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于 桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。

分析:

1.循环一行一行读取数据 2.当读取到一行数据使用.分割,前面的数字作为键,后面文本作为值,存储到map中 3.按照1,2,3…顺序来map中取出对应的数据 4.将取出的数据写入文件

代码实现:

public static void main(String[] args) throws IOException { // 1.循环一行一行读取数据 BufferedReader br = new BufferedReader(new FileReader("day10demo\\abc\\in.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("day10demo\\abc\\out.txt")); String line; HashMap<Integer, String> map = new HashMap<>(); while ((line = br.readLine()) != null) { // 2.当读取到一行数据使用.分割,前面的数字作为键,后面文本作为值,存储到map中 // 3.侍中、侍郎郭攸之 -> new String[] {"3", "侍中、侍郎郭攸之"}; String[] split = line.split("\\."); // .表示任何内容, 我们要让这个点没有特殊含义转义: \. // System.out.println(split[0] + ":::" + split[1]); int key = Integer.parseInt(split[0]); String value = split[1]; map.put(key, value); } // 3.按照1,2,3...顺序来map中取出对应的数据 for (int i = 1; i < 10; i++) { // i = 1, 2, 3 ... 9 String value = map.get(i); String str = i + "." + value; // 4.将取出的数据写入文件 bw.write(str); bw.newLine(); } bw.close(); br.close(); }

7.字符流读字符乱码问题

为什么会乱码?

idea默认使用UTF-8编码 保存和读取使用了不同的编码,就乱码了

public static void main(String[] args) throws IOException { // readUTF8(); readGBK(); } // 读取GBK的文件 public static void readGBK() throws IOException { // 使用UTF8读取了GBK的文件就乱码了 FileReader fr = new FileReader("day10demo\\abc\\china_gbk.txt"); int ch; while ((ch = fr.read()) != -1) { System.out.println((char) ch); } fr.close(); } // 读取UTF-8的文件 public static void readUTF8() throws IOException { // 使用UTF8读取了UTF-8的文件正常 FileReader fr = new FileReader("day10demo\\abc\\china_utf8.txt"); int ch; while ((ch = fr.read()) != -1) { System.out.println((char) ch); } fr.close(); }

8.InputStreamReader转换流读取字符数据

类的说明:

InputStreamReader: 可以使用指定编码来读取文件, 继承Reader,还是使用Reader的read来读取数据

构造方法:

InputStreamReader​(InputStream in) 使用默认码表(UTF-8)来读取数据InputStreamReader​(InputStream in, String charsetName) 使用指定码表来读取数据String charsetName: 指定编码表通常写:GBK/UTF-8 大小写通用 public static void main(String[] args) throws IOException { // 转换流默认是UTF-8编码来读取 // InputStreamReader isr = new InputStreamReader(new FileInputStream("day10demo\\abc\\china_gbk.txt")); // 使用GBK来读取 FileInputStream fis = new FileInputStream("day10demo\\abc\\china_gbk.txt"); InputStreamReader isr = new InputStreamReader(fis, "GBK"); int ch; while ((ch = isr.read()) != -1) { System.out.println((char)ch); } isr.close(); }

9.OutputStreamWriter转换流写字符数据

类的说明:

继承Writer,还是使用Writer的那些write方法写数据 可以使用指定的编码来写数据

构造方法:

OutputStreamWriter​(OutputStream out) 使用默认的编码(UTF-8)往文件写字符数据OutputStreamWriter​(OutputStream out, String charsetName) 使用指定的编码往文件写字符数据 public static void main(String[] args) throws IOException { // OutputStreamWriter​(OutputStream out) 使用默认的编码(UTF-8)往文件写字符数据 FileOutputStream fos = new FileOutputStream("day10demo\\abc\\osw.txt"); // OutputStreamWriter osw = new OutputStreamWriter(fos); // OutputStreamWriter​(OutputStream out, String charsetName) 使用指定的编码往文件写字符数据 OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk"); osw.write("洗剪吹300,洗和剪30"); osw.close(); }

10.转换文件编码

步骤:

1.使用gbk读取源文件 2.使用utf-8写到目的地 3.循环读写

public static void main(String[] args) throws IOException { // 1.使用gbk读取源文件 InputStreamReader isr = new InputStreamReader(new FileInputStream("day10demo\\abc\\xjc_gbk.txt"), "gbk"); // 2.使用utf-8写到目的地 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day10demo\\abc\\xjc_utf8.txt"), "utf-8"); // 3.循环读写 char[] chs = new char[1024]; int len; while ((len = isr.read(chs)) != -1) { osw.write(chs, 0, len); } osw.close(); isr.close(); }
最新回复(0)