Java知识--IO流操作(二)
来源:互联网 发布:门窗下料优化软件 编辑:程序博客网 时间:2024/04/30 15:58
导语
在上一篇博客中 Java知识–IO操作流(一)中,我们已经讲到四个抽象基类:InputStream、OutputStream、Reader、Writer的使用,不清楚的可以去再看一下。
本篇文章重点讲解缓冲流和转换流的使用以及复习IO流体系和选择合适的流来创建对象进行数据的传输。
1、IO缓冲流
Java缓冲流其实本身是不具有IO功能,它是在原始IO流上增加了缓冲功能,使其在传输数据上提高效率,我们也称为装饰流。当需求需要频繁操作读写文件或者传输数据时,使用缓冲流先将数据缓存起来,然后一起写入或读取出来,这样效率会大大提高。
缓冲流四个类:
BufferedInputStream BufferedOutputStream 字节流
BufferedReader BufferedWriter 字符流
我们一般对缓冲流的操作分为四个步骤:
1.创建原始流对象:创建成功就已经有了数据通路了
2.创建缓冲流:需要将原始流对象传入构造方法
3.加了缓冲,直接通过缓冲流读取数据即可
4.关闭流:只需要关闭装饰流
讲了这么多,作为一个程序猿还是喜欢看具体代码来掌握知识点。
实例:
1、已知电脑E盘新建一个io.txt文件.
2、用输出流BufferedWriter 向Stream.txt文件中写入”我叫XXX,性别:男,出生年月:XXXXX””
3、用输入流BufferdeReader 读取获Stream.txt文件内容并打印到控制台
public class Test1 { public static void main(String[] args) throws IOException { File file = new File("E:\\io.txt"); if (!file.exists()) { file.createNewFile(); System.out.println("创建成功"); } FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); String str = "我叫XXX,性别:男,出生年月:XXXXX\n我叫XXX,性别:男,出生年月:XXXXX"; bw.write(str); bw.newLine(); bw.close(); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); }}
为了能全面都介绍到IO缓冲流,我们把上面的字符流BufferedReader 、BufferedWriter 换成字节流BufferedInputStream 、BufferedOutputStream 来实现相同的功能,代码如下:
public class Test1_1 { public static void main(String[] args) throws IOException { File file = new File("E:\\io.txt"); if (!file.exists()) { file.createNewFile(); System.out.println("创建成功"); } OutputStream out = new FileOutputStream(file); BufferedOutputStream bos =new BufferedOutputStream(out); String msg = "我叫XXX3,性别:男,出生年月:XXXXX\n我叫XXX3,性别:男,出生年月:XXXX"; byte[] bytes = msg.getBytes(); bos.write(bytes); bos.close(); InputStream isStream=new FileInputStream(file); BufferedInputStream bis=new BufferedInputStream(isStream); byte[]buff=new byte[100]; int len=-1;//当前的位置 StringBuffer sBuffer=new StringBuffer(); while((len=bis.read(buff, 0, buff.length))!=-1){ String str=new String(buff,0,len);//将字符数组转成字符串 sBuffer.append(str); } System.out.println(sBuffer); bis.close(); }}
2、IO转换流
转换流是指将字节流与字符流之间的转换,包含两个类:InputStreamReader和OutputStreamWriter。
InputStreamReader:字节流转换成字符流,可以按照指定字符集进行解码
OutputStreamWriter:将字符转成字节存到指定的设备中,可以按照指定的字符集进行编码。
在《Java网络编程》中这样描述到,
Reader和Writer最重要的子类是InputStreamReader和OutputStreamWriter类。
InputStreamReader类包含了一个底层输入流,可以从中读取原始字节。它根据指定的编码方式,将这些字节转换为Unicode字符。
OutputStreamWriter从运行的程序中接收Unicode字符,然后使用指定的编码方式将这些字符转换为字节,再将这些字节写入底层输出流中。
例子:
从控制台输入一行文字(BufferedReader来读, BuffereWriter来写,编码集用utf-8),保存到文件中 。
public static void main(String[] args) throws IOException {//数据的方向:标准输入---》内存InputStream is = System.in;//System.in已经是描述好的标准输入流对象,直接使用//转换InputStreamReader ir = new InputStreamReader(is, "utf-8");//加缓冲BufferedReader bfr = new BufferedReader(ir);System.out.println("请输入一行文字:");String msg = bfr.readLine();// 保存到文件中//创建原始流FileOutputStream fos = new FileOutputStream("E:\\save.txt");//转换成字符输出流OutputStreamWriter ops = new OutputStreamWriter(fos, "utf-8");//加入缓冲功能BufferedWriter bfw = new BufferedWriter(ops);bfw.write(msg);bfw.close();}
从电脑中的一个文本文件中的内容打印到屏幕上显示。
String srcFilePath ="E:\\code.java";//1.用FileInputStream创建数据通路FileInputStream fis = new FileInputStream(srcFilePath);//2.用转换流将字节流转换成字符流:参数二是指定的字符编码集的名称InputStreamReader ir = new InputStreamReader(fis,"unicode");//3.用缓冲流包装字符流BufferedReader bfr = new BufferedReader(ir);String line = bfr.readLine();System.out.println(line);bfr.close();
3、复习IO流体系
总结:选择合适的流来创建对象进行数据的传输
1.根据数据的流向:
内存—》外部设备 选择输出流
外部设备—》内存 选择输入流
2.确定数据传输时的单位
纯文本(可以用记事本打开),以字符为单位 字符流
非文本(音乐文件 视频 按照包)以字节为单位 字节流
到第二步,可以确定选用的流的顶层父类
InputStream
OutputStream
Reader
Writer
3.由于顶层类是抽象类,需要继续确定子类,其实就是需要确定外设是什么
文件(硬盘):
输入: FileInputStream FileReader
输出: FileOutputStream FileWriter
内存(暂存):
可以选内存流
输入: ByteArrayInputStream CharArrayReader
输出: ByteArrayOutputStream
键盘:
其实就是标准输入:其实已经有现成的对象 System.in(是InpuStream类型)
屏幕:
其实就是标准输出,已经有现成的流对象 System.out(是PrintStream类型)
网络:
其实就是远端的内存,流对象通过套接字或者Http连接来获取(字节流)
到第3步已经可以进行读写操作了,但是考虑到读写的效率或者读写的方便性,可以加入装饰流。
4.根据需要来进行装饰
如果原始流只能是字节流,但是传输的数据是字符,可以考虑使用转换流: InputStreamReader OutputStreamWriter
快速读写:用缓冲流 4个类 BufferedInputStream BufferedReader BufferedOutputStream BufferedWriter
读写的数据是基本类型的数据:用数据流 DataInputStream DataOutputStream
读写对象:对象流 ObjectInputStream ObjectOutputStream
格式化输出:用打印流 PrintStream PrintWriter
4、总结
经过两天的坚持,终于把Java中的IO流体系写完了,感谢大家的支持。由于刚开始写原创博客经验不足,上一篇有人在后台跟我反映,代码的格式没有排版好,很多条语句都在同一行显示,我这次吸取了经验,认真核对代码格式,保证大家有更好的阅读。本文属于原创,如有转载,请标注原作者,版权归本公众号所有。如果你喜欢我写的文章请关注 程序IT圈 ,欢迎大家继续关注本公众号的技术博文。
推荐阅读:
Retrofit常见注解全解析
Java知识–IO流操作(一)
搜索公众号文章
- Java知识--IO流操作(二)
- Java知识--IO流操作(一)
- java IO操作(二)---字符流的缓冲区
- JAVA基础------IO操作(二)
- java中的IO操作总结(二)
- Java中的IO操作总结(二)
- java中的IO操作总结(二)
- Java IO核心操作(二)
- java IO流之二 IO流操作
- Java知识:IO流
- Java IO实战操作(二)
- JAVA的IO操作(二)
- 【JAVA知识】IO流(1)
- java------IO流(二)
- Java IO流(二)
- JAVA--IO流(二)
- JAVA--IO流(二)
- java提高篇(一) java知识汇总-------io流知识汇总(io学习流程)
- 2017.9.7
- 透视图 html js angular typescript
- 向Matlab中添加“野生”数据并简单分析(2)
- 网络找到的记事本妙用Mark下
- ELF格式与bss段
- Java知识--IO流操作(二)
- 枚举-OpenJudge-1222-熄灯问题
- 静态网页访问增加密码
- 南阳 OJ 2 括号配对问题【栈】
- 自然语言处理入门准备
- 软件工程导论 1.1-1.3 知识点小结
- 18张图用VMware12安装Centos6.9虚拟机
- C++开源库集合
- 中文正则表达式初步使用