一、字节流

字节流是通过字节来进行读写操作的,他的使用对象相比于字符流来说更加的广泛。这主要是因为他们读写文件的方
式而决定的。字符流读写文件时是将读取到的字节通过默认编码表转换成字符,在通过默认编码表将字符转换成字节存储
到文件里,在这个过程中虽然提高了文本文档的读写效率,但是在面对非文本文件时 - 字节转换成字符的这个操作因为编
码表的原因可能会造成丢失字节,导致文件的缺失。所以在对非文本文档进行操作时要使用字节流。

二、InputStream类

此抽象类是字节输入流的所有类的超类(读),其常用子类有 FileInputStream、 ObjectInputStream 。
而此类的常用方法与Reader类相似,其常用方法有:
(1)关闭此输入流并释放与该流关联的所有系统资源、close()

(2)从输入流中读取数据的下一个字节、 read()

(3)从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中、read(byte[] b)

(4)将输入流中最多 len 个数据字节读入 byte 数组、read(byte[] b, int off, int len)

1、FileInputStream类

FileInputStream类为InputStream抽象类的常用实现类,他可以用于读取视频、音频、图片等非文本文件,也可以
读取文本文件(读取文本文件推荐使用FileReader类),其构造方法与FileReader类似,可以传递路径名或File对象为
参数。它继承了InputStream类的全部方法。

2、ObjectInputStream类

ObjectInputStream类主要用于对象的读取,继承了InputStream类的全部方法。他的构造方法为:
(1)创建从指定 InputStream 读取的 ObjectInputStream

ObjectInputStream(InputStream in)

因其读取对象的特性,他有一些自己独有的自己独有的方法:
(1)从 ObjectInputStream 读取对象、readObject()

两种遍历方式的举例:

 //抛出异常
private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {
//根据传入的FileInputStream对象创建ObjectInputStream对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("aa.txt"));
//遍历文件直到无文件可读,捕获抛出的异常,结束循环
try {
while (true) {
//读取文件
Object readObject = ois.readObject();
System.out.println(readObject);
}
//捕获异常结束循环
} catch (EOFException e) {
System.out.println("已经输出完毕");
//一定会执行,一般用于关闭流
} finally {
//关闭资源
ois.close();
}
}

将对象传入到集合中,将集合写入文件,读取集合

 public static void main(String[] args) throws Exception, IOException {
// method();
// method2();
// 创建学生对象
Student student = new Student("张三", 18);
Student student2 = new Student("白洁", 19);
Student student3 = new Student("赵四", 39);
// 创建集合
ArrayList<Student> lists = new ArrayList<>();
// 将学生丢向加入到集合中
lists.add(student);
lists.add(student2);
lists.add(student3);
// 根据传入的FileOutputStream对象创建ObjectOutputStream对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("bb.txt"));
// 将集合写入
oos.writeObject(lists);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("bb.txt"));
// 从文件中读取集合
Object readObject = ois.readObject();
// 向下转型
ArrayList<Student> re = (ArrayList<Student>) readObject;
// 遍历集合
for (Student student4 : re) {
System.out.println(student4);
}
// 关闭资源
ois.close();
oos.close();

三、OutputStream类

此抽象类是表示输出字节流的所有类的超类(写),其常用子类有 FileInputStream、 ObjectInputStream。
此类的常用方法与Reader类相似,其常用的实现类有:
(1)FileOutputStream类

(2)ObjectOutputStream类
    而此类的常用方法与Writer类相似,其常用方法有:
(1)关闭此输出流并释放与此流有关的所有系统资源、close()

(2)刷新此输出流并强制写出所有缓冲的输出字节、flush()

(3)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流、write(byte[] b, int off, int len)

1、FileOutputStream类

FileOutputStream类为OutputStream抽象类的常用实现类,其构造方法与FileWriter类似,可以传递路径名或
File对象为参数。它继承了OutputStream类的全部方法。

用字符流拷贝文件举例:

 //创建File对象
File file = new File("D:\\songs\\小苹果.mp4");
//根据file创建FileInputStream对象
FileInputStream fi=new FileInputStream(file);
//定义int用来存数组长度
int i;
//定义byte数组
byte[] b=new byte[1024];
//根据给定路径创建FileOutputStream对象
FileOutputStream fo=new FileOutputStream("D:\\aa\\小苹果.mp4");
//循环读取
while ((i=fi.read(b))!=-1) {
//写入文件
fo.write(b, 0, i);
}
//关闭资源
fo.close();
fi.close();

