1.输入输出

InputStream和OutputStream是面向字节的,Reader和Write则面向字符的且兼容Unicode。

InputStream类型

ByteArrayInputStream:允许将内存的缓冲区当作InputStream使用

StringBufferInputStream:将String转换成InputStream

FileInputStream:用于从文件中读取信息

PipedInputStream:产生用于写入相关InputStreamOutputStream的数据。实现管道化概念

SequenceInputStream:将两个或多个InputStream对象转换成单一InputStream

FilterInputStream:抽象类,作为装饰器的接口

OutputStream类型

ByteArrayOutputStream:在内存中创建缓冲区,所有送往流的数据都要放置在此缓冲区

FileOutputStream:用于将信息写至文件

PipedOutputStream:任何写入其中的信息都会自动作为相关PipedInputStream的输出

FilterOutputStream:抽象类,作为装饰器的接口

FilterInputStream类型

DataInputStream:与DataOutputStream搭配使用,因此可以按照可移植方式从流读取基本数据类型

BufferedInputStream:使用它可以防止每次读取时都得到进行实际写操作。代表使用缓冲区

LineNumberInputStream:跟踪输入流中的行号;可调用getLineNumber()和setLineNumber(int)

PushbackInputStream:具有能弹出一个字节的缓冲区。因此可以将最后的最后一个字符回退

FilterOutputStream类型

DataOutputStream:与DataInputStream搭配使用,因此可以按照可移植方式从流写入基本数据类型

PrintStream:用于产生格式化输出。其中DataOutputStream处理数据的存储,PrintStream处理显示

BufferedOutputStream:使用它可以防止每次发送时都得到进行实际写操作。代表使用缓冲区

RandomAccessFile

RandomAccessFile是一个完全独立的类,直接从Object派生。

2.I/O流的使用

缓冲输入文件

如果想打开一个文件用于字符输入,可以用String或File对象作为文件名的FileInputStream,为了提高速度,对文件进行缓冲,将产生的引用传递给一个BufferedReader构造器。

String filename;

BufferedReader in = new BufferedReader(newFileReader(filename));

从内存输入

StringReader in = newStringReader(BufferedInputFile.read("MemoryInput.java"));

格式化的内存输入

要读取格式化数据,可使用DataInputStream。必须为ByteArrayInputStream提供字节数组。

DataInputStream in = newDataInputStream(new ByteArrayInputStream(BufferedInputFile.read("FormattedMemoryInput.java").getBytes()));

文件输出

FileWriter对象可以向文件写入数据。

String file = "BasicFileOutput.out";

PrintWriter out = new PrintWriter(newBufferedWriter(new FileWriter(file)));

文本文件输出的快捷方式

String file = "BasicFileOutput.out";

PrintWriter out = new PrintWriter(file);

存储和恢复数据

如果使用DataOutputStream写入数据,Java保证可以使用DataInputStream准确地读取数据,无论读和写数据的平台多么不同。

读写随机访问文件

RandomAccessFile除了实现DataInput和DataOutput接口,与I/O继承层次结构的其他部分实现了分离,RandomAccessFile不支持装饰,所以不能将其与InputStream和OutputStream子类的任何部分组合。

3.标准I/O

程序的所有输入都可以来自标准输入,它的所有的输出都可以发送到标准输出,以及所有的错误都可以发送到标准错误。

标准I/O的意义在于:可以很容易的把程序串联起来,一个程序的标准输出可以称为另一个程序的标准输入。

从标准输入中读取

按标准I/O模型,Java提供了System.in、System.out和System.err。其中System.out和System.err实现被包装成了printStream对象,System.in却是一个没有被包装过的未经加工的InputStream。即可以立即使用System.out和System.err,但在读取System.in之前必须对其进行包装。

将System.in包装成BufferedReader来使用,但这要求必须用InputStreamReader把System.in转换成Reader。

BufferedReader in = newBufferedReader(new InputStreamReader(System.in));

将System.out转换成PrintWriter

System.out是一个PrintStream,而PrintStream是一个OutputStream。PrintWriter有一个可以传参的构造器,因此使用哪个构造器把System.out转换成PrintWriter。

PrintWriter out = newPrintWriter(System.out, true);

标准I/O重定向

I/O重定向操作的是字节流,不是字符流;因此使用的是InputStream和OutputStream,而不是Reader和Writer。

4.新I/O

java.nio.*包引入新的Java I/O类库,其目的在于提高速度。速度提高来自于所使用的数据结构更接近操作系统执行I/O方式:通道和缓冲器。

唯一直接与通道交互的缓冲器是ByteBuffer,即可以存储未加工字节的缓冲器。

5.对象序列化

如果对象能够在程序不运行的情况下,仍能保存其运行信息,那么在下次运行时,该对象被重载并拥有的信息与程序上次运行时所拥有信息相同。当然,可以通过将信息写入文件或数据库来实现,但如果将一个对象声明为“持久性”,并处理所有细节,那将会十分方便。

Java的对象序列化是将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。

利用对象序列化可以实现轻量级持久性。持久性意味着一个对象的生存周期不取决于程序是否正在执行,他可以生存于程序的调度之间。通过将一个序列化对象写入磁盘,然后在重新调用程序时恢复该对象,就能够实现持久性的效果。之所以称轻量级,是因为不能用某种关键字来简单地定义一个对象,并让系统自动维护其他细节问题。

