一、缓冲流的使用

  每个字节流都有对应的缓冲流:

  

  BufferedInputStream / BufferedOutputStream

  构造器:

  

  

  方法摘要与对应节点流类似

  使用缓冲流实现文件复制:实际中也是;其中流的关闭只需要关闭缓冲流,内部嵌套的字节流会自动关闭。

    @Test
public void testBuffered1() {
// 同样需要先关联文件,注意文本使用Reader Writer,非文本使用fis fos
File file1 = new File("D:\\test\\1.jpg");
File file2 = new File("D:\\test\\2.jpg");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
// 创建节点流
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
// 将节点流包装为缓冲流
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
// 准备缓冲的数组
byte[] bytes = new byte[20];
int len;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
// 写完后将最后的进行刷新一下
bos.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流,注意流的关闭顺序,直接关闭缓冲流时,会自动先关闭对应节点流
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

  BufferedReader与BufferedWriter的使用也是与对应节点流类似

  演示独有的readLine方法:

    @Test
public void testBufferedReader() {
File file1 = new File("D:\\test\\hello.txt");
BufferedReader br = null;
try {
FileReader fr = new FileReader(file1);
br = new BufferedReader(fr);
// 使用br独有的读行的操作
String s = null;
while ((s = br.readLine()) != null) {
System.out.println(s);
} } catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

  // 注意,读取doc文档需要使用字节流(即使文档全部是文本组成,doc也已经不是纯文本文件了)

二、转换流的使用

  InputStreamReader / OutputStreamWriter

  JDK中的介绍如下:需要分清编码与解码的过程

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:

 BufferedReader in
= new BufferedReader(new InputStreamReader(System.in)); OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。 每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。 为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如: Writer out
= new BufferedWriter(new OutputStreamWriter(System.out)); 代理对 是一个字符,它由两个 char 值序列表示:高 代理项的范围为 '\uD800' 到 '\uDBFF',后跟范围为 '\uDC00' 到 '\uDFFF' 的低 代理项。 错误代理元素 指的是后面不跟低代理项的高代理项,或前面没有高代理项的低代理项。 此类总是使用字符集的默认替代序列 替代错误代理元素和不可映射的字符序列。如果需要更多地控制编码过程,则应该使用 CharsetEncoder 类。

  

  解码,解成我们能够看得懂的,也就是解成字符串

  简单示例如下:(不是特别重要,不作特别介绍这里)

 @Test
public void test1() {
File file = new File("D:\\test\\hello.txt");
// 异常处理暂略
FileInputStream fis = new FileInputStream(file);
// 字节流到字符流的解码
InputStreamReader isr = new InputStreamReader(fis, "GBK");
BufferedReader br = new BufferedReader(isr);
String s;
// 缓冲流的操作略去
}

三、标准输入输出流

  

  也就是我们常见的Syetem.out/in

  接收用户输入使用示例:

    @Test
public void test1() {
BufferedReader br = null;
try {
InputStream in = System.in;
// 转换成字符流
InputStreamReader isr = new InputStreamReader(in);
br = new BufferedReader(isr);
String s;
while (true) {
System.out.println("请输入字符串:");
s = br.readLine();
if ("exit".equalsIgnoreCase(s)) {
break;
}
String s1 = s.toUpperCase();
System.out.println(s1);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

 四、其它流

  1.打印流

  打印流都是输出流,所以分为两个:字节打印流和字符打印流

  

  像我们常用的Sytem.out返回的就是一个打印流

  关于打印流的信息,请参见 酒香逢 的随笔:http://www.cnblogs.com/fnz0/p/5423201.html

  2.数据流

  用来处理基本数据类型(包括String等)

  

  数据流请参见:http://baihe747.iteye.com/blog/2072146

  3.对象流

    推荐的序列化与反序列工具是hutool的ObjectUtil的相关方法!

  

  序列化:

  

  

  序列化一个类的示例:(必须实现相关接口,并且属性也需要实现Serializable接口)——ObjectOutputStream

   @Test
public void test1() {
// 对象
Person p1 = new Person("小明", 18);
Person p2 = new Person("小红", 23);
ObjectOutputStream oos = null;
try {
// 对象流
FileOutputStream fos = new FileOutputStream(new File("person.txt"));
oos = new ObjectOutputStream(fos);
oos.writeObject(p1);
oos.writeObject(p2);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
}
class Person implements Serializable{
String name;
Integer age; public Person(String name, Integer age) {
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

  应当加上版本号声明:

class Person implements Serializable{
private static final long serialVersionUID = 1L;

  结果:

  

  反序列化:——ObjectInputStream

  @Test
public void test2() {
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream(new File("person.txt"));
ois = new ObjectInputStream(fis);
// 反序列化到内存中了
Person p1 = (Person) ois.readObject();
System.out.println("p1 = " + p1);
Person p2 = (Person) ois.readObject();
System.out.println("p2 = " + p2);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

  结果:

  

  当然,除了上述的文件流,我们还可以进行byte[]数组流的序列化与反序列化,相关的工具类,推荐如下:

package cn.itcast_03_netty.sendobject.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class ByteObjConverter {
/**
* 使用IO的inputstream流将byte[]转换为object
* @param bytes
* @return
*/
public static Object byteToObject(byte[] bytes) {
Object obj = null;
ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
ObjectInputStream oi = null;
try {
oi = new ObjectInputStream(bi);
obj = oi.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bi.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
oi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* 使用IO的outputstream流将object转换为byte[]
* @param bytes
* @return
*/
public static byte[] objectToByte(Object obj) {
byte[] bytes = null;
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = null;
try {
oo = new ObjectOutputStream(bo);
oo.writeObject(obj);
bytes = bo.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bo.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
oo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bytes;
}
}

  4.随机存取流

    可以解决之前不能追加文件内容,只能覆盖的情况

  

  

Java基础—IO小结(二)缓冲流与其它流的使用的更多相关文章

  1. Java基础——iO(二)

    接着上一篇,继续做学习笔记.学IO这块,突然找到一点好处,好像以后操作电脑,尤其是电脑里的文件啥的,可以很少的用鼠标了.添加.修改.删除啥的,几行代码就可以搞定了.这只是我一个初学者的一点小心思,IO ...

  2. Java基础—IO小结(一)概述与节点流

    一.File类的使用  由于file类是一个基础类,所以我们从file类开始了解.(SE有完善的中文文档,建议阅读) 构造器: 常用方法:——完整方法请参见API API API!!! File做的是 ...

  3. Java基础IO类之缓冲流

    首先要明确一个概念: 对文件或其他目标频繁的读写操作,效率低,性能差. 使用缓冲流的好处是:能够高效的读写信息,原理是先将数据先缓冲起来,然后一起写入或者读取出来. 对于字节: BufferedInp ...

  4. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)

    Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...

  5. Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)

    Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...

  6. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  7. Java基础-IO流对象之字节流(Stream)

    Java基础-IO流对象之字节流(Stream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在前面我分享的笔记中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现 ...

  8. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  9. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

随机推荐

  1. July 18th 2017 Week 29th Tuesday

    My heart is stronger now that you are in it. 我的心里有了你,从此变得更强大. You will no longer feel lonely if ther ...

  2. January 23 2017 Week 4 Monday

    Knowledge is long, life is short. 吾生也有涯,而知也无涯. I often feel that I have a lot of things to learn, ne ...

  3. ZT自贴吧 说说你是怎么和恋人确定恋爱关系的?

    http://www.baidu.com/link?url=svJFMqibXXhJUiGDaDr1obOyrIb9o0TqO5JWFtMuM-l7ndaRlGMyuRQKCOHh-Pj0

  4. springmvc常用注解标签详解(转载)

    1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  5. BZOJ5301:[CQOI2018]异或序列(莫队)

    Description 已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l.r ,问在 [l,r] 区间内,有多少连续子 序列满足异或和等于 k . 也就是说,对于所 ...

  6. Linux学习总结(七)-磁盘管理 du df fdisk

    一 命令df df,即disk free,可用来查看当前系统的挂载情况,也可以用来查看整体磁盘的使用情况df 不带参数,默认以KB单位显示df -i -----查看inodes 使用情况,要清楚理解i ...

  7. LayIM.NetClient 组件开发记录

    前言 好久没写博客了.前阶段看了下Hangfire组件,后来对其代码比较感兴趣,当时不太了解他如何生成的页面和一些访问请求等.后来看了下源代码,发现原来是 OWIN 在搞怪.于是乎开始深入研究Hang ...

  8. Intellij IDEA如何删除项目

    1.      删除某个项目 1)       选中项目,并关闭 2)       File-Open,再选中相应的项目,并delete即可,它会同时在硬盘上删除

  9. A Gentle Introduction to Transfer Learning for Deep Learning | 迁移学习

    by Jason Brownlee on December 20, 2017 in Better Deep Learning Transfer learning is a machine learni ...

  10. 【luogu P1825 [USACO11OPEN]玉米田迷宫Corn Maze】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1825 带有传送门的迷宫问题 #include <cstdio> #include <cst ...