前言
在涉及IO流之前需要知道文件的概念。文件是数据源(保存数据的的地方)的一种,比如word文件、txt文件。他既可以保存一张图片,也可以保存视频、声音。。。等等
文件流
文件在程序中是以流的形式来操作的
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源到内存的路径
输出流:数据从内存到数据源的路径
IO流分类
1.根据处理数据类型的不同分为:字符流和字节流
字节流:可以用于读写二进制文件及任何类型的byte,也就是一个字节一个的读
字符流:可以用于读写文本文件,不能操作二进制文件,也就是两个字节两个字节的读
2.根据数据流向不同分为:输入流和输出流
3。节点流和处理流
节点流:直接与数据源相连,读入或读出,可以发现使用该流过于频繁操作硬件,从而使读写很不方便
常用的结点流:
父类:InputStream、OutputStream、Reader、Writer
文件 :FileInputStream 、 FileOutputStrean 、FileReader、FileWriter 文件进行处理的节点流
数 组 :ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)
字符串 :StringReader、 StringWriter 对字符串进行处理的节点流
管 道 :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 对管道进行处理的节点流
处理流:处理流和节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
常用的处理流:
缓冲流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加缓冲功能,避免频繁读写硬盘
转换流:InputStreamReader 、OutputStreamReader实现字节流和字符流之间的转换
数据流: DataInputStream 、DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来
文件File类
File常用方法
创建:
createNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false。
mkdir() 在指定位置创建一个单级文件夹。
mkdirs() 在指定位置创建一个多级文件夹。
renameTo(File dest)如果目标文件与源文件是在同一个路径下,那么renameTo的作用是重命名, 如果目标文件与源文件不是在同一个路径下,那么renameTo的作用就是剪切,而且还不能操作文件夹。
删除:
delete() 删除文件或者一个空文件夹,不能删除非空文件夹,马上删除文件,返回一个布尔值。
deleteOnExit()jvm退出时删除文件或者文件夹,用于删除临时文件,无返回值。
判断:
exists() 文件或文件夹是否存在。
isFile() 是否是一个文件,如果不存在,则始终为false。
isDirectory() 是否是一个目录,如果不存在,则始终为false。
isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
获取:
getName() 获取文件或文件夹的名称,不包含上级路径。
getAbsolutePath()获取文件的绝对路径,与文件是否存在没关系
length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。
getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。
lastModified()获取最后一次被修改的时间。
文件夹相关:
static File[] listRoots()列出所有的根目录(Window中就是所有系统的盘符)
list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。
listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。
list(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
listFiles(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
|
|
对应的结果:
文件路径e:\aa.txt
文件的大小0
显示出文件名是zwl.txt
文件字节与字符流
InputStream常用方法
public abstract int read() throws IOException:从输入流中读取数据的下一个字节,到达末尾,返回-1;
public int read(byte[] b)throws IOException:从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
public int read(byte[] b,int off,int len)throws IOException:将输入流中最多 len 个数据字节读入 byte 数组
public void close() throws IOException:关闭此输入流并释放与该流关联的所有系统资源
OutputStream常用方法
public void flush()throws IOException:刷新此输出流并强制写出所有缓冲的输出字节
public abstract void write(int b)throws IOException:将 b.length 个字节从指定的 byte 数组写入此输出流。
public void write(byte[] b, int off, int len)throws IOException:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
public void write(byte[] b)throws IOException:将指定的字节写入此输出流。
Reader与Writer和上述方法基本类似,只不过它操作的是字符。
上面程序是将已存在的一个文件复制到另一个文件中
缓冲字节与字符流
它是在原来节点流基础上增加了一根管道,用于缓存数据,用法基本类似,但是它的构造函数必须是结点流,同时在字符缓冲流中有一个可以读取或存取字符串的方法如:
public String readLine()throws IOException:读取一个文本行
Object流
Object流的意思将是像一根节点流插入一根Object流管道,专门操作Object,而它必须实现Serializable接口,该接口的意思是可序列化,就是说将一个对象流序列化成子节流写进网络或者文件,比如说游戏存盘,有各个游戏的记录,如果以面向对象来写进管道,它的各个成员变量,会在内存中被序列化成二进制写进去,而Serializable接口无方法,它只是个标记接口,编译器看到实现该接口的类就知道它应该被序列化,同样有一个transient关键字,是使可序列化的某个属性变成透明,也就是它不能变成字节写进去,那个属性只能为默认属性写进去
ok,接下来就来看看Object流相关常用方法
ObjectOutput:有一个void writeObject(Object obj) throws IOException:将对象写入底层存储或流。
ObjectInput:Object readObject()throws ClassNotFoundException,IOException:读取并返回对象
最后不得不说IO流是在太复杂,就是一根管道不断套接着另一根管道,但是IO流是非常有用的,不仅能帮助我们了解计算机底层,而且涉及到数据传输都离不开它。。