Java I/O体系(三)

有关I/O的类虽然没有全部学习完,但是我们已经了解了一些比较重要的类,下面我们继续学习其他I/O类的使用:

1.   字节流和字符流的桥梁——转换流对象

当我们涉及到字符编码转换时,就会用到,转换流对象主要有主要有:

1)        InputStreamReader:可以将字节输入流转换为字符输入流

2)        OutputStreamWriter:可以将字节输出流转换为字符输出流

举个例子:

InputStreamReader isw=new InputStreamReader(new FileInputStream(“c\\1.txt”),”utf-8”);OutputStreamWriter osw=new OutputStreamWriter(newFileOutputStream(“c\\1.txt”),”utf-8”);

InputStreamReader和OutputStreamWriter都可以在调用时直接指定要使用的字符编码,方便我们使用。

2.   对象流(ObjectInputStream,ObjectOutputStream)

这个流呢,可以将对内存中的对象实例数据存储到文件中或者是网络上,要使用它们来存储对象的话,要存储的对象一定要实现Serializable接口才行,因为Serializable接口中并没有任何药实现的方法,所以它只是一个标识接口,表示实现这个接口的类的对象可以被序列化。

下面就这两个对象来举一个例子吧:

package learn.io;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;class Book implements Serializable {/* 序列化ID */private static final long serialVersionUID =-3178520804420806893L;private String bookName;// 书名private float price;// 价格/* 这里的transient关键字可以防止被其修饰的成员变量被序列化 */private transient String authorName;// 作者名/* 静态变量不存储在堆内存中,所以也不会被序列化 */private static String paperSize = "A4";// 纸张大小public Book(String bookName, float price, String authorName) {this.bookName = bookName;this.price = price;this.authorName = authorName;}
}public class ObjectStreamDemo {public static void main(String[] args) {Book book = new Book("西游记", 58.5f, "吴承恩");saveObj(book);}/*保存对象*/public static void saveObj(Object obj) {try {/* 创建文件输出流 */ObjectOutputStreamoos = new ObjectOutputStream(new FileOutputStream("f:\\book.obj"));/* 把book对象写入到文件中 */oos.writeObject(obj);oos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*读取对象*/public static Object readObj(String path) {Object obj=null;try {/* 创建文件输出流 */ObjectInputStreamois = new ObjectInputStream(new FileInputStream("f:\\book.obj"));/* 把book对象写入到文件中 */obj = ois.readObject();ois.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundExceptione) {e.printStackTrace();}return obj;}}

在上面的代码中也提到一个问题,就是ObjectOutputStream只会将堆内存中的对象数据保存起来,静态成员变量和被transient关键字修饰的成员变量是不会被保存的。

3.   随机读取文件(RandomAccessFile)

这个类比较特殊,它不是继承自前面讲过的In/OutStream或者是Reader/Writer,所以它不算是I/O体系中的子类;但是RandomAccessFile既具备读文件的功能也具备写文件的功能,并且可以获取文件指针位置,它只能操作文件。

还有一点,就是RandomAccessFile在操作文件时,要有文件访问模式,有以下几个模式:

模式名 意义

“r” 以只读方式打开文件,若在此模式下调用写文件的方法会抛出IO异常

“rw” 以读写方式打开文件,如果文件不存在的话会尝试创建该文件

“rws” 此模式相比”rw”模式,还要求对文件的内容或元数据的每个更新都同步更新到底层存储设备

“rwd” 此模式相比”rw”模式,还要求对文件的内容的每次更新都更新到底层存储设备

下面来看看例子:

package learn.io;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFileDemo {public static void main(String[] args) {/*随机写入*/randomWriteFile();/*随机读取*///randomReadFile();}/*随机写入*/public static void randomWriteFile() {try {/*以读写方式打开f:\random.txt文件*/RandomAccessFileraf=new RandomAccessFile("f:\\random.txt", "rw");/*RandomAccessFile中与其他的I/O操作类最大的区别,就是它可以调用seek方法跳过任意字节数再读写文件*/raf.seek(1024);raf.write("你在干嘛?10000".getBytes("gbk"));raf.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*随机读取*/public static void randomReadFile() {try {/*以读写方式打开f:\random.txt文件*/RandomAccessFileraf=new RandomAccessFile("f:\\random.txt", "rw");/*RandomAccessFile中与其他的I/O操作类最大的区别,就是它可以调用seek方法跳过任意字节数再读写文件*/raf.seek(1024);byte[] b=new byte[1024] ;int len=raf.read(b);String text=new String(b,0,len,"gbk");System.out.println(text);raf.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

上面的例子提到了RadomAccessFile.seek()方法,它可以随意的跳过任意字节数(当然不能为负数)来读取文件,方便我们随机的操作文件。

下面我们对I/O的学习进行一些简单的总结:

4.   I/流的操作规则

学习了前面的I/O类图我们知道,这个体系里有很多的类,在这里我画了一个操作和规则流程图:

依据以上原则,应该就可以选择好我们要使用的类是什么了。

例如:我们需要将一个文本文件里面的内容复制到另一个文本文件中,我们就可以进行如下选择和判断(橙色部分):

经过上述判断,最终得出使用的类有FileReader(读)、FilerWriter(写)。

Java I/O体系(三)相关推荐

  1. 遵循Java EE标准体系的开源GIS服务平台之二:平台部署

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  2. 遵循Java EE标准体系的开源GIS服务平台之一:平台架构

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  3. java学习笔记第三部分

    接口 接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来. interface 接口名{//属性//方法(1. 抽象方法 2.默认实现方法 3.静态方法) ...

  4. Java学习笔记(三十五)

    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度.现在将跟着视频做的笔记进行整理.本篇博客是整理Java知识点的第三十五 ...

  5. 20155314 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践

    20155314 2016-2017-2 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点总结 (一)敏捷开发与XP 软件工程:把系统 ...

  6. JavaSecurity和JAAS——Java标准安全体系概述(上)

    前言:java标准安全体系分为两大部分,一个是在JDK1.0引入并在JDK2进行了重构的代表着以代码为中心的授权体系.此体系下,关注的重点在于"这段代码能访问哪些系统资源":另一个 ...

  7. Java基础知识体系_计算机与java

    Java基础知识体系 (一).计算机与java (二).变量与类型 (三).运算符 (四).流程控制 (五).数组 (一).计算机与java 1,计算机:硬件+软件 硬件:客观存在的各种计算机相关设备 ...

  8. 2019-2020-3 《Java 程序设计》第三周知识总结

    2019-2020-3 <Java 程序设计>第三周知识总结 1.类的定义 语法格式如下(加[]表示可选项): [修饰符] class 类名 { 属性定义(声明) 方法定义(声明)} 2. ...

  9. 从Java到Kotlin(三)

    本篇文章主要对比Java跟Kotlin中的类和接口的写法. 目录 一.类的声明 二.构造函数 三.函数的参数 四.创建类的实例 五.数据类 六.枚举类 七.属性 八.内部类 九.可见性修饰符 十.继承 ...

  10. 20165206 2017-2018-2 《Java程序设计》第三周学习总结

    20165206 2017-2018-2 <Java程序设计>第三周学习总结 教材学习内容总结 类:class是关键字,用来定义类. 类声明:例如class People. 对象的声明:类 ...

最新文章

  1. cnzz统计代码引起的Bad Request - Request Too Long
  2. 安装node-sass时出现的错误解决方案(Mac自用,也可以借鉴)
  3. EditText / This text field does not specify an inputType or a hint
  4. DevExpress的TreeList怎样设置数据源,从实例入手
  5. C语言高级编程:汇编分析i++和++i
  6. oracle set autocommit,Oracle Sqlplus SET AUTOCOMMIT
  7. 关于mpvue 切换页面数据没清空
  8. xml 操作组件(NewLife.XCode)
  9. Nginx+uwsgi+Django项目部署后,url长度限制修改
  10. 将multisim中波形在matlab中输出
  11. Session的钝化和活化(序列化和反序列化)
  12. python代码变成so
  13. Uncle Sam 山姆大叔
  14. HTML--图片的插入
  15. three.js 制作机房(上)
  16. iphone 3.1.2开发环境搭建——linux平台
  17. RC专题:阻容串并联电路
  18. HTML最基本的页面
  19. python:读取Excel文件
  20. 微软股价创历史新高 市值突破1万亿美元

热门文章

  1. [ABAP] MOVE-CORRESPONDING 表
  2. 服务器c盘里面哪些是临时文件,别再让你系统产生的大量临时文件占用C盘了的方法...
  3. python爬虫:爬取新浪新闻数据
  4. oracle 11g64 位 安装文件
  5. Elasticsearch:Apache spark 大数据集成
  6. vs2015软件系统开源_2015年最佳开源游戏
  7. 致远OA漏洞学习——帆软组件 ReportServer 目录遍历漏洞
  8. 太阳神朱厚丞:揭秘2018年物联网发展趋势
  9. Codeforces Global Round 16 D2. Seating Arrangements (hard version)
  10. 最重要的三种能力:思考力、行动力、表达力