Java:文件字符流和字节流的输入和输出
最近在学习Java,所以就总结一篇文件字节流和字符流的输入和输出。
总的来说,IO流分类如下:
输入输出方向: 输入流(从外设读取到内存)和输出流(从内存输出到外设)
数据的操作方式: 字节流和字符流
其中,字符流的由来:字节流读取文字字节数据后,不直接操作,而是先查指定的编码表(为什么是指定的?因为不同的国家制定的编码表不一样)获取对应的文字,再对这个文字进行操作。简单说:字符流=字节流+编码表
字节流和字符流的区别:字节流不仅可以操作字符,还可以操作其他媒体文件
来张形象的图片:

Java中的顶层父类:
字节流:
InputStream,OutputStream
字符流:
Reader, Writer
缓存技术
使用缓存技术能提高性能(?为什么,因为缓存技术相当于实在内存中开辟一个容器,将外设中的数据放到容器中,然后对容器进行操作,相比直接操作外设,确实大大提高效率)
1.自己定义缓存区:相当于自定义一个数组
字节流缓存区:byte[] buf = new byte[1024];
字符流缓存区:char[] buf = new char[1024];
2.利用缓存类,此处用到了装配设计模式
何为装配设计模式?
当需要对对象进行功能扩展时,为了避免继承的臃肿和不灵活,将装配类进行单独的封装,那个对象需要就将哪个对象和装配类进行关联
字节流缓存:BufferedInputStream bfi = new BufferedInputStream(fi);
BufferedOutputStream bfo = new BufferedOutputStream(fo);
字符流缓存 :BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
示例:
1.使用字符流赋值一个txt文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter; public class BufferedRWDemo { public static void main(String[] args) throws Exception {
// 读写相结合
FileReader fr = new FileReader("fw.txt");
BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter("fwcopy.txt"); BufferedWriter bw = new BufferedWriter(fw); String line = null; while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();//此处不写就没有换行
bw.flush();
System.out.println(new String(line));
} br.close();
bw.close();
} }
2.使用字节流复制一个图片文件
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class IOStreamDemo { public static void main(String[] args) throws IOException {
// 用字节流复制一个图片文件
//copy_1();
copy_2(); } private static void copy_2() throws IOException {
// 利用装配模式,加入缓冲技术
FileInputStream fi = new FileInputStream("miao.jpg");
//定义缓冲对象
BufferedInputStream bfi = new BufferedInputStream(fi);
FileOutputStream fo = new FileOutputStream("miao_copy_1.jpg");
BufferedOutputStream bfo = new BufferedOutputStream(fo); int len = 0; while((len= bfi.read())!=-1) {
bfo.write(len);
} bfo.flush();
bfi.close();
bfo.close(); } private static void copy_1() throws IOException {
FileInputStream fi = new FileInputStream("miao.jpg");
FileOutputStream fo = new FileOutputStream("miao_copy.jpg"); //自定义缓冲区
byte[] buf = new byte[1024];//注意:此处是byte数组
int len = 0; while((len=fi.read(buf))!=-1) { fo.write(buf, 0, len);
} fi.close();
fo.close();//注意:如果不关闭资源,copy的图片文件在打开时就会出问题 } }
末尾来一张美景放松一下,话说我们不仅要每天都有进步,还要有发现美的眼睛。

Java:文件字符流和字节流的输入和输出的更多相关文章
- 理解Java中字符流与字节流
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...
- 理解Java中字符流与字节流的区别(转)
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- 理解Java中字符流与字节流的区别
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- Java中字符流与字节流的区别
字符流处理的单元为2个字节的Unicode字符,分别操作字符.字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组.所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单 ...
- Java文件字符流
1.字符编码(Character encoding)和编码集(Character set) 字符编码(Character encoding)是将字符转为字节或字节数组的过程. 字符集(Characte ...
- java 笔记(4) —— java I/O 流、字节流、字符流
Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...
- java字符流与字节流的区别是什么
java中字符流与字节流的区别: 1.字节流操作的基本单元为字节:字符流操作的基本单元为Unicode码元. 2.字节流默认不使用缓冲区:字符流使用缓冲区. 3.字节流通常用于处理二进制数据,实际上它 ...
- Java字符流和字节流对文件操作
记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writ ...
- 字符流;字节流;带缓冲的输入输出流;以及用scanner读文件
概念: InputStream类是字节输入流的抽象类,是所有字节输入流的父类. OutputStream类是字节输入流的抽象类,是所有字节输出流的父类. In(可以理解为读)Out(可以理解为写) 一 ...
随机推荐
- setTimeout传参 和 运行机制
1.setTimeout 传参数 setTimeout还允许添加更多的参数.它们将被传入推迟执行的函数(回调函数) 上面代码中,setTimeout共有4个参数.最后那两个参数,将在1000毫秒之后回 ...
- 在docker中初次体验.net core 2.0
.net core的跨平台有了Linux,不能没有docker……网上的系列文章一大推,特别是docker还有了中文官网:https://www.docker-cn.com/ .上面说的很清楚了,这里 ...
- 重建程序员能力(3)-asp.net MVC框架增加Controller
MVC在微软中提供的框架目前只是发现是asp.net用.另 8年前,我做了个MVC的Windows APP框架如果有兴趣我日后会介绍给大家,欢迎大家关注.MVC的概念网站上有很多,大家去查阅一 ...
- 【Android】用Cubism 2制作自己的Live2D——软件的安装与破解!
前言- 上文我们简单的了解了Cubism的情况,但是Cubism 2.X安装好以后如果不进行破解只能使用Free版本,这是我们接受不了的,我们是专业的.是来学习的,怎么能不用Pro版本呢?所以话不多说 ...
- mpvue学习笔记-之微信小程序数据请求封装
简介 美团出品的mpvue已经开源出来很久了,一直说要进行一次实践,这不最近一次个人小程序开发就用上了它. 看了微信官方的数据请求模块--request,对比了下get和post请求的代码,发现如果在 ...
- 设计模式系列之装饰模式(Decorator Pattern)
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...
- spring mvc 在上传图片时,浏览器报The request sent by the client was syntactically incorrect
项目中,在一个jsp页面里其它图片上传是功能是可以使用的,当我自己新加了一个图片上传时,提交表单后,浏览器报The request sent by the client was syntactical ...
- C#事件与委托详解
from https://www.cnblogs.com/sjqq/p/6917497.html C#事件与委托详解[精华 多看看] Delegatedelegate是C#中的一种类型,它实际上是一个 ...
- com.netflix.zuul.exception.ZuulException: Hystrix Readed time out
通过API网关路由来访问用户服务,zuul默认路由规则 :http://zuul的Host地址:zuul端口/要调用的服务名/服务方法地址 浏览器中打开http://127.0.0.1:8000/wa ...
- ubuntu18.04从零开始配置环境(jdk+tomcat+idea)到使用idea开发web应用和servlet
昨天吃了亏,搞了一下午才把环境配置好,故此将整个过程记录一下以防日后需要. 注意:因为我的博客模块的原因,所以我把图片压缩了一些,如果有看不清的, 可以 右键图片->在新标签页打开图片 目录: ...