java note 8 io


学习代码
https://github.com/starrQWQ/java_code/tree/master/javaSE基础

从迅雷下载:
​ 迅雷服务器硬盘->服务器内存->本地计算机内存->本地硬盘

流根据方向分为输入流和输出流(相对内存而言)
InputStream/OutputStream,Read/Write

流根据读取数据的方式分为字节流和字符流
java一个字符2个字节。
字符流读纯文本(char[])
字节流读二进制文件。(byte[])

java中字节流都以Stream结尾,字符流都含Reader/Writer。

java有16个重点流

功能
文件相关FileInputStream FileOutputStream
FileReader FileWriter
缓冲相关BufferedInputStream BufferedOutputStream
BufferedReader BufferedWriter
二进制数据DataInputStream DataOutputStream
对象序列化ObjectInputStream ObjectOutputStream
字节流转字符流InputStreamReader OutputStreamWriter
标准输出流PrintStream PrintWriter

四大家族:InputStream,OutputStream,Reader,Writer.

输出比输入多了PrintStream/PrintWriter

api介绍

public abstract class InputStream
extends Object
implements Closeable
subclass:
​ FileInputStream , FilterInputStream(不常用), ObjectInputStream

#文件流

文件字节流

FileInputStream

3种构造方法查看api
注意FileNotFoundException。
路径在windows中‘/’和‘\’都认,推荐无转义的前者。
为保证流释放,finally中close(),该方法来自Closable。

注意捕捉FileNotFoundException和IOException的先后顺序。

T2
read()缺点:
​ 访问频繁,伤害硬盘,效率低。

T3
所以引入read(byte[]),搭配new String(byte[],offset,length)
length即read()的返回值。

注意用print还是println.

available()
skip()

FileOutputStream

构造:
FileOutputStream(String name, boolean append)
谨慎决定是否追加!!!!!
注意fos.flush(),保证数据完全写入硬盘。

write(byte[])会写入数组所有数据

用FileOutputStream和FileInputStream可以复制文件

文件字符流

FileReader继承自转换流InputStreamReader
因为是以2字节字符为单位,要读1kb就需要new char[512]

优点:读汉字方便。流容易乱码。

FileWriter的write()可以写String.

#Buffer流

字符流

常用的方法:readLine();
输出时需要println()

构造方法:
BufferedReader(Reader in)

FileReader fr = new FileReader();
BufferedReader br = new BufferedReader(fr);

根据出现的位置,流可以分为:节点流fr,包装流bf(又叫处理流).

装饰者模式
BufferedReader br = new BufferedReader(new FileReader("text"))
关闭时只需关闭最外层包装流。

new BufferedReader(new InputStreamReader(new FileInputStream("InputStreamReaderTest01.java")));

这里是和转换流搭配使用的。

查询api,java.lang.System有两个静态变量:
static InputStream in
static PrintStream out

Scanner s = new Scanner(System.in);
String str = s.next();

以空格为终止。

BufferedWriter父类型为Writer,write()可以直接写String。
同理有OutputStreamWriter()。

数据字节流

DataInputStream和DataOutputStream
这两个不常用
它们包含数据类型
写入的不是字符串而是二进制数据
DataInputStream读时应事先知道DataOutputStream的存储顺序。

标准输出流

PrintStream,以字节方式默认输出到控制台
PrintWriter,以字符方式。。。。

System.out.pritnln()
//相当于
PrintStream ps = System.out;
ps.println();

java.lang.SystemsetOut()方法。

System.setOut(new PrintStream(New FileOutputStream("log")))
通常这样记录日志

对象序列化

序列化(serial):对象 内存——>硬盘
反过来则是反序列化deserial
实际是把数据分组编号后传输存储。

被序列化的类需要实现Interface Serializable
该接口没有方法,是标识性接口。
这样的接口还有java.lang.Cloneable

serialVersionUID,序列化版本号
反序列化时readObject()还要创建类,需要用到类的class文件
如果反序列化时修改代码生成新的class且重名
则反序列化时会出现

InvalidClassException
stream class serialVersionUID:…
local class serialVersionUID…

因为实现Serializable的类JVM会给该类添加一个static final long serialVersionUID;

所以为避免因为升级而导致的反序列化失败,需要手动添加serialVersionUID

如果不想让某个属性(如name)参与序列化,则要使用transient修饰。
transient String name
反序列化后name为null

Decorator模式

假设对A类的m1方法不满意,需要扩展,要求不能对m1方法进行修改。
首先想到先继承再重写。

m1(){
	println("扩展1");
	super.m1();
	println("扩展1");
}

缺陷:关联程度大。

装饰者模式:
​ 装饰者中含有被装饰者的引用
​ 装饰者和被装饰者实现同一个类型/接口

File

java.io.File
文件和目录路径名的抽象表示形式。
Date t = new Date(f1.lastModified())
详情转api

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值