流的原理
在Java程序中,对于数据的输入/ 输出操作以“流” (stream) 方式进 行;
J2SDK提供了各种各样的“流”类, 用以获取不同种类的数据;程序 中通过标准的方法输入或输出数 据。

Java的流类型一般位于 java . IO 包中

数据源

data source. 提供原始数据的原始媒介。常见的:数据库、文件、其他程序、内存、网络连接、IO设备。

数据源就像水箱,流就像水管中流着的水流,程序就是我们最终的用户。 流是一个抽象、动 态的概念,是一连串连续动态的数据集合。

流的分类
流的方向:
输入流:数据源到程序(InputStream、Reader读进来)
输出流:程序到目的地(OutPutStream、Writer写出去)
处理数据单元:
字节流:按照字节读取数据(InputStream、OutputStream)

字符流:按照字符读取数据(Reader、Writer)

功能不同:

节点流:可以直接从数据源或目的地读写数据。

处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装。目的主要是简化操作和提高性能.

节点流和处理流的关系:

节点流处于io操作的第一线,所有操作必须通过他们进行;

处理流可以对其他流进行处理(提高效率或操作灵活性)

IO流类的体系

InputStream和OutputStream

Java语言中最基本的两个字节输入输出类。
其他所有字节输入输出流类都继承自这两个基类。
这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类.

Reader和Writer

Java语言中最基本的两个字符输入输出类。
其他所有字符输入输出流类都继承自这两个基类。
这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类

FileInputStream/FileOutputStream
使用FileInputStream读取文件内容
abstract int read( );
int read( byte b[ ] );
int read( byte b[ ], int off, int len );
int available( );
close( );
使用FileOutputStream写内容到文件
abstract void write( int b );
void write( byte b[ ] );
void write( byte b[ ], int off, int len );
void flush( );
void close( );
使用FileInputStream/FileOutputStream复制文件
FileReader和FileWriter
使用FileReader和FileWriter完成文件复制

缓冲字节流
BufferedInputStream和BufferedOutputStream
FileInputStream和FileOutputStream是节电流
BufferedInputStream和BufferedOutputStream是处理流(包装流)
读文件和写文件都使用了缓冲区,减少了读写次数,从而提高了效率
当创建这两个缓冲流的对象时时,会创建了内部缓冲数组,缺省使用32字节大小的缓冲区.
当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区
当写入数据时,首先写入缓冲区,当缓冲区满时,其中的数据写入所连接的输出流。使用方 法flush()可以强制将缓冲区的内容全部写入输出流
关闭流的顺序和打开流的顺序相反.只要关闭高层流即可,关闭高层流其实关闭的底层节点流Flush的使用:
手动将buffer中内容写入文件
缓冲字符流
BufferedReader
readLine() 读取一个文本行的数据
BufferedWriter
newLine(); 写入一个行分隔符。

使用缓冲字符流是复制文本文件常用的方式

转换流

InputStreamReader和OutputStreamWriter

用于将字节流转化成字符流,字符流与字节流之间的桥梁

InputStreamReader的作用是把InputStream转换成Reader

OutputStreamWriter的作用是把OutputStream转换成Writer

存在将字节流转换成字符流的转换流,因为字符流操作文本更简单

不存在把字符流转换成字节流的转换流,因为没有必要

System. in 代表标准输入,即键盘输入,是InputStream的

打印流

PrintStream

PrintStream提供了一系列的print()和println(),可以实现将基本数据类型格式化成字符串输出。 对象类型将先调用

toString(),然后输出该方法返回的字符串

System.out就是PrintStream的一个实例,代表显示器

System.err 也是PrintStream的一个实例,代表显示器

PrintStream的输出功能非常强大,通常需要输出文本内容,都可以将输出流包装成 PrintStream后进行输出

PrintStream的方法都不抛出IOException
PrintWriter
PrintStream的对应字符流,功能相同,方法对应。
PrintWriter的方法也不抛出IOException
复制文件时可以使用PrintWriter代替BufferedWriter完成,更简单
缓冲字节流
DataInputStream和DataOutputStream
提供了可以存取所有Java基础类型数据(如:int,double 等)和String的方法。

处理流,只针对字节流,二进制文件

对象序列化

对象序列化 (Serialization)

将Java对象转换成字节序列(IO字节流)

对象反序列化 (DeSerialization)

从字节序列中恢复Java对象

为什么序列化

序列化以后的对象可以保存到磁盘上,也可以在网络上传输,使得不同的计算机可以共享对 象.(序列化的字节序列是平台无关的)

对象序列化的条件

只有实现了Serializable接口的类的对象才可以被序列化。Serializable接口中没有任何的方法,实现 该接口的类不需要实现额外的方法。

如果对象的属性是对象,属性对应类也必须实现Serializable接口

序列化能保存的元素

只能保存对象的非静态成员变量

不能保存任何成员方法和静态的成员变量

不保存transient成员变量

如果一个对象的成员变量是一个对象,这个对象的成员变量也会保存

串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存

使用对象流把一个对象写到文件时不仅保证该对象是序列化的,而且该对象的成员 对象也必须是可序列化的。