2、ObjectOutputStream类

可以用ObjectOutputStream类将对象写入到文件中,要注意的是被写入的对象的类要进行序列化,否则你在对类进行
修改时会报异常。
    对类序列化举例:

 class Student implements Serializable {
/**
* 序列号如果不生成系统会自动生成,但是你更改类的成员变量序列号也会变,就会报错所以要重写
*/
//实现Serializable接口进行序列化
private static final long serialVersionUID = 4123259833120003092L;
private String name;
private int age; public Student() {
super();
// TODO Auto-generated constructor stub
} public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}

写入对象举例:

 //创建ObjectOutputStream对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("aa.txt"));
//创建学生类
Student student = new Student("张三", 18);
Student student2 = new Student("白洁", 19);
//写入数据
oos.writeObject(student);
oos.writeObject(student2);
//关闭资源
oos.close();

四、转换流的使用

转换流不属于字节流的子类,而是Writer和Reader的子类,因为它涉及到了字节流和字符流的转换所以在这里说。

1、InputStreamReader(字符输入流)

字符输入流是字节流通向字符流的桥梁。它可以将节符流对象转化成字符流对象,因为是输入,所以字节数据会被转
换成字符数据。其常用的构造方法为:InputStreamReader(InputStream in) 。

2、OutputStreamWriter(字符输出流)

他是字符流通向字节流的桥梁。它可以将字节流对象转换成字符流对象,因为是输出,所以字符数据会被转换成字节
数据。其常用的构造方法为:创建使用默认字符编码的 - OutputStreamWriter(OutputStream out)。

举例:

 public static void main(String[] args) throws IOException {
// 标准输入流
InputStream in = System.in;
// 转换流
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 创建FileWriter对象
FileWriter fw = new FileWriter("a.txt");
// 存储数组长度
int i;
char[] c = new char[1024];
// 循环读取
while ((i = inputStreamReader.read(c)) != -1) {
// 将数组写入到指定文件,从0一直写到i,目的是为了防止出现重复数据
fw.write(c, 0, i);
// 刷
fw.flush(); }
// 关闭资源
fw.close();
inputStreamReader.close();
}
}

JAVA基础-IO流(二)的更多相关文章

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

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

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

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

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

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

  4. Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)

    Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...

  5. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  6. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

  7. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

  8. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

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

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

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

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

随机推荐

  1. 项目实战12.2—企业级监控工具应用实战-zabbix操作进阶

    无监控,不运维.好了,废话不多说,下面都是干货. 流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html 一.U ...

  2. 数据库、ArcCatalog空间数据源正常访问,数据库设置没问题时,ArcEngine连接SDE时报"ORA-12560: TNS: 协议适配器错误"的解决办法;ArcEngine连接SDE总结

    碰到的问题描述: 通过C# 基于ArcEngine写SDE直连的时候测试项目连接属性设置为如下: tPropSet.SetProperty("User", "GISDAT ...

  3. 小白的Python之路 day3 函数

    1.函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 1 2 ...

  4. 写给自己的web总结——css篇(1)

    上一篇写了关于html的知识,算是小试牛刀,这次来尝试写一下css. 初步了解css css的全称为cascading style sheet-- 层叠样式表,通过编入代码来对html里的标签做出各种 ...

  5. JavaWeb 例子 JDBC+JSP登陆注册留言板

    注册页面: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  6. AntData.ORM框架 之 DotnetCore

    开源地址:https://github.com/yuzd/AntData.ORM   CodeGen使用请参考http://www.cnblogs.com/yudongdong/p/6421312.h ...

  7. nova创建虚拟机源码分析系列之五 nova源码分发实现

    前面讲了很多nova restful的功能,无非是为本篇博文分析做铺垫.本节说明nova创建虚拟机的请求发送到openstack之后,nova是如何处理该条URL的请求,分析到处理的类. nova对于 ...

  8. Nodejs进阶:crypto模块中你需要掌握的安全基础

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址. 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速度增长.同时,各类网络安全问题层出不穷.在信 ...

  9. Linux下巧用cat与EOF实现文件的替换和追加

    本文地址http://comexchan.cnblogs.com/,作者Comex Chan,尊重知识产权,转载请注明出处,谢谢! ================================== ...

  10. 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)

    很长一段时间关注在Java Web开发的方向上,提及到Jave Web开发就绕不开Spring全家桶系列,使用面向百度,谷歌的编程方法能够完成大部分的工作.但是这种不系统的了解总觉得自己的知识有所欠缺 ...