1. 抽象基类InputStream、OutputStream,不能实例化。
• InputStream类是基本的输入类。它定义了所有输入流所需的方法。
• publicabstract int read() throws IOException
• publicint read(byte b[]) throws IOException
• public int read(byte b[],intoffset,int length) throws IOException
功能为从输入流中读数据。这一方法有几种重载形式,可以读一个字节或一组字节。当遇到文件尾时,返回-1。最后一种形式中的offset是指把结果放在b[]中从第offset个字节开始的空间,length为长度。
• public int available() throwsIOException
输入流共有多少字节可读。注意此方法对InputStream的各派生类不一定都有效,有时会有返回零字节的错误结果。
• public void close() throwsIOException
关闭输入流并释放资源。虽然java提供垃圾回收机制,当一个流不再使用时可以由运行系统自动关闭,但为了提高程序的安全性和稳定性,建议使用close()关闭。
• public boolean markSupperted( )
返回布尔值,说明此流能否做标记或复位。
• public synchronized void mark(intreadlimit)
为当前流做标记。其参数说明在标记失效前可以读多少字节,这个值通常也就设定了流的缓冲区大小。
• public synchronized void reset()throws IOException
返回到上一次做标记处。
• public long skip (long n) throwsIOEnception
从输入流跳过几个字节。返回值为实际跳过的字节数
2.
PublicFileOutputStream(String name)throws FileNotFoundException
PublicFileOutputStream(File file)throws FileNotFoundException
PublicFileOutputStream(String name,Boolean append)throws FileNotFoundException
Name为文件名,file为文件类File对象,append表示文件是否为添加的写入方式,append默认为false,false时为重写方式,即从头写入,覆盖原来文件内容。
写的方法与读的一样。只不过这里用write。
3.
¯ 字节流可以操作任何数据
¯ 字符流使用的是字符数组;字节流使用的是字节数组
4.如果文件体积不是很大,可以这样操作。
byte[]buf = new byte[fis.available()];//创建一个刚刚好的缓冲区。但是这有一个弊端,就是文件过大,大小超出jvm的内容空间时,会内存溢出。
fis.read(buf);
System.out.println(new String(buf));
5. 文件类(File)
一个File类的对象,表示磁盘上的文件和目录。它提供了与平台无关的方法来对磁盘上的文件或目录进行操作,包括:更改文件名、删除文件、列出目录下的文件以及文件对象属性的描述信息等。
ü 构造方法
public File(String path);
public File(String path,String name);
public File(File parent,String chile);
例如:
File f1 = newFile(“data.txt”);
File f2 = newFile(“\\D:”,“data.txt”);
File f3 = newFile(“\\D:”);
File f4 = newFile(f3,“data.txt”);
ü 静态常量
由于不同操作系统的文件分隔符以及路径分隔符不同,因此,如果要获取当前系统的文件和路径的分隔符,可使用以下两个静态常量。
publicstatic final char separatorChar;
publicstatic final char pathSeparatorChar;
publicstatic final char separator;
ü 其它方法
(1).访问文件对象:
public StringgetName():返回文件对象名,不包含路径名
public StringgetPath():返回文件路径名,包含对象名
public StringgetAbsolutePath():返回文件绝对路径名,包含对象名
public StringgetParent():返回父文件对象名的路径名
public StringgetParentFile():返回父文件对象
(2)获得文件属性
public longlength();
public Booleanexists():测试指定的文件是否存在
public longlastModified():返回指定文件最后被修改的时间
(3)文件操作
public booleanrenameTo(Filedest):文件重命名
public booleandelete():删除空目录
(4)目录操作
publicboolean mkdir():创建指定目录,正常建立时返回true
publicString[] list():返回目录中的所有文件名字符串
public FilelistFiles():返回指定目录中的所有文件对象
6. 文件的随机访问类
对于InputStream类和OutputStream类来说,它们的实例都是顺序访问流,访问从头至尾顺序进行,而且输入流只能读不能写,输出流只能写不能读,即对一个文件不能同时进行读写操作,而RandomAccessFile类提供了另一种称为“随机访问文件”的方式。它有两个特点:
对一个文件可以同时进行既读又写的操作。
可以在文件中指定的任意位置读取数据或写入数据。
类声明:
public class PandomAccessFile extends Object implementsDataOutput,DataInput
他不是流
RandomAccessFile类可以对文件进行随机读写操作。
ü 创建一个RandomAccessFile对象
RandomAccessFile(File file,String mode) ;
RandomAccessFile(String name,String mode);
ü 读写数据的常用方法
读、写基本数据类型: readInt();writeInt(int n)等;
读、写UTF字符串: readUTF();writeUTF(String str);
读取文件中的一行: readLine();
ü 文件随机读写流的读取指针控制
long getFilePointer() ---得到当前的文件读取指针。
void seek(long pos) ---把指针从开始移动到pos位置。
long length() ---得到文件的长度(有多少个字节) 。
void setLength(long newLength)
7.对象流分为:对象输入流ObjectInputStream和对象输出流ObjectOutputStream
构造方法:
public ObjectInputStream()throws IOExcepetion,SecurityException
public ObjectInputStream(inputStream in)throws IOExcepetion,SecurityException
readObject():从ObjectInputStream读取对象。
8.序列化(Serialization)是指并行数据转换成串行数据的处理过程,而对象序列化(Object Serialization)是指把对象的状态数据以字节流的形式进行处理,一般用于实现完全的对象。简单的说序列化可以理解为使用I/O对象流类型实现的对象读写操作。
Java.io.ObjectOutputStream的writerObject()方法将内存中该对象的状态信息以有序二进制流(0、1序列)的形式输出到目标数据文件中,实现了信息的永久保存,这一工程即所谓的对象序列化。
对象序列化的主要任务是写出对象的状态信息,并遍历改对象建立一个对其他对象的引用,递归的序列化所有被引用的其他对象。
注意:并不是任何引用类型的数据(对象)都可以被序列化,只有实现了java.io.Serializable接口的类的对象才可以序列化,这主要出于安全性考虑,一些封装敏感信息或时效性很强的信息的类则不建议支持序列化,以避免出现泄漏或消息失效问题。在java语言规范中规定了Serializable接口的实现类均应该提供无参的构造方法,以供可能的反序列化操作,系统重建对象时自动调用,不过这一规则并未得到严格的贯彻。
在对象序列化的过程中,其所属类的static属性和方法代码是不会被序列化的,因为static属性为整个类共有,不应因一个对象的“沉浮”而受影响,而方法代码是一成不变的,反序列化时只要在运行环境中找到一份其所属的类文件即可(注意必须是当初序列化操作时使用的同一版本.class文件,如果中间进行过修改并重新编译,则反序列化时会出错)对于个别不希望被序列化的非static属性(实例变量),也可以在属性声明时使用transient关键字进行表明。
在序列化时static和transient属性均被略过,反序列化重构对象时,对象的这些属性被默认初始化和显示初始化处理。其中static属性如果已经存在,则维持原状,不再进行初始化处理。