在java的IO流中 Input代表输入 Output代表输出
内存–>外存(本地流输入)
外存–>内存(本地流输出)
-数据长时间保留在硬盘上
-数据长时间保存在数据库上,其实数据库的本质是以数据文件的方式持久化到硬盘上
在硬盘中的实际体现出来的是文件和目录,java中提供了一个java.io.File类用来操作文件的目录信息和文件的信息,就是不能操作文件内容
根据文件的内容操作分为
-字节流:对文件内容读写是用字节的方式操作
-字符流:对文件内容读写是用字符(ascii)的方式操作,但是本质底层还是字节流
API:
-构建File类对象
File(String filePath);
File(File parent,String child);
File(String parentName,String child);
-idFile() 判断是否为文件
-idDirectory()判断是否是目录
-exists()判断文件或目录是否存在
-createNewFile() 创建一个文件,如果指定的文件不存在,就创建返回true;存在就返回false
-delete删除文件,如果File表示一个目录,删除的时候,要保证目录必须是空的
-mkdir()创建目录
-mkdirs()创建多个目录
-listFiles()返回指定目录中的所有的文件和目录
-listFile(FileFilter)返回指定目录中的部分文件和内容,用FileFilter设定的筛选条件
-listFiles(FileFilter)返回指定目录中的部分文件和内容,用FileFilter设定的筛选条件
-listFiles(FilenameFileFilter)返回指定目录中的部分文件和目录,FileNameFileFilter设定筛选条件
1.File只能操作文件或目录的信息
2.就是不能操作文件的内容
-可以操作文件的内容
-按照字节操作,属于字节流
-read读和write写都是此类中的api方法
-能够通过seek方法可以随意移动或改动文件的指针
只读模式和读写模式
-创建对象
RandomAccessFile(File file,String mode);
创建从中读取和向其中写入的随机访问流
文件通过file指定
模式通过String指定
RandomAccessFile(String name,String mode)
创建从中读取和向其中写入的随机访问流
文件通过String指定
mode的取值:"r"制度模式,read. "rw"读写模式 read write
-写入操作
void writer(int d)
此方法会根据当前指针所在的位置处写入一个字节,只能使用整形的低8位
void writer(byte[] d)
此方法会根据当前指针所在的位置处写入一组字节
void writer(byte[] d,int offset)
将len个字节从指定的byte数组写入文件,并从偏移量offset处开始
-读取操作
void read()
从文件中读取处一个byte字节,填充到整形的第八位中,如果返回-1,表示读到文件的末尾 EOF end of file
int read(byte b)
从指针指向的位置开始读取若干字节存储到字节数组中,将读取道德字节,按照顺序放在字节数组的相应的位置,返回值为读取到的字节数,也可以说成是读取到的长度,返回值位-1,则读取到文件的末尾EOF
int read(byte[] d,int offset,len);
将最多len个数据字节从文件中读入byte数组中,并从偏移量offset开始存储
get getFilePoint返回此文件中的当前的偏移量
void seek(long position)设置到此文件开头0到文件指针的偏移量,在该位置发生下一个读取或写入操作
int skipBytes(int n)用此方法可以跳过一些少量的字节,只能是跳正数
字节流:可以从一个或想一个特定的方向读写数据,数据是字节
封装流/处理流:针对字节流进行封装,即对一个已经存在在流进行封装,通过所有的封装流,能够对数据更有效的读写,封装流的底层还是字节流
通常字节流被称之为低级流
处理流/封装流被称为高级流或者过滤流
-int read()读取一个字节,以int的形式返回,该int的低8位有效(实际返回的是字节)否则返回-1,表示文件末尾EOF
-int read(byte[] b)尝试最多读取给定数组的length个字节,并存入该数组,返回值为实际读取的字节量的长度,否则返回-1,到文件末尾
int read(byte[] b,int offset,len)将输入流中的最多len个数据字节写入byte数组,将从offset的位置开始写入数组,len不能超过数组的实际长度,如果超过了会报数组下标异常
-void close()关闭此输入流并释放与该流关联的所有系统资源
-void write(int d)写出整型数据的低8位
-void write(byte[ ] b)将给定的字节数据的数据全部写出
-void write(byte[] b,int offset,int len)将给定的字节数组从偏移量offset开始的len个字节写入输出流
-void flush()刷新此输出流并强制写出所有的缓冲的输出字节
-void close()关闭此输出流并释放与此输出流有关的所有系统资源
-可以操作文件内容
-操作的是字节流
-继承自InputStream抽象类
-低级流
-操作的是文件
-可以操作文件内容
-操作的是字节流
-继承自OutputStream抽象类
-低级流
操作的是文件
向硬件存储设备操作数据,导致增大跟硬件的交互次数,会降低读写的速度,做缓冲流的目的是为了尽量减少跟硬件的交互次数
缓冲输出流内部会维护一个缓冲区,每当我们向该流写出数据时,都会现将数据存入缓冲区,当缓冲区已满的时候,缓冲流会将数据一次性写出
注意:void flush(),清除缓冲区,将缓冲区的数据强制写出以保证数据的完整
缓冲输入流内部维护一个缓冲区,每当我们向该流读入数据,都会先将数据存入缓冲区,BufferedInputStream的read方法会从缓冲区读取数据,当缓冲区全部读取完毕,如果再次read的时候,会再一次把缓冲区填满,read在逐一从缓冲区中读取数据,一次往复
把内存的对象数据序列化到硬盘上,也可以把硬盘上的文件反序列化回内存的对象
注解:如果要实现对象的序列化和反序列化,就必须对序列化的对象锁对应的类实现java.io.Serializable接口,且类中提供一个long类型的序列化的版本号
此接口仅表示可序列化语义,某个类实现这个接口,就是说这个类表示了可以序列化这个语义,这个类的子类也同样具备序列化语义,这个类需要提供一个常量serializableUID,用来表示本类的序列化版本号,
如果想跨平台,就需要显示声明一个版本号,且平台两端的版本必须相同
序列化类中可以有很多的属性,但是部分属性不想被序列化和反序列化,芭蕾中的不需要序列化的属性前加上transient修饰符
针对字符流做低级流的二次或三次的封装处理,字符流也是高级流,字符流的本质还是字节流
构造函数/构造器
DataInputStream(InputStream);
api方法:
-readInput()
类似方法 readXXX();xxx代表某种类型
构造函数/构造器:
DataOutputStream(OutputStream)
api:
writeInt();
类似的方法 writeXXX方法,XXX代表的是具体的某种类型
针对字符流做低级流的二次或三次的封装处理,字符流也是高级流,字符流的本质也是字节流
-是所有字符流的父类
-是一个抽象类
-int read(char[] chars)读取一个字符数组的length个字符,并存储到数组中,返回的是实际读取的字符量
-int read(char[] chars,int offset,int len)读取len个字符,并存储给字符数组,以offset位置为起点
-是所有字符流的父类
-是一个抽象类
-void writer(int c)写出一个字符
-void writer(char[] chars,int offset,int len)写出数据,从offset开始,区len个字符
-void writer(String str)写出一个字符串
-void writer(String str,int offset,int len)写出字符串数据,中的部分数据
-可以设置字符集
-可以按照指定的字符集输入数据
-将字节按照指定的字符集读入字符串数据
-继承自Reader类
-可以设置字符集
-按照指定的字符集输入数据
-将字节按照指定的字符集写出字符串你数据
-继承自writer类
-String readLine(); //读取到末尾为null
-特殊的类,只有输出,没有输入
-是具有自动行刷新的缓冲字符输出流