Java对象序列化支持两种特性:

一是Java的远程方法调用(RMI),它使存活于其他计算机上的对象使用起来就像存活于本机上一项。

二是对Java Beans来说,对象序列化是必须的。使用一个Bean是,它的状态信息是在设计时进行配置,这种状态信息必须保存下来,并在程序启动时进行后期恢复,这种具体的工作就是有对象序列化完成的。

对象序列化:创建一个OutputStream,然后将其封装在一个ObjectOutputStream对象内,通过调用writeObject()方法即可将对象序列化

对象反序列化:创建一个InputStream,封装在ObjectInputStream内,调用readObject()方法

说明:笔记内容摘自《SCJP考试指南》和《Think in Java》

think in java i o_5.[Think in Java笔记]Java IO系统相关推荐

  1. java中sum=a+aa+aaa_Java面向对象基础IO系统

    Java面向对象基础–IO系统 一.IO 输入:input 输出:output Java的IO主要包含三个部分 流式部分:IO的主题部分 非流式部分:主要包含一些辅助流式部分的类 文件读取部分的与安全 ...

  2. Java全国计算机等级考试二级笔记---java部分

    Java全国计算机二级笔记 ##---------java部分 作者 :arsoooo 本内容供要参加java全国二级计算机等级考试的参考 这是我初学java时做题总结的,会有自己乱总结出来的不普遍的 ...

  3. java代码块执行顺序_Java笔记 | Java代码块执行顺序测试

    最近笔试常常遇到考察Java代码块执行顺序的题目,网上查看博客错漏百出,特地自己测试了一下. 如有错漏,希望路过的大佬指出来,以便我进行更改. 先上代码吧! public class ClassA { ...

  4. java webservice 线程_编程实践笔记{Java 线程 并发处理 Webservice}

    1,保证线程安全的三种方法: a,不要跨线程访问共享变量 b,使共享变量是final类型的 c,将共享变量的操作加上同步 2,一开始就将类设计成线程安全的, 比在后期重新修复它,更容易. 3, 编写多 ...

  5. 校招慕课Java面试新手尊享课笔记——Java基础从数据类型到类

    面试知识点 数据类型 首先补充说明1个字节8bit boolean: 1字节 byte:1字节 整数 char:2字节 short:2字节 整数 int:4字节 整数 long:8字节 整数 floa ...

  6. Java 线程同步与死锁 学习笔记

    Java 线程同步与死锁 学习笔记 Java 线程同步与死锁 学习笔记 1 多线程共享数据 2 线程同步 3 同步准则 4 线程死锁 1. 多线程共享数据 在多线程操作中,多个线程可能同时处理同一个资 ...

  7. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  8. 双表查询java代码_什么是JDBC?Java数据库连接性简介

    JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...

  9. Java数据类型及变量作业_day02、Java变量与数据类型

    02_Java变量与数据类型 第二章 变量与数据类型 变量 变量的概述 变量是指内存中的一个存储区域,该区域要有自己的名称(变量名).类型(数据类型),该区域的数据可以在同一数据类型的范围内不断变化值 ...

  10. java.sql在哪_我的Java访问MS SQL的程序错在哪了?谢谢!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我用的开发工具是Jbuilder2006, MS SQL SERVER 2000. 源程序是: package data; import java.*; ...

最新文章

  1. rsync配置与应用(转)
  2. Spring源码学习笔记1
  3. IE hack 条件语句
  4. About Manhattan Length
  5. 最全机器学习种类讲解:监督、无监督、在线和批量学习都讲明白了
  6. mysql记录是乱码_mysql查询数据库导致中文乱码
  7. 飞行姿态角度表示: heading pitch roll
  8. CentOS 7使用通过二进制包安装MySQL 5.7.18
  9. php qr生成二维码
  10. 为什么屠呦呦获得了诺贝尔奖却没被评上中科院院士?...
  11. 简单的Qt倒计时程序--番茄钟
  12. 计算机十大经典算法整理
  13. 分享:MSDN visual studio 2010简体中文旗舰版,专业版下载(内置正版密钥)
  14. 《使用机器视觉从照片中确定西瓜质量》论文笔记
  15. 基于Bootstrap4写的一个JQuery分页插件
  16. 未来云计算虚拟化技术的发展趋势
  17. PHP 递归和递推思想
  18. 如何最用最懒的方式获取百度地图的行政区边界坐标范围
  19. PowerBI中的函数日期表
  20. 如何烧录tizen镜像文件?(图文教程)

热门文章

  1. MCU VR班會(06)記錄
  2. Redhat下XFS的安装
  3. 真正开始记录自己学习技术过程的点滴
  4. FreeBSD8.0搭建Apache+PHP+MySql平台
  5. J0ker的CISSP之路:复习-Access Control(3)
  6. Java虚拟机——Java内存区域与内存溢出
  7. ubuntu系统下创建软件桌面快捷方式
  8. PXE安装linux
  9. 关于SharePoint 2010体系架构的几个话题
  10. 初级,用powerdesigner生成的sql创建access数据库