一、缓冲流的使用

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

  

  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 20th 2017 Week 29th Thursday

    The darkness is no darkness with you. 有了你,黑暗将不再是黑暗. The darkness will not be driven out if we failed ...

  2. java IO流 总结

    [-] 1什么是IO 2数据流的基本概念 1 数据流 2 输入流Input  Stream 3 输出流 数据流分类 3 标准IO 命令行参数 标准输入输出数据流 4javaIO层次体系结构 5 非流式 ...

  3. BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  4. UVA10820 Send a Table

    嘟嘟嘟 [欧拉函数] 大致题意:如果知道f(a, b),就可以求出f(a * k, b * k).现给出一个n,求至少需要知道几个二元组(a, b),使所有的f(x, y)都能求出来.(1 <= ...

  5. PAT——1055. 集体照 (比较comparable和comparator的区别)

    拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位置为m ...

  6. HDU 2036 改革春风吹满地 (求多边形面积)

    传送门: 改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  7. Gradle Goodness: Running Java Applications from External Dependency

    With Gradle we can execute Java applications using the JavaExec task or the javaexec() method. If we ...

  8. java 时间日期

    Java 日期时间 java.util 包提供了 Date 类来封装当前的日期和时间. Date 类提供两个构造函数来实例化 Date 对象. 第一个构造函数使用当前日期和时间来初始化对象. Date ...

  9. Mahout介绍

    3.11简介 Mahout:是一个Apache的一个开源的机器学习库,主要实现了三大类算法Recommender (collaborative filtering).Clustering.classi ...

  10. flask模板语言,装饰器,路由及配置

    1.模板语言jinja2 Flask中默认的模板语言是Jinja2 1.0 模板传参 from flask import Flask,render_template app = Flask(__nam ...