如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操 作将会失败,并且会抛出一NotSerializableException。我们可以将这个引用标记为 transient,那么对象仍然可以序列化。

同一个对象多次序列化的处理

所有保存到磁盘中的对象都有一个序列化编号

序列化一个对象中,首先检查该对象是否已经序列化过

如果没有,进行序列化

如果已经序列化,将不再重新序列化,而是输出编号即可

如果不希望某些属性(敏感)序列化,或不希望出现递归序列

为属性添加transient关键字(完成排除在序列化之外)

自定义序列化(不仅可以决定哪些属性不参与序列化,还可以定义属性具体如何序列化)

序列化版本不兼容

修改了实例属性后,会影响版本号,从而导致反序列化不成功

解决方案:为Java对象指定序列化版本号serialVersionUID

字节/字符数组/字符串流

ByteArrayInutStream和ByteArrayOutputStream

数据源或目的地为:字节数组
只有字节流,没有字符流
节点流
CharArrayReader和CharArrayWriter
数据源或目的地为:字符数组
只有字符流,没有字节流
节点流
StringReader和StringWriter
数据源或目的地为:字符串
只有字符流,没有字节流
节点流

IO总结

java bufferedwriter 写入tab_Java基础-IO流相关推荐

  1. # Java基础——IO流

    Java基础--IO流 File类的使用(熟悉构造器和方法的使用) File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) File类的声明在java.io包下 文件和文件目录路径的抽象表示 ...

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

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

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

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

  4. Java基础IO流之字符流的使用

    ☆引言☆ 大家好,我是痛而不言笑而不语的浅伤.IO流分为字节流和字符流,而上一篇文章我们学习了字节流(Java基础IO流之字符流的使用),这篇文章带大家一起来学习字符流吧.对文章中描述错误的希望大家积 ...

  5. 菜鸟学习笔记:Java提升篇5(IO流1——IO流的概念、字节流、字符流、缓冲流、转换流)

    菜鸟学习笔记:Java IO流1--IO流的概念.字节流.字符流.缓冲流.转换流 IO流的原理及概念 节点流 字节流 文件读取 文件写出 文件拷贝 文件夹拷贝 字符流 文件读取 文件写出 处理流 缓冲 ...

  6. 菜鸟学习笔记:Java提升篇6(IO流2——数据类型处理流、打印流、随机流)

    菜鸟学习笔记:Java IO流2--其他流 字节数组输入输出流 数据类型处理流 基本数据类型 引用类型 打印流 System.in.System.out.System.err 随机流RandomAcc ...

  7. Java裁剪音乐,利用IO流

    ** Java裁剪音乐,利用IO流 ** 主方法 public static void main(String[] args) throws IOException {//输入流对象,路径要裁剪文件路 ...

  8. 黑马程序员-JAVA基础-IO流之字符流和字符流缓冲区

    ------- android培训.java培训.期待与您交流!------- Java 的IO 流 是实现输入和输出的基础,Java 中把不同的输入.输出源抽象表述为"流" (S ...

  9. java bufferedwriter 写入tab_Java-IO流

    目录 1.流的概念和作用 1.2.Java IO所采用的模型 1.3.IO流的分类 1.4.IO流特性 1.5.IO流常用到的五类一接口 1.6.Java IO流对象 1.6.1.输入字节流Input ...

最新文章

  1. 42张图详解 NAT : 换个马甲就能上网
  2. Java实现最小堆一
  3. 算法族的集中管理——策略模式
  4. IntelliJ IDEA普通的Java项目如何转成Maven Web项目
  5. BZOJ-2005能量采集-数论函数
  6. 如何使用github中的pull request功能?
  7. 编写超级可读代码的15个最佳实践
  8. 设置货币值中使用的小数位数
  9. python之OrderedDict类
  10. 修复VC6.0打开菜单项以及添加工程菜单项
  11. OpenCV4--->基础函数,与操作
  12. 动态规划初级篇(上)
  13. Windows系统封装(四)正式封装和测试。
  14. 魅蓝metal刷android 6,魅蓝metal刷机包 Flyme 6.1.0.0Y稳定版 对系统稳定性和功耗表现进行了特定优化...
  15. Android新手入门,怎样才是正确的学习方式
  16. 谷歌地球倾斜模型3Dtiles格式cesium格式一键导入查看
  17. finalcut剪切快捷键_Final Cut Pro X 常用键盘快捷键
  18. 一款功能强大的设备调试、接口调试工具
  19. 微积分的历史(五):发展之泰勒公式(上)
  20. Docker+Frp+NGinx+云服务器 实现HTTPS内网穿透

热门文章

  1. myBatis如何返回count(*)得到的int值
  2. Edge on Linux?微软:会有的,但不是现在
  3. 聚焦一切关联需求-企业数字化转型:外部驱动力之客户篇
  4. i/o传输数据打印换行符的方法
  5. SocialFish-kali下社会工程学钓鱼工具
  6. win7/WIN8.1(x64) 下使用MSDE WIN10不行
  7. 使用 libpcap 实现网络转包
  8. eclipse中修改内存
  9. Java设计模式(六)----适配器模式
  10. iphone 各种例子 汇总