这里写目录标题
File
- File用于表示文件,可以童年各国File类在程序中操作硬盘上的文件和目录
- File只用于表示文件(目录)的信息(名称.大小等),不能对文件的内容进行访问
- isFile()-----------------用于判断当前File对象表示的是否是一个文件
- length()----------------当前File对象所表示的文件所占用的字节量
- exists()----------------用于测试此抽象路径表示的文件或目录是否存在
- createNewFile()------创建空文件
- delete()-----------------删除空文件或目录
- isDirectory()-----------检测当前File表示是否是一个目录
- mkdir()------------------创建目录
- mkdirs()-----------------创建一系列多个目录
- listFiles()----------------返回文件夹中中的文件或目录用数组接收
- FileFilter()---------------文件过滤器
File[] listFiles(FileFilter filter)
File[] list = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName(.startsWith(".");
}
});
RandomAccessFile
- java提供了一个可以对文件随机访问的操作,访问包括读和写操作.该类名为RandomAccessFile.该类的读写基于指针的操作
RandomAccessFile(file ,“rw”);
r----读
w—写
字节数据读写操作
- void write(int d)-------根据当前所在位置处写入一个字节,将参数int的"低8位"写出
- read()-----------------------读文件
- read/write(byte[] d)---------读写一组字节的方法
- close()----------------------结束读写文件
- writeInte()------------------写入四个字节
- seek()-----------------------将指针移动到文件指定位置
- readInt()--------------------读取四个字节
- getFilePointer()----------获取当前指针的位置
- int skipBytes(int n)-----跳过输入的n个字节
基本IO操作
输入与输出
- 我们编写的程序除了自身会定义一些数据信息外,经常还会引|用外界的数据或是将自身的数据发送到外界。比如 ,我们编写的程序想读取一个文本文件又或者我们想将程序中的某些数据写入到一个件中。这时我们就要使用输入与输出。
- 什么是输入:
输入是一个从外界进入到程序的方向,通常我们需要
"读取”外界的数据时, 使用输入。所以输入是用来
读取数据的。 - 什么是输出
输出是一个从程序发送到外界的方向,通常我们需要"写出”数据到外界时, 使用输出。所以输出是用来写出数据的。
节点流与处理流
- 按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。相连,分为节点流和处理流两类
- 节点流:可以从或向一个特定的地方(节点)读写数据。
- 处理流:是对一个已存在的流的连接和封装,通过所封
装的流的功能调用实现数据读写。 - 处理流的构造方法总是要带一个 其他的流对象做参数。
一个流对象经过其他流的多次包装, 称为流的链接。 - 通常节点流也称为低级流。
- 通常处理流也称为高级流或过滤流。
IS和OS常用方法
- InputStream是所有字节输入流的父类,其定义了基础的读取方法,常用的方法如下:
int read()
读取一个字节,以int形式返回,该int值的"低八位"有效
int read(byte[] d)
尝试最多读取给定数组的length个字节并存入该数组
,返回值为实际读取的字节量
文件流
创建FOS对象
- FileOutputStream是文件的字节输出流文件,我们使用该流可以以字节为单位将数据写入文件;
- FileOutputStream(File file);
创建一个指定File对象表示的文件中写出数据的文件输出流 - FileOutputStream(String filename)
创建一个向具有指定名称的文件中写出数据的文件输出流
创建FIS对象
- FileInputStream是文件的字节流,我们使用该流可以以字节为单位从文件中读取数据
- FileInputStream(File file)
创建一个指定File对象表示的文件中读取数据的文件呢输入流 - FileInputStream(String name)
创建用于读取给定的文件系统中的路径名为name所指定的文件输入流
read()和write(int d)方法
- FIileInputStream继承自InputStream,其提供了以字节为单位读取文件数据的方法read
int read()
从此输入流中读取一个数据字节,若返回-1则表示EOF(End Of File) - FileOutputStream继承自OutputStream,其提供了以字节为单位向文件写数据的方法write.
void write(int d)
将制定字节写入此文件输出流,这里只写给定的int值的"低八位"
案例:实现文件的复制
read(byte[] d)和write(byte[] d)方法
- FileInputStream也支持批量读取字节数据的方法:
int read(byte[] d)
从此输出入流中将最多b.length个字节的数据读入到字节数组b中 - FileOutputStream也支持批量写出字节数据的方法:
void write(byte[] d)
将b.length个字节从指定byte数组写入此文件输出流中
void write(byte[] d,int offset,int len)
将指定byte数组中从偏移off开始的len个字节写入文件输出流
案例:实现文件的复制
缓冲流
BOS基本工作原理
- 在向硬件设备做写出操作时,增大写出次数无疑会降低写出效率,为此我们可以使用缓冲输出流来一次性批量写出若干数据减少写出次数来提高写出效率
- BufferedOutputStream缓冲输出流内部维护着一个缓冲区,每当我们向该流写数据时,都会先将数据存入缓冲区,每当缓冲区满时,缓冲流会将数据一次性全部写出
案例:BOS实现写出缓冲
public void testBos()throws Exception{
FileOutputStream fos=new FileOutputStream("demo.dat");
//创建缓冲字节输出流
BufferedOutputStream bos=new BufferedOutputStream(fos);
//所有字节被存入缓冲区,等待一次性写出
**bos.write("helloworld".getBytes());**
//关闭流之前,缓冲输出流会将缓冲区内容一次性写入
bos.close();
}
BOS的flush方法
- 使用缓冲输入流可以提高写出效率,但是这也存在着一个问题,就是写出数据缺乏及时性,有时我们性需要在执行完某些操作后,就希望将这些数据确实写出,而非在缓冲区中保存直到缓冲区满后才写出,这时我们可以使用缓冲流的一个方法flush.
- void flush()
清空缓冲区,将缓冲区中的数据强制写出
BIS基本工作原理
- 在读取数据时若以字节单位读取数据,会导致读取次数过于频繁从而大大降低读取效率.为此我们可以通过提高一次读写的字节数量减少读写次数来提高读写的效率.
- BufferedInputStream是缓冲字节输入流,其内部维护着一个缓冲区(字节数组),使用该流在读取一个字节时,该流会尽可能多的一次性读取若干字节并存入缓冲区,然后逐一的将字节返回,直到缓冲区中的数据被全部读写完毕,会再次读取若干字节从而反复.这样减少读取的次数,从而提高了读取效率
- BIS是一个处理流,该流为我们提供了缓冲功能
BIS实现输入缓冲
public void testBis()throws Exception{
//创建缓冲字节出入流
FileInputStream fis =new FileInputStream("demo.dat");
BufferedInputStream bis=new BufferedInputStream(fis);
int d=0;
/*缓冲读入,实际上并非是一个字节一个字节从文件读取的.
while((d=bis.read())!=-1){
System.out.println(d+" ");
}*/
bis.close();
}
实现基于缓冲区的文件复制
对象流
对象序列化概念
- 对象是存在于内存中的,有时我们需要将对象保存到硬盘上,又有时我们需要将对象传输到另一台计算机上等等这样的操作.这时我们需要将对象转换为一个字节序列,而这个过程就成为对象序列化,相反,我们有这样一个字节序列化需要将其转换为对应的对象,这个过程就称为对象的反序列化
使用OOS实现对象序列化
- ObjectOutputStream是用来对对象进行系列化的输出流
- 其实现对象序列化的方法为:
void writeObject(Object o)
该方法可以将给定的对象转换为一个字节序列化后写出
使用OIS实现对象反序列化
- ObjectInputStream是用来对对象进行反序列化的输入流
- 其实现对象反序列化的方法为:
Object read()
该方法可以从流中读取字节并转换为对应的对象
Serializable接口
- ObjectOutputStream在对对象进行序列化时有一个要求,就是需要序列化的对象所属的类必须实现Serializable接口
- 实现改接口不需要重写任何方法,其只是作为可序列化的标志
- 通常实现该接口的类需要提供一个常量serialVersionUID表明该类的版本.若不显示的声明,在对象序列化时也会根据当前类的各个方面计算该类的默认
serialVersionUIO,但不同平台编译器实现有所不同,所以若想跨平台,都应显示的声明版本号
transient关键字
- 对象在序列化后得到的字节序列往往比较大,有时我们在对一个对象进行序列化时可以忽略某些不必要的属性,从而对序列化后得到的字节序列"瘦身".
- 关键字transient
- 被该关键字修饰的属性在序列化时其值被忽略