think in java i o_5.[Think in Java笔记]Java IO系统
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系统相关推荐
- java中sum=a+aa+aaa_Java面向对象基础IO系统
Java面向对象基础–IO系统 一.IO 输入:input 输出:output Java的IO主要包含三个部分 流式部分:IO的主题部分 非流式部分:主要包含一些辅助流式部分的类 文件读取部分的与安全 ...
- Java全国计算机等级考试二级笔记---java部分
Java全国计算机二级笔记 ##---------java部分 作者 :arsoooo 本内容供要参加java全国二级计算机等级考试的参考 这是我初学java时做题总结的,会有自己乱总结出来的不普遍的 ...
- java代码块执行顺序_Java笔记 | Java代码块执行顺序测试
最近笔试常常遇到考察Java代码块执行顺序的题目,网上查看博客错漏百出,特地自己测试了一下. 如有错漏,希望路过的大佬指出来,以便我进行更改. 先上代码吧! public class ClassA { ...
- java webservice 线程_编程实践笔记{Java 线程 并发处理 Webservice}
1,保证线程安全的三种方法: a,不要跨线程访问共享变量 b,使共享变量是final类型的 c,将共享变量的操作加上同步 2,一开始就将类设计成线程安全的, 比在后期重新修复它,更容易. 3, 编写多 ...
- 校招慕课Java面试新手尊享课笔记——Java基础从数据类型到类
面试知识点 数据类型 首先补充说明1个字节8bit boolean: 1字节 byte:1字节 整数 char:2字节 short:2字节 整数 int:4字节 整数 long:8字节 整数 floa ...
- Java 线程同步与死锁 学习笔记
Java 线程同步与死锁 学习笔记 Java 线程同步与死锁 学习笔记 1 多线程共享数据 2 线程同步 3 同步准则 4 线程死锁 1. 多线程共享数据 在多线程操作中,多个线程可能同时处理同一个资 ...
- java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实
好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...
- 双表查询java代码_什么是JDBC?Java数据库连接性简介
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...
- Java数据类型及变量作业_day02、Java变量与数据类型
02_Java变量与数据类型 第二章 变量与数据类型 变量 变量的概述 变量是指内存中的一个存储区域,该区域要有自己的名称(变量名).类型(数据类型),该区域的数据可以在同一数据类型的范围内不断变化值 ...
- java.sql在哪_我的Java访问MS SQL的程序错在哪了?谢谢!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我用的开发工具是Jbuilder2006, MS SQL SERVER 2000. 源程序是: package data; import java.*; ...
最新文章
- rsync配置与应用(转)
- Spring源码学习笔记1
- IE hack 条件语句
- About Manhattan Length
- 最全机器学习种类讲解:监督、无监督、在线和批量学习都讲明白了
- mysql记录是乱码_mysql查询数据库导致中文乱码
- 飞行姿态角度表示: heading pitch roll
- CentOS 7使用通过二进制包安装MySQL 5.7.18
- php qr生成二维码
- 为什么屠呦呦获得了诺贝尔奖却没被评上中科院院士?...
- 简单的Qt倒计时程序--番茄钟
- 计算机十大经典算法整理
- 分享:MSDN visual studio 2010简体中文旗舰版,专业版下载(内置正版密钥)
- 《使用机器视觉从照片中确定西瓜质量》论文笔记
- 基于Bootstrap4写的一个JQuery分页插件
- 未来云计算虚拟化技术的发展趋势
- PHP 递归和递推思想
- 如何最用最懒的方式获取百度地图的行政区边界坐标范围
- PowerBI中的函数日期表
- 如何烧录tizen镜像文件?(图文教程)