最近在学习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:文件字符流和字节流的输入和输出的更多相关文章

  1. 理解Java中字符流与字节流

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...

  2. 理解Java中字符流与字节流的区别(转)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  3. 理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  4. Java中字符流与字节流的区别

    字符流处理的单元为2个字节的Unicode字符,分别操作字符.字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组.所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单 ...

  5. Java文件字符流

    1.字符编码(Character encoding)和编码集(Character set) 字符编码(Character encoding)是将字符转为字节或字节数组的过程. 字符集(Characte ...

  6. java 笔记(4) —— java I/O 流、字节流、字符流

    Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...

  7. java字符流与字节流的区别是什么

    java中字符流与字节流的区别: 1.字节流操作的基本单元为字节:字符流操作的基本单元为Unicode码元. 2.字节流默认不使用缓冲区:字符流使用缓冲区. 3.字节流通常用于处理二进制数据,实际上它 ...

  8. Java字符流和字节流对文件操作

    记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writ ...

  9. 字符流;字节流;带缓冲的输入输出流;以及用scanner读文件

    概念: InputStream类是字节输入流的抽象类,是所有字节输入流的父类. OutputStream类是字节输入流的抽象类,是所有字节输出流的父类. In(可以理解为读)Out(可以理解为写) 一 ...

随机推荐

  1. android activity的生命周期和启动模式

    activity是android开发的基本中的基本每一个项目都会有activity.activity有自己的生命周期,在网上有很多博客和资料,在这里我也只是印证一下. 一个activity: 在打开a ...

  2. [Alibaba-ARouter] 简单好用的Android页面路由框架

    开发一款App,总会遇到各种各样的需求和业务,这时候选择一个简单好用的轮子,就可以事半功倍 前言 Intent intent = new Intent(mContext, XxxActivity.cl ...

  3. UEFI引导的简单恢复方法

    装系统,尤其是双系统,总是无法绕过引导的坑. linux的grub是非常复杂的引导系统,学习它非常累.而windows又不能引导linux.你可能会想,怎么就没有一种简单的引导方式,就好像引导光盘,引 ...

  4. 【已采纳】最快获取package和activity的方式

    意外找到一个本人自认为是最快获取package和activity的方法,欢迎来辩! 用adb命令快速查看某应用appPackage及appActivity的方法(前提是需要用数据线连接真机\模拟器也可 ...

  5. Jenkins实现简单的CI功能

    步骤一:安装JDK.Tomcat,小儿科的东西不在此详细描述 步骤二:下载安装Jenkins下载链接:https://jenkins.io/download/ 步骤三:将下载的jenkins.war部 ...

  6. C#:对字符串的各种处理

    字符串截取 SubString OR Remove string str3 = "123abc456"; //str3 = str3.Substring(0, i); //从左边开 ...

  7. 前端/C# 前后台交互文件上传、下载

    试了很多方式,最终确认这个全面简单版的.废话不多说,贴码. 文件上传 input的type命名为file,即可实现文件上传.嗯~~~现在html还是很强大的.Good! 前端 单个文件上传 Html: ...

  8. Unity3D介绍

    Unity3D介绍:Unity3D是一个游戏开发引擎 由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具 ...

  9. 三分钟明白 Activiti工作流 -- java运用

    原文地址:https://blog.csdn.net/jiangyu1013/article/details/73250902 一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打 ...

  10. Java BigDecimal类型的 加减乘除运算

    原文: https://blog.csdn.net/xuwei_net/article/details/81253471 加法:add 减法:subtract 乘法:multiply 除法:divid ...