Java基础--IO
1,流的认识和分类
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。
根据流向,我们分为输入流和输出流
根据流里数据类型组织结构,我们分为字符流和字节流
| 字节流 | 字符流 |
| 一次读入或读出是8位二进制。 | 一次读入或读出是16位二进制。 |
| 直接对文件操作。 | 流和文件之间有个缓存区。字符流流独立于文件 |

下面程序验证缓冲区的存在。
字节ByteDemo
File file = new File("ByteDemo_01.txt");
OutputStream out = null;
String str = "helloworld!!";
try {
out = new FileOutputStream(file);//获取输出字节流
out.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
ByteDemo_01.txt内容:
字符流:CharDemo_01
Writer out = null;
String str = "helloworld!!";
try {
out = new FileWriter(file);
out.write(str);
}catch(IOException e){
e.printStackTrace();
}
这时CharDemo_01.txt内容为空,对缓冲区没有刷新,字符并没有写入到文件中,在out.write(str);语句后加入out.flush();之后才把字符写入文件。
2,Java种处理流的IO类架构
java处理字节流的超类是InputStream,OutputStream.常用方法见API,
为了弥补字节流没有缓冲区的一些应用场景下的不足,Java给InputStream提供了两种改进方法
- 直接在InputStream上作出程序改进,我们可以自定义缓冲区数组,将读取的内容首先读进自己的缓冲区数组。
int read(byte[] b, int off, int len)//将字节流读入b数组,off是b数组的起始位置,len是读入的长度,off+len<=b数组的长度
byte[] b = new byte[1024];
in = new FileInputStream(file);
in.read(b,0,1024);//从b[0]对b写入1024字节的数据
- 使用了装饰者类FilterInputStream,其子类BufferedInputStream在程序实现上封装了缓冲区数组,默认大小是8192
BufferedInputStream bis = new BufferedInputStream(in)
形式上和上面相同。
在访问效率上当第一种设计的方法缓冲区数组长度大于等于8192时和第二种访问效率类似。只是第二种方法提供了mar()和reset()方法,丰富了我们访问数据时所能使用的方法
java处理字符流的超类的Reader,Writer
java处理字符流时默认实现了缓冲区,方法和BufferedInputStream类似,不同的是字符流在读取写入时记得及时刷新缓冲区,防止缓冲区覆盖。
3,字节流和字符流转换
在介绍转换之前首先需要了解解码和编码
解码:String-->byte[] str.getbBytes("GBK")//以GBK形式对原字符串解码
编码:byte[]-->String String str = new String(b,"GBK")//以GBK形式对原字节编码赋值给str
Reader的子类InputStreamReader和Writer的子类OutputStreamWriter提供了字节流和字符流的转换。
InputStreamReader
字节流--->字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。
InputStreamReader isr = new InputStreamReader(new InputStream(),Charset cs);//
适用:适用于在某些应用中文本文件或文本内容初始获取时是字节流的形式。
OutputStreamWriter
字符流--->字节流。可使用指定的 charset 将要写入流中的字符编码成字节。
OutputStreamWriter(OutputStream out, Charset cs)
适用于只接受处理字节流的输入,需要将文本文件或者内容的字符流写入。
4,NIO的概述
NIO是Java新的IO处理机制,它们最大的不同是NIO对流实现了缓冲区机制,不同于传统的IO是从程序员封装实现的,它是从底层操作系统实现的,其效率更高。
5,Java IO关闭资源
以输入字符流为例
FileReader fr = null;
FileWriter fw = null;
try{}catch(){}
finally{
try{
if (null != fr){
fr.close();
}
}catch (IOException e){
throw new RuntimeException("关闭失败");
}
try{
if (null != fw){
fr.close();
}
}catch (IOException e){
throw new RuntimeException("关闭失败");
}
}//finally
Java基础--IO的更多相关文章
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...
- Java基础-IO流对象之随机访问文件(RandomAccessFile)
Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java基础-IO流对象之打印流(PrintStream与PrintWriter)
Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...
- Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
- Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)
Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...
随机推荐
- Mysql 数字类型转换函数
.将Int 转为varchar经常用 concat函数,比如concat(,' .将varchar 转为Int 用 cast(a as signed) a为varchar类型的字符串 总结:类型转换和 ...
- Beauty Contest(graham求凸包算法)
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25256 Accepted: 7756 Description Bess ...
- 在线LCA模板
在线LCA 如求A,B两点的LCA,先计算出各个结点的深度d[],然后,通过递推公式求出各个结点的2次方倍的祖先p[],假设d[A] > d[B],则找到d[p[A][i]] == d[B]也就 ...
- ZOJ-2587-Unique Attack(最小割的唯一性)
题意: 求无向图最小割是否唯一 分析: 1.我们先对原图求一次最大流 2.对残留网络,我们从S开始,找到所有所有S能到达的点:再从T开始,找出所有能到达T的点. 3.判断原网络中是否还有没有访问到的点 ...
- 【模拟】Codeforces 691A Fashion in Berland
题目链接: http://codeforces.com/problemset/problem/691/A 题目大意: n个数0或1,要求恰好n-1个1,如果n为1则那个数一定要是1 题目思路: [模拟 ...
- select的使用(二)
多表查询 /*基本连接*/ select a.Name,b.Name from T_Employee a,T_Department b where a.DepartmentId=b.Id /*内连接, ...
- Maximum Subarray——LeetCode
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- bzoj 1560 [JSOI2009]火星藏宝图(DP)
1560: [JSOI2009]火星藏宝图 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 647 Solved: 309[Submit][Status ...
- TXT四则运算计算器 后日谈
经过了软件工程第一个个人项目——<<四则运算器>>的开发后,对软件开发有了新的认识.题目中并没有明确说明对小数和负数是否应该提供支持.在第一个项目结束后,第二个项目则是针对上一 ...
- hdu 4705 dfs统计更新节点信息
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 #pragma comment(linker, "/STACK:16777216&qu ...