一、缓冲流的使用

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

  

  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. node-7.2.1 already installed, it's just not linked

    直接在terminal下运行以卸载node和nvm: sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,shar ...

  2. spring集成ehcache本地缓存

    1.maven依赖 <!-- ehcache 相关依赖 --> <dependency> <groupId>net.sf.ehcache</groupId&g ...

  3. 整理了一下关于KVO的姿势

    http://www.jianshu.com/p/d104daf7a062 1) + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)th ...

  4. css3的代替图片的三角形

    1.小三角形(与边框结合,不兼容IE8) .callout{ position: relative; width: 100px; height: 100px; background: #fce6ed; ...

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

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

  6. REG小探

    根键名称缩写对照表   常用数据类型

  7. 20165214 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9

    <网络对抗技术>Exp6 信息搜集与漏洞扫描 Week9 一.实验目标与内容 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 使用搜索 ...

  8. java三大特性(封装、继承、多态)

    oop(面向对象程序设计)具有三大特性:封装.继承.多态 一.封装 封装就是讲类的信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类的实现隐藏信息的操作和访问. 实现封装 1.需要修改属性的访问 ...

  9. PAT——1014. 福尔摩斯的约会

    大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”.大侦探很快就明白了,字条 ...

  10. 【SQLSERVER学习笔记】分页存储过程+调用

    USE [数据库名] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[存储过程名] @pageI ...