1、File类
一个File类对象表示一个磁盘上的文件或者目录,File类提供了与平台无关的方法来磁盘上的文件或者目录操作。
File.separator可以用来表示系统的根目录,也可以用来表示分隔符,在window平台是\,unix下是/
与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 的值的第一个字符。在 UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\\'。
pathSeparatorChar
public static final char pathSeparatorChar
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 pathSeparatorChar。
File.createTempFile(prefix, suffix),在临时文件目录下创建临时文件,临时文件目录是在环境变量中设置的即TEMP。
2、流式I/O
流(stream)字节的源或者目的
两种流:输入流和输出流,输入流可以从中读取字段对象的流,输出流可以向其中写入字节的流对象。
3、流的分类
节点流:是从特定的地方读写的流类。例如磁盘或者内存区域。
过滤流:使用节点流作为输入输出,过滤流是使用已经存在的输入流或者输出流来创建连接。
4、InputStream抽象基础类
三个基本的方法:abstract int read() :读取一个字节的数据,返回一个整型的读到的数据,当返回-1说明读到输入流的结尾了。
int read(byte[] b):将读入的数据放到一个字节数组中,并返回实际所读入的字节数,如果返回-1,则说明读到输入流的末尾。
int read(betye[] b,int off,int len):将读入的数据放到一个字节数组中,并返回实际所读入的字节数,如果返回-1,则说明读到输入流的末尾。off字节数组b的起始偏移量,len指定读取的最大字节数。
其他方法:
long skip(long n)在输入流中跳过n个字节,并返回实际所跳过的字节数。
int available();返回在不发阻塞的情况下,可读取的字节数。
void close();关闭输入流,释放和这个系统相关的资源。
void mark(int readlimit);在输入流当前位置放置一个标记,如果读取的字节数大于readlimit时则忽略这个标记。(空实现)
void reset();返回到上一个标记,空实现的方法
boolean marksupported,判断当前流mark和reset方法是否支持。
5、OutputStream抽象基础类
三个基本的写方法:
abstract void write(int b) 往输入流中写入一个字节的数据,当出入的一个整型,实际只是写入了一个字节
void write(byte[] b)写入数字b的所有字节
void write(byte[] b,int off,int len)
其他方法:
void flush();刷新输出流,强制缓冲区中的输出字节被写出。只对使用了缓冲区的流类起作用。
void close();
6、BufferedOutputStream类
BufferedOutputStream是将输出流写到缓冲区中,所以只有缓冲区满了才会写到硬盘上,这是调用flush方法可以强制写到磁盘或者close方法。
BufferedInputStream类是将输入流读到缓存中。
7、DataInputStream和DataOutputStream读写入java基本数据类型。
8、PipedOutputStream和
PipedInputStream
他们总是成对出现的,管道流,用于线程间的通信,一个线程的PipedInputStream流从另一个线程的PipedOutputStream对象读取输入。
9、java是用unicode字符集来描述字符和字符串,Reader和Writer两个抽象类主要用来描述字符流。
InputStreamReader和OutputStreamWriter主要是起到桥梁的作用是字符流到字节流转换的类。
InputStreamReader主要实现了解码过程,讲字节解码成字符,OutputStreamWriter主要实现编码,讲字符编成字节。
10、RandomAccessFile类
11、对象的序列化
将对象转换为字节流保存起来,并在日后还原出来,这种机制称为对象的序列化。
将一个对象保存到一个永久存储设备上称为持续性。
一个对象想要实现序列化必须实现serializable或externalizable接口。
ObjectOutputStream类和ObjectInputStream类。writeObject和ReadObject方法。
当我们对一个对象进行反序列化的时候,并没有调用对象的任何构造方法,仅仅根据我们保存的对象的信息去重新还原对象。
a、我们对一个对象进行序列化的时候,只保存了非静态的成员变量,不能保存任何成员方法和静态变量。
b、当一个可序列化对象中的成员变量也是一个对象,那么这个对象的成员变量也会保存。
c、当可序列化对象中包括了一个非可序列化对象的引用时,这个对象就无法进行序列化操作了,也会跑出异常,我们可以将这个引用标记为transient,那么我们仍可以进行序列化。
d、我们也可以用transient来标记可序列化对象中的成员变量,那么这成员变量也不会保存。
有时候我们对于对象的信息有的保存有的不保存,那么可以通过private void readObject()和private void writeObject()2方法来实现,这两个方法不属于某个接口或者类,只是有这2个特殊的方法会在我们序列化的时候被调用。是私有的而且是个特例,在对象序列化和反序列化时可以被外部类调用。