强大的缓冲流

概述:

  1. 缓冲流的概述
  2. BufferedInputStream: 字节输入缓冲流
  3. BufferedOutputStream: 字节输出缓冲流
  4. 四种方式复制
  5. 字符缓冲流
  6. 文本排序
  7. 字符流读字符乱码问题
  8. InputStreamReader转换流读取字符数据
  9. OutputStreamWriter转换流写字符数据
  10. 转换文件编码

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(); // 127copy04(); // 22long 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 ... 9String 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();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux驱动头文件查找目录,在Fedora 20中查找简单设备驱动程序的头文件

因此&#xff0c;我尝试按照简单的示例加载ORielly Linux设备驱动程序手册中的“ Hello World”设备驱动程序。问题是&#xff0c;由于某种原因&#xff0c;除非我在include语句中显式定义头文件的路径&#xff0c;否则它将无法正常工作。即我必须输入#include 而不只是#includ…

Feel Good

传送门 Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 14435 Accepted: 3996Case Time Limit: 1000MS Special JudgeDescription Bill is developing a new mathematical theory for human emotions. His recent investigations are dedicated to studying how g…

转换流/序列化/反序列化

转换流&#xff1a; 使用转换流可以在一定程度上避免乱码&#xff0c;还可以指定输入输出所使用的字符集 InputStreamReader&#xff1a;是从字节流到字符流的桥梁&#xff0c;父类是Reader OutputStreamWriter&#xff1a;是从字符流到字节流的桥梁&#xff0c;父类是Writer 转…

linux进程map,LInux环境运行mapReduce程序

将工程整体打成一个jar包并上传到linux机器上&#xff0c;准备好要处理的数据文件放到hdfs的指定目录中用命令启动jar包中的Jobsubmitter&#xff0c;让它去提交jar包给yarn来运行其中的mapreduce程序 &#xff1a;hadoop jar wc.jar cn.edu360.mr.wordcount.JobSubmitter ...…

python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)

预期框架整理目标&#xff1a; 1.单个用例维护在单个.py文件中可单个执行&#xff0c;也可批量生成组件批量执行 2.对定位参数&#xff0c;定位方法&#xff0c;业务功能脚本&#xff0c;用例脚本&#xff0c;用例批量执行脚本&#xff0c;常用常量进行分层独立&#xff0c;各自…

linux 不知道root密码怎么办,linux下忘记root密码怎么办

在linux系统操作中&#xff0c;为了系统的安全&#xff0c;会给系统中的root账户设置密码&#xff0c;那么忘记密码是时常发生的事情。如果忘记了root的密码该怎么办呢?下面秋天网 Qiutian.ZqNF.Com小编就给大家介绍下linux下忘记root密码的解决方法。linux是一套免费使用和自…

scrapy爬个小网站

本文使用scrapy对某一个网站静态数据进行了抓取# -*- coding: utf-8 -*- import scrapy from scrapy.http import request import requests import os import sys reload(sys) sys.setdefaultencoding(utf-8)#中文字符不能被识别报错 class spider(scrapy.Spider):namepicSpi…

linux如何标识用户账号和组账号,linux管理用户和组

唯一标识&#xff1a; UID GID (管理员root的UID为0)组的分类&#xff1a; 基本组 附加组(从属组)基本组&#xff1a;Linux自己创建的组&#xff0c;与用户同名&#xff0c;系统自动将用户加入附加组(从属组)&#xff1a;管理员自建创建&#xff0c;管理员将用户加入Linux一个…

Windows 相关链接

c运行库、c标准库、windows API的区别和联系 http://www.cnblogs.com/renyuan/p/5031100.html 转载于:https://www.cnblogs.com/jidongdeatao/p/6916260.html

vs远程编译linux程序,使用Visual Studio 2015远程调试Linux程序

