JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
我们继续来聊聊I/O
一.字节流的缓冲区
这个,和我们的字符流基本上没有什么差别,我们来拷贝mp3,看例子
// 通过字节流的缓冲区拷贝图片
public static void copyMp3() {
try {
FileInputStream fi = new FileInputStream("audio.mp3");
BufferedInputStream buf = new BufferedInputStream(fi);
FileOutputStream fio = new FileOutputStream("audioCapy.mp3");
BufferedOutputStream buo = new BufferedOutputStream(fio);
int ch = 0;
while ((ch = buf.read()) != -1) {
buo.write(ch);
}
buf.close();
buo.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这样,就直接拷贝了
二.自定义字节流缓冲区
我们队缓冲区已经了解很多了,这样的话,我们来尝试解析他的原理然后自定义一个字节流的缓冲区出来,来看看对不对
class MyBufferedImputStream {
private InputStream in;
private byte[] buf = new byte[1024];
private int pos = 0;
private int count = 0;
public MyBufferedImputStream(InputStream in) {
this.in = in;
}
// 从缓冲区一次读一个字节
public int myRead() throws IOException {
// 通过in对象读取硬盘上的数据,存储在buf
if (count == 0) {
count = in.read(buf);
if (count < 0)
return -1;
byte b = buf[pos];
count--;
pos++;
return b;
} else if (count > 0) {
byte b = buf[pos];
pos++;
count--;
return b;
}
return -1;
}
//关闭流
public void myClose() throws IOException {
in.close();
}
}
思路是比较清晰的,想知道对不对,小伙伴赶紧去试试
三.读取键盘录入
这个其实早就要讲,现在讲就有点晚了,就是键盘输入文字读取
package com.lgl.hellojava;
import java.io.IOException;
import java.io.InputStream;
public class HelloJJAVA {
public static void main(String[] args) throws IOException {
/**
* 通过键盘录入数据 当录入一行数据后,打印 发现over,停止
*/
InputStream in = System.in;
StringBuilder sb = new StringBuilder();
while (true) {
int ch = in.read();
if (ch == '\r')
continue;
if (ch == '\n') {
String s = sb.toString();
if ("over".equals(s))
break;
System.out.println(s);
// delte all
sb.delete(0, sb.length());
} else
sb.append(ch);
}
}
}
当我们写完之后就发现,这个写法我们之前是有写过的,就是readLine的原理,这样的话,我们可以对其进行改造一下,但是这里就产生了一个新的问题,一个是字符流,一个是字节流,那这里也就产生了一个思考,能不能将字节流转换成字符流,再去使用它缓冲区的readLine方法呢?
四.转换流InputStreamReader
java中需要转换流就会使用到转换流,使用到了InputStreamReader,你会发现十分的方便的
package com.lgl.hellojava;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class HelloJJAVA {
public static void main(String[] args) throws IOException {
//获取键盘录入对象
InputStream in = System.in;
//转换
InputStreamReader isr = new InputStreamReader(in);
//提高效率
BufferedReader bur = new BufferedReader(isr);
String line = null;
while((line = bur.readLine()) != null){
if(line.equals("over"))
break;
System.out.println(line.toString());
}
}
}
我们来演示一下
五.写入转换流
我们转换流的read学完了,我们就来学习一下write.我们继续增强上面的方法
package com.lgl.hellojava;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class HelloJJAVA {
public static void main(String[] args) throws IOException {
//获取键盘录入对象
InputStream in = System.in;
//转换
InputStreamReader isr = new InputStreamReader(in);
//提高效率
BufferedReader bur = new BufferedReader(isr);
OutputStream os = System.out;
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bufw = new BufferedWriter(osw);
String line = null;
while((line = bur.readLine()) != null){
if(line.equals("over"))
break;
bufw.write(line.toString());
bufw.newLine();
bufw.flush();
}
}
}
OK,实现的功能也是正常的了;
六.流操作的规律
我们写了这么多流,我们来总结一下规律
- 1
- 源:键盘录入
- 目的:控制台
- 2 : 需求:想把键盘录入的数据存储到一个文件中
- 源:键盘
- 目的:文件
- 3.需求:想要将一个文件的数据打印在控制台上
- 源:文件
- 目的:控制台
流操作的基本规律
- 最痛苦的就是不知道流对象要用哪一个
- 通过两个明确来完成
- 1.明确源和目的
- 源:输入流 InputStream Reader
- 目的:输出流 OutputStream writer
- 2.明确操作的数据是否是纯文本
- 是:字符流
- 不是:字节流
- 3.当体系明确后,再明确要使用哪个具体的对象
- 通过设备来进行区分
- 源设备:内存,硬盘,键盘
- 目的:内存,硬盘,控制台。
- 1.明确源和目的
前面两个是比较重要的,也可以明确出来,第三个就是加分项了
I/O就先到这里了,我们下篇继续聊,同时开始讲File了
有兴趣的可以加群:555974449
JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律的更多相关文章
- JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder
JAVA之旅(十七)--StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder 讲完String,我们来聊聊他的小兄弟 一.StringB ...
- Java基础---Java---IO流-----读取键盘录入、InputStreamReader、转换流、OutputStreamWriter、InputStreamReader
字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream Buffe ...
- Java基础(二十七)Java IO(4)字符流(Character Stream)
字符流用于处理字符数据的读取和写入,它以字符为单位. 一.Reader类与Writer类 1.Reader类是所有字符输入流的父类,它定义了操作字符输入流的各种方法. 2.Writer类是所有字符输出 ...
- Java进阶专题(二十七) 将近2万字的Dubbo原理解析,彻底搞懂dubbo (下)
...接上文 服务发现 服务发现流程 整体duubo的服务消费原理 Dubbo 框架做服务消费也分为两大部分 , 第一步通过持有远程服务实例生成Invoker,这个Invoker 在客户端是核心的远程 ...
- Java开发学习(二十七)----SpringMVC之Rest风格解析及快速开发
一.REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描 ...
- Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!
前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...
- Java从零开始学二十七(NumberFormat类)
一.NumberFormat表示数字的格式化类 NumberFormat表示数字的格式化类,即:可以按照本地的风格习惯进行数字的显示. No. 方法 类型 描述 1 public static Loc ...
- Java学习笔记二十七:Java中的抽象类
Java中的抽象类 一:Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...
- java 面向对象(二十七):注解的使用
1. 注解的理解① jdk 5.0 新增的功能*② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通过使用 Annotation, ...
随机推荐
- 如何在Windows系统中设置Python程序定时运行
文章出处:http://blog.csdn.net/wwy11/article/details/51100432 首先,我们肯定是要用到Windows下的[计划任务]功能 之后点击右侧的[创建基本任务 ...
- HTTPS介绍
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...
- Spring中整合Cage,实现验证码功能
1.pom.xml中添加Cage依赖. <dependency> <groupId>com.github.cage</groupId> <artifactId ...
- Redis从入门到精通:初级篇
原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...
- Linux sort -n 与 -g 排序对比
公司业务需要,天天用awk统计数值然后排序,出问题了,如下: count.sh 是一个统计脚本,把awk输出的值按占比.条数.类型 在重新输出 awk -F\| '{print $16}' *MQTT ...
- OkHTTPClient
一,OKHttp介绍 okhttp是一个第三方类库,用于android中请求网络. 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和Leak ...
- Zookeeper 快速入门(上)
来源:holynull, blog.leanote.com/post/holynull/Zookeeper 如有好文章投稿,请点击 → 这里了解详情 Zookeeper是Hadoop分布式调度服务,用 ...
- Docker安装tomcat和部署项目
随着微服务的流行,Docker越来越流行,正如它的理念"Build, Ship, and Run Any App, Anywhere"一样,Docker提供的容器隔离技术使得开发人 ...
- 75. Sort Colors(中等)
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- Linux系统格式化新磁盘并挂载分区
Linux系统格式化新磁盘并挂载分区 在虚拟机的设置界面中,我们可以选择添加硬盘 添加好硬盘后,我们输入命令fdisk -l 看到有一个未经分区的硬盘 Fdisk命令编辑这个硬盘 输入n创建分区,p选 ...