处理流:包在别的流上的流,可以对被包的流进行处理或者提供被包的流不具备的方法。
一、缓冲流:套接在相应的节点流之上,带有缓冲区,对读写的数据提供了缓冲的功能,提高读写效率,同时增加一些新的方法。可以减少对硬盘的读写次数,保护硬盘。
1、四种缓冲流:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream
2、常用的构造方法:
BufferedReader(Reader in);创建默认缓冲区大小的字符输入缓冲流。
BufferedReader(Reader in, int sz); 创建缓冲区大小为sz的字符输入缓冲流。当sz<=0时,会报IllegalArgumentException异常。
BufferedWriter(Writer out);创建默认缓冲区大小的字符输出缓冲流。
BufferedWriter (Writer out , int sz); 创建缓冲区大小为sz的字符输出缓冲流。当sz<=0时,会报IllegalArgumentException异常。
BufferedInputStream(InputStream in); 创建默认缓冲区大小的字节输入缓冲流。
BufferedInputStream(InputStream in,int sz); 创建缓冲区大小为sz的字节输入缓冲流,当sz<=0时,会报IllegalArgumentException异常。
BufferedOutputStream( Writer out); 创建默认缓冲区大小的字节输出缓冲流。
BufferedOutputStream( Writer out, int sz ); 创建缓冲区大小为sz的字节输出 缓冲流,当sz<=0时,会报IllegalArgumentException异常。
3、缓冲输入流继承了父类的mark(int i)和reset()方法,mark方法在i位置做一个标记,再读的时候就从位置100开始往下读,当i<0时,会报IllegalArgumentException异常 ,当出现IO错误时,会报IOException异常;reset()方法是跳回到该输入流最后mark的位置,从这个位置开始接下来的操作,如果输入流没有做过标记或标记不存在,会报IOException异常 。
4、BufferedReader提供readLine()方法用于读取一行字符串,该方法抛出IOException异常。
5、BufferedWriter提供newLine()方法用于写入换行。
6、对于输出的缓冲流BufferedWriter和BufferedOutputStream,写出的数据会先在内存中缓存,使用flush方法将内存中的数据立刻写出。
练习小程序1:从标记处开始读写文件中的内容
package test.io.buffered;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderTest {
public static void main(String args[]){
File f = new File("E:/技术学习/java/test/Socket/test1.txt");
FileReader fr = null;
BufferedReader br = null;
int b = 0;
try {
fr = new FileReader(f);
br = new BufferedReader(fr);
br.mark(100);
for(int i=0; i<10 && (b=br.read()) != -1;i++){//从文件中mark的位置开始,读取10个字符并打印在控制台上
System.out.print(b+" ");
}
System.out.println();
System.out.println("第一次读取数据完毕");
br.reset();//重新回到最近标记mark的位置
//b = br.read();发生读写错误时,报IOException
for(int i=0; i<10 && (b=br.read()) != -1;i++){//从文件中mark的位置开始,读取10个字符并打印在控制台上,当输入流没有mark标记,或者mark标记错误时,报IOException
System.out.print(b+" ");
}
System.out.println();
System.out.println("第二次读取数据完毕");
} catch (FileNotFoundException e) {//FileReader(File file)构造方法可能会抛出的异常,检查性异常,是IOException的子类
e.printStackTrace();
System.out.println("文件没找到");
} catch(IllegalArgumentException e){//br.mark(int i)当i<0时会抛出的异常,java.lang包的运行时异常
e.printStackTrace();
System.out.println("mark标记错误");
} catch (IOException e){//br.mark(int i)方法可能会抛出的读写异常,检查性异常
e.printStackTrace();
}finally{
try {
fr.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
控制台结果:
65279 22270 20687 22686 24378 20316 20026 22270 20687 39044
第一次读取数据完毕
65279 22270 20687 22686 24378 20316 20026 22270 20687 39044
第二次读取数据完毕
注:关于异常处理,如果try 。。catch语句后面还有其他的语句,即使发生异常但在catch语句中捕获了,try。。catch语句后面的语句还是会执行,知识终止了try块中发生异常之后的语句的执行。如果发生的是没有捕获的非检查性异常,那么控制台会报异常,并且后面的代码都不会执行。
练习小程序2:用字符输出流将0-99写入到文件中,再用字符输入流读出来显示在控制台上
package test.io.buffered;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedRWTest {
public static void main(String[] args){
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
BufferedWriter bw = null;
int bb = 0;
try {
fw = new FileWriter("E:/技术学习/java/test/Socket/test3.txt");
bw = new BufferedWriter(fw);
fr = new FileReader("E:/技术学习/java/test/Socket/test3.txt");
br = new BufferedReader(fr);
for(int i=0; i<100; i++){
String s = String.valueOf(i);
bw.write(s);
}
bw.flush();
while((bb = br.read()) != -1){
System.out.print((char)bb+" ");
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
fr.close();
br.close();
fw.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
控制台结果:
0 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 7 0 7 1 7 2 7 3 7 4 7 5 7 6 7 7 7 8 7 9 8 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 9 0 9 1 9 2 9 3 9 4 9 5 9 6 9 7 9 8 9 9
注意:如果向文件中写内容的时候,用的是bw.write(i);,最后读出的内容是正确的,但是文件test3里是乱码,这是因为:
FileWriter从类OutputStreamWriter继承的
1、public void write(int c)
throws IOException 写入单个字符。
c - 指定要写入字符的ASCII。
这里data数组中的整数是作为字符的ASCII,最终显示的是ASCII值为这些的字符,并不是这些数字本身。要显示这些数字本身,可改为:
fos.write(String.valueOf(data[i]));
注意valueOf()方法的大小写。
如果改成bw.write(i),读出时直接读出整数,则test3.txt文件里的内容是乱码,但控制台的结果为:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
这是因为读出的是txt文件中字符对应的ASCII码。
练习小程序3:用字符输出流将写入100个随机数,再用字符输入流读出来显示在控制台上
package test.io.buffered;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedRWTest2 {
public static void main(String[] args){
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
BufferedWriter bw = null;
String brs = null;
try {
fw = new FileWriter("E:/技术学习/java/test/Socket/test3.txt");
bw = new BufferedWriter(fw);
fr = new FileReader("E:/技术学习/java/test/Socket/test3.txt");
br = new BufferedReader(fr);
for(int i=0; i<100; i++){
String s = String.valueOf(Math.random());
bw.write(s);
bw.newLine();//写换行
}
bw.flush();
while((brs = br.readLine()) != null){//一行一行地读取数据
System.out.println(brs);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
fr.close();
br.close();
fw.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
控制台结果:
0.6399078291426284
0.5310687702453183
0.07905828584716501
0.9775791681606492
0.9972963523338569
0.6270002181751103
0.32321014986324836
0.11986615499082587
0.6262995365951884
0.6471374123463838
0.18990862494691974
0.4222818554711282
0.38697078015460185
0.36813804843744213
0.4187311475705796
0.8574595913364991
0.5820077024425427
0.22710072783387325
0.25959286952389915
0.18084247442308043
0.6062797615480818
0.25038195025388255
0.20803902668018115
0.42164806730949234
0.8055207170483544
0.40612434707860023
0.9298802823497532
0.9741340249616823
0.13662312072846572
0.22708341675840704
0.532551039593457
0.7046003018948346
0.7659185489756097
0.1645996012699773
0.337639616451081
0.6819464480745878
0.4420214977822119
0.15506860771931874
0.9623602909094771
0.2382356012405551
0.3362606335315719
0.3070224055669991
0.8273073150411092
0.07059925358864483
0.056416805839150874
0.4499394034542309
0.1736512770799683
0.006949859283200466
0.7084314074683844
0.5251618294701433
0.2950084178495689
0.8753513196437038
0.20594558736495272
0.44480467390469114
0.9675341011496371
0.6405295602033448
0.5089744213852115
0.0962994261241209
0.9963616576709458
0.6008893611678685
0.11071690333808759
0.6282230301581236
0.38732823731703636
0.9755349987760249
0.8854467995681203
0.01732058970179995
0.8999998323452159
0.6531763150840912
0.3606257669509091
0.18713813571495808
0.6413273645264072
0.2234340278132939
0.5828245243281741
0.6254392584483947
0.9188368391336925
0.6659407297905311
0.009733584234613901
0.5305880161519759
0.7880762406832532
0.23376755621440615
0.27949064985006944
0.0063371356786929844
0.6011123896488713
0.13508856310676753
0.283746575994804
0.719969586040774
0.3911913080674342
0.5906280248644384
0.7023371386786247
0.74049864944887
0.11324600836773635
0.7243187220974489
0.04512387442540411
0.9816394666939254
0.6007556960627297
0.5307320317427977
0.2905115094340368
0.7885231882741083
0.5965311168205768
0.8552232199742466
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- Java IO学习笔记总结
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
- Java IO学习笔记一
Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...
- Java IO学习笔记一:为什么带Buffer的比不带Buffer的快
作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
随机推荐
- 初码-Azure系列-迁移PHP应用至Azure的一些实践记录和思考
最近客户在逐步迁移应用从阿里云到Azure,这次又轮到一个PHP+MySQL应用了,顺便也记一下流水账. 需求:迁移部署在阿里云上的ECS服务器(系列2,IO优化+2核4G+50G的SSD云盘+10M ...
- Mac上面用来录屏的软件(录制gif图片或者mov)
1.如果是录制视频可以使用Mac自带的QuckTime Player,可以录制电脑桌面也可以录制手机界面 默认是录制电脑左面, 选择录制iPhone,连接上手机,就可以录制界面的内容了 2.如果有需求 ...
- 8.Java 加解密技术系列之 PBE
Java 加解密技术系列之 PBE 序 概念 原理 代码实现 结束语 序 前 边的几篇文章,已经讲了几个对称加密的算法了,今天这篇文章再介绍最后一种对称加密算法 — — PBE,这种加密算法,对我的认 ...
- React+ajax+java 上传图片并预览
之前有在网上找ajax上传图片的资料,大部分的人写得都是用jQuery,但是在这里用JQuery就大才小用了,所以我就自己写了,先上图. 由上图,首先点击上面的选择文件,在选择图片之后,将会自动上传图 ...
- Html_Task4(知识点:水平居中+垂直居中/position/float/border-radius)
任务四:定位和居中问题 任务目标 实践HTML/CSS布局方式 深入了解position等CSS属性 任务描述 实现如 示例图(点击打开) 的效果 灰色元素水平垂直居中,有两个四分之一圆位于其左上角和 ...
- Spring Boot 声明式事务结合相关拦截器
我这项目的读写分离方式在使用ThreadLocal实现的读写分离在迁移后的偶发错误里提了,我不再说一次了,这次是有要求读写分离与事务部分要完全脱离配置文件,程序员折腾了很久,于是我就查了一下,由于我还 ...
- R语言学习路线和常用数据挖掘包(转)
对于初学R语言的人,最常见的方式是:遇到不会的地方,就跑到论坛上吼一嗓子,然后欣然or悲伤的离去,一直到遇到下一个问题再回来.当然,这不是最好的学习方式,最好的方式是——看书.目前,市面上介绍R语言的 ...
- mysql之 innobackupex备份+binlog日志的完全恢复(命令行执行模式)
前言:MySQL的完全恢复,我们可以借助于完整的 备份+binlog 来将数据库恢复到故障点.备份可以是热备与逻辑备份(mysqldump),只要备份与binlog是完整的,都可以实现完全恢复. 1. ...
- javascript的setTimeout()与setTimeout()方法用法总结
setTimeout与setInterval的区别: setTimeout 定义和用法: setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式. 语法: setTimeout(code ...
- angularjs下拉框空白
搜索angularjs下拉框空白,可以出现很多解决方案,但是对于静态字段来说,网上目前还没有找到解决方案,如下: <select class="form-control" n ...