##安装 Visual Studio 2015安装时注意将跨平台移动开发->Visual C移动开发->Viaual C Android 开发的选项勾上##安装PUTTYVisual Studio依赖putty中的plink来连接Linux机器并发送命令##使用首先在Visual Studio中新建一个空项目这里是列表文本接下来将代码导入到这个空项…

都在说反射,反射到底是什么

概念&#xff1a; 什么是反射? 利用反射可以无视修饰符获取类里面所有的属性和方法对于任何对象&#xff0c;都能够调用它的方法和属性&#xff0c;这种动态获取信息以及动态调用对象方法的功能称为Java的反射 反射的应用场景? 常见的有&#xff1a; idea的智能提示、框架等…

jade linux 安装教程,ROS-Jade版在UbuntuKylin15.04上的安装

ROS已经升级到Jade版了&#xff0c;而且貌似可以支持Ubuntu15.04。这里做一个测试&#xff0c;安装是成功的&#xff0c;运行有没有问题&#xff0c;慢慢用了再说。Ubuntu install of ROS JadeWe are building Debian packages for several Ubuntu platforms, listed below. …

LaunchScreen原理

会自动加载LaunchScreen是因为在Target当中,指定了Launch Screen file 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动图片.可以进入沙盒当中查看,查看方法,找到应用程序根目录.获取方法: NSLog("%",NSHomeDirectory());打印出…

什么是注解,注解怎么用

概念&#xff1a; 什么是注解? 是JDK1.5推出的新特性 对程序进行标注和解释给类增加额外的信息注解可以保存一些简单的数据 注解和注释的区别 注释: 给程序员看的 注解: 给编译器看的 使用注解进行配置配置的优势 代码更加简洁,方便 注解也可以代替xml 注解的作用: 编写文档&…

QTimer在linux设置实时线程,为什么我的QTimer只能用于以QThread开头的线程消息,如果我的代码中没有QTimer?...

当(并且仅当)退出我的应用程序时,这些(并且仅这些)重复的消息出现在命令提示符上:QObject::startTimer: QTimer can only be used with threads started with QThreadQObject::startTimer: QTimer can only be used with threads started with QThreadQObject::startTimer: QTi…

一分钟看懂动态代理

动态代理&#xff1a; 在不改变目标对象方法的情况下对方法进行增强 组成部分&#xff1a; 被代理对象&#xff1a;真实的对象代理对象&#xff1a;内存中的一个对象 要求&#xff1a; 代理对象必须和被代理对象实现相同的接口 实现 使用Proxy.newProxyInstance() 举栗子&#…

linux 检查mps版本,linux_mps启动流程_存储相关.doc

linux_mps启动流程_存储相关Linux-mips启动流程-存储相关linux内核启动的第一个阶段是从 /arch/mips/kernel/head.s文件开始的。而此处正是内核入口函数kernel_entry(),该函数定义在 /arch/mips/kernel/head.s文件里。kernel_entry()函数是体系结构相关的汇编语言&#xff0c;它…

Mac - 苹果电脑mac系统释放硬盘空间方法汇总

硬盘空间是大家最头痛的一个问题&#xff0c;大家在硬盘空间变小的时候怎么腾空间的呢&#xff1f;下面为大家分享7个mac系统释放空间的高级方法&#xff0c;大家赶紧来收了&#xff01; mac系统释放硬盘空间方法&#xff1a; 方法一&#xff1a;删除Emacs——可以节省出60MB的…

XML语言

XML&#xff1a; XML是可扩展的标记语言 标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素) 可扩展&#xff1a;标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 xml学习网站https://www.w3school.com.cn/x.asp 作用&#xf…

linux arm current_thread_info定义,linux 内核 current全局变量

在内核的API里经常能够见到一个指针current&#xff0c;它表示的是当前的进程(如果说是一个全局变量虽然不合理&#xff0c;但更容易理解)&#xff0c;current内核路径为&#xff1a;include\asm-generic\current.hcurrent当前进程具体定义&#xff1a;#ifndef __ASM_GENERIC_C…