java学习7--Java I/O 操作与字节流

来源:互联网 发布:炫酷黑客收徒网站源码 编辑:程序博客网 时间:2024/04/29 18:27

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个特殊的方法会在我们序列化的时候被调用。是私有的而且是个特例,在对象序列化和反序列化时可以被外部类调用。



 

 

原创粉丝点击