学习代码
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.System
有setOut()
方法。
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