Java IO 字节流与字符流 (三)
概述
IO流用来处理设备之间的数据传输
Java对数据的操作时通过流的方式
Java用于操作流的对象都在IO包中
流按操作的数据分为:字节流和字符流
流按流向不同分为:输入流和输出流
IO流常用基类
字节流的抽象基类
InputStream,OuputStream
字符流的抽象基类
Reader,Writer
注:
这些基类的子类都是以基类的名称结尾的,如FileReader,FileInputStream
字节流
字节流:以字符为导向的流
简单介绍一个例子,演示字节流对图片的复制
1: import java.io.*;
2:
3: class IOCopyPicDemo
4: {
5: public static void main(String[] args) throws IOException
6: {
7: //创建字节文件读取流
8: FileInputStream fis = new FileInputStream("pic1.png");
9: //创建字节文件输入流
10: FileOutputStream fos = new FileOutputStream("pic2.png");
11:
12: //定义缓冲区
13: byte[] buf = new byte[1024];
14:
15: //读取字节到缓冲区,并写入输出流,即写入到文件
16: int len = -1;
17: while( (len = fis.read(buf)) != -1)
18: {
19: fos.write(buf,0,len);
20: }
21:
22: //关闭资源
23: fis.close();
24: fos.close();
25:
26: }
27: }
字符流
字符流:以字符为导向的流
字符流只能操作文本,下面是字符流拷贝文本文件的例子
1: import java.io.*;
2:
3: class IOFileCopyDemo
4: {
5: public static void main(String[] args) throws IOException
6: {
7: //创建字符文件输入流
8: FileReader fr = new FileReader("IODemo1.java");
9:
10: //创建字符文件输出流
11: FileWriter fw = new FileWriter("IODemo2.java");
12:
13: //字符缓冲区
14: char[] data = new char[1024];
15:
16: int len = -1;
17:
18: //读入字符,并写入文件
19: while( (len = fr.read(data)) != -1)
20: {
21: fw.write(data,0,len);
22: }
23:
24: //关闭资源
25: fw.close();
26: fr.close();
27:
28: }
29: }
转换流
InputStreamReader,OutputStreamWriter
InputStreamReader(InputStream in):接收字节流,转换为字符流
InputStreamReader(InputStream in, Charset cs):接收字节流,按照指定的编码表转换为字符流
其实FileReader就是使用系统默认编码表的转换流,其内部使用的也是字节流,因此,下面两句是一样的
FileReader fr = new FileReader(“1.txt”);
InputStreamReader isr = new InputStreamReader(new FileInputStream(“1.txt”),”GDK”);
缓冲区与装饰设计模式
缓冲区
顾名思义,对数据起到一个缓冲的作用,减少了流之间的耦合性,减少了每次与硬盘设备之间的通信,提供了效率
BufferedWriter,BufferedReader,BufferedInputStream,BufferedOutputStream实现了对对应流的缓冲(其实内部就是定义了一个数组,无论读一个数组或者一个字,内部都会事先读取好一个足够大的缓冲区数组,供你使用)
装饰设计模式
当我们对一个体系中的类进行功能加强时,如果对每个类都定义其子类,会使得整个体系显得非常臃肿,而且扩展性不好,没出现一个新类,就要对其创建一个用于功能增强的子类,整个时候就出现了装饰类,这个装饰类就是对一个体系的类都进行功能的加强,使用时传入体系中类的对象,同时这个装饰类又应该属于这个体系
例如:BufferedReader,对Reader体系中的所有类进行加强,加入缓冲技术,方法的接口中使用的是父类引用,利用多态提高了功能扩展性
装饰设计模式的演变过程
IO异常处理方式
IO的异常基类为IOException,是Exception的子类,代表需要被程序员处理
由于IO涉及到了各种资源,所以try处理时,必须要在finally块中进行关闭资源操作
1: /*
2: IO异常处理
3: */
4:
5: import java.io.*;
6:
7: class IOExceptionHandleDemo
8: {
9: public static void main(String[] args)
10: {
11: FileWriter fw = null;
12: FileReader fr = null;
13: try
14: {
15: fw = new FileWriter("IODemo1.txt");
16: fr = new FileReader("IODemo2.txt");
17: fw.write(fr.read());
18:
19: }
20: catch (IOException e)
21: {
22: System.out.println(e.toString());
23: }
24: finally
25: {
26: if(fw != null)
27: {
28: try
29: {
30: fw.close();
31: }
32: catch (IOException e)
33: {
34: System.out.println("close exception!");
35: }
36: }
37: if(fr != null)
38: {
39: try
40: {
41: fr.close();
42: }
43: catch (IOException e)
44: {
45: System.out.println("close exception!");
46: }
47: }
48: }
49: }
50: }
Java IO 字节流与字符流 (三)的更多相关文章
- JAVA IO 字节流与字符流
文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节. ...
- Java IO 字节流与字符流 (二)
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- Java IO 字节流与字符流 (五)
Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...
- java中字节流与字符流的区别
字节流 在I/O类库中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,它们都是抽象类,不能实例化,数据流中的最小单位是字节,所以叫做字 ...
- Java的字节流,字符流和缓冲流对比探究
目录 一.前言 二.字节操作和字符操作 三.两种方式的效率测试 3.1 测试代码 3.2 测试结果 3.3 结果分析 四.字节顺序endian 五.综合对比 六.总结 一.前言 所谓IO,也就是Inp ...
- Java中字节流和字符流的比较(转)
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...
- java中字节流和字符流的区别
流分类: 1.Java的字节流 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先.2.Java的字符流 Reader是所有读取字符串输入流的祖先,而 ...
- Java中字节流和字符流复制文件
字节流和字符流复制文件的过程: 1.建立两个流对象 绑定数据源和目的地 2.遍历出需复制的文件写入复制过后的新文件中(只不过是遍历的时候是区分字节和字符的) 3.访问结束后关闭资源 字节流复制文件: ...
- 14、IO (字节流、字符流)
输入和输出 * A:输入和输出 * a: 参照物 * 到底是输入还是输出,都是以Java程序为参照 * b: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 ...
随机推荐
- ArcGIS:Hello World Maps
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- POJ1094 字母排序(拓扑排序)
该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.该序列不能判断是否有序: 3.该序列字母次 ...
- TKmybatis的框架介绍和原理分析及Mybatis新特性
tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查 ...
- 使用谷歌Z生成条形码以及二维码
下载地址:http://zxingnet.codeplex.com/ zxing.net是.net平台下编解条形码和二维码的工具,使用非常方便. 首先下载二进制dll文件,引入工程: using Sy ...
- Bzoj3038 上帝造题的七分钟2 线段树
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1135 Solved: 509 Description XLk觉得<上帝造题的七分钟>不太 ...
- 【51NOD1806】wangyurzee的树(Prufer编码,容斥原理,组合计数)
题意:有n个点和m条限制,每条限制限制了一个点的度数不能为某个数. 求合法的树的个数模10^9+7 n<=10^6 m<=17 思路:WYZ作业 首先m<=17显然是2^m容斥 枚举 ...
- codevs 3971 航班
题目描述 Description B 国有N 座城市,其中1 号是这座国家的首都. N 座城市之间有M 趟双向航班.i 号点的转机次数定义为:从1 号点到i ,最少需要转机几 次.如果1 根本无法到达 ...
- 更新数据库中数据时出现: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences 问题
使用workbench在数据库中更新数据时报错: You are using safe update mode and you tried to update a table without a WH ...
- JSP基础教程:tutorialspoint-jsp
来自turorialspoint的JSP基础教程(英文),官网:https://www.tutorialspoint.com/jsp/index.htm 这个教程在国内已经被翻译成中文(不过是属于机器 ...
- easyui datagrid-detailview 嵌套高度自适应
实现效果 原因 异步加载,明细展开时,可能会遇到父列表不能自动适应子列表高度的变化 具体代码 $('#centerdatagrid').datagrid({ url:'${ctx}/offer/off ...