IO
I(Input)指从设备上输入数据到程序中;
O(Output)指从程序中向设备中输出数据;
IO是相对于程序而言的。
File类
操作文档和目录。FIle类以一种与平台无关的方式描述一个文件或目录对象的属性。
File类功能
- 获取文件或目录的各种属性信息
- 创建目录
- 对文件或目录改名
- 列出一个目录下所有的文件和子目录
创建File类的方式
-
File(String pathname)
:根据文件名创建一个File类对象 -
File(File parent,String child)
:根据parent目录和child文件名构建一个File对象 -
File(String parent,String child)
:根据字符串parent目录和child文件名构建一个File对象 -
File(URI uri)
:根据uri创建一个File对象
Windows和Linux存在路径表示方式的区别,Windows下用\
分割路径,所以pathname里需要用\\
分割路径,第一个\
是转义字符。Linux是/
没有问题。
File类常用方法
-
boolean createNewFile()
:根据文件路径(构造方法传进来的路径),创建一个文件。如果文件存在会创建失败。 -
boolean mkdirs()
:创建目录 -
boolean delete()
:删除文件 -
boolean exists()
:判断是否已经存在该文件或文件夹 -
File[] list()
:列出目录中的所有文件和文件夹,可以接受FilenameFilter参数,该参数可以只列出符合条件的文件。在FilenameFilter接口里包含一个accpet(File dir,String name)
方法,该方法将依次对指定File的所有子目录,子文件进行迭代。
来个新鲜的栗子:列出指定目录下名称包含java
的文件或文件夹
过滤文件名称的类Java_Filter.java
包含当前main类listFiles.java
流
流是Java中输入/输出的抽象表述。
程序想要访问内存、硬盘、网络等IO目的地,全部通过IO流的方法就可以完成,统一了访问方法。
根据数据流方向的不同,可以将数据分为输入流和输出流。
输入流只能从中读取数据,而不能向其写数据;输出流只能向其写出数据,而不能从中读取数据。
字节流
假设硬盘中有数据a中bcd
,其中a
用一个字节表示,中
字用两个字节表示,bcd
分别都用一个字节表示,字节输入流,一次只从硬盘上读取一个字节,遇到中
字需要读取两次,数据a中bcd
一个6个字节,需要读6次。
字节流传送的是字节数据(byte)。
字符流
而字符输入流,一次读取一个字符,中
字也是一个字符,使用字符输入流,则之需要读取5次。
字符流传送的是字符数据(char)。
流是一个逻辑概念,它把各种都写操作统一起来。一个字节输入流指向一个字节序列,可从中一次读出字节,用户不必关心它的内部结构、来源。一个字节输出流,可向其依次写入字节,它的去向和内部结构用户同样不必关心。
字节输入流
-
FileInputStream
:表示指向文件的字节输入流 -
ByteArrayInputStream
:表示指向内存中的byte数组的字节流 -
ObjectInputStream
:用于读取对象 -
FilterInputStream
:表示过滤器流 -
DataInputSteam
:用于从流中读取基本类型的数据 -
BufferedStream
:用于给流增加缓冲的功能
InputStream是字节输入流的顶层父类。
InputStream提供的三个基本的read方法:
-
int read()
:读取一个字节 -
int read(byte[] buffer)
:读取数据到buffer数组中 -
int read(byte[] buffer,int offset,int length)
:读取数据到buffer数组中的指定位置。
字节输出流
OutputStream
为字节输出流的顶层父类。
-
FileOutputStream
:表示输出到文件的字节输出流 -
ByteArrayOutputStream
:表示输出到内存的byte数组的字节流 -
ObjectOutputStream
:表示对象输出流,用于将对象写入到流中 -
FilterOutputStream
:表示过滤器输出流 -
DataOutputStream
:用于向流中写入基本类型的数据 -
BufferedOutputStream
:用于给流增加缓冲的功能
字节输出流OutputStream,用来向流中写入数据。OutputStream是所有字节输出流的顶层父类。
OutputStream类提供的三个基本write方法:
void write(int c)
void write(byte[] buffer)
void write(byte[] buffer,int offset,int length)
其他方法:
-
void close()
:关闭流 -
void flush()
:将流中的数据输出
下面一个例子,实现了文件复制功能,综合了输入流输出流和缓存流的知识:
序列化
Java中,很多数据是以对象的方式存在,程序运行后,希望将这些数据储存,以供下次使用,可以使用ObjectInputStream、ObjectOutputStream来做到。将对象写入流中,这个过程称为序列化,写入流中的对象必须要实现接口Serializable
,才能对象序列化。
ObjectOutputStream主要方法:
-
writeObject(Object obj)
:将对象写入流中 -
flush()
:将缓冲输出 -
close()
:关闭流
ObjectInputStream主要方法:
-
readObject()
:从流中读取一个对象 -
close()
:关闭流
字节流
字节流一次读取一个字节的数据,而字符流一次读取一个字符的数据。比如中文,一个字符占用两个字节,使用字节流读取,就会成乱码,而用字符流就可以正常显示。
字符输入流的类
Reader
类为字符输入流的顶层父类,子类如下:
-
StringReader
:表示从内存中的String对象中读取数据的字符输入流 -
CharArrayReader
:表示从内存中的一个Char数组中读取的字符输入流 -
InputStreamReader
:表示一个字节流转换为字符流的工具流 -
FileRead
:表示指向文件的字符输入流 -
BufferedReader
:表示给字符输入流增加缓冲功能的字符流
Reader类的三个基本方法:
-
int read()
:读取一个字符的数据 -
int read(char[] cbuf)
:将字符数据读取到cbuf数组中 -
int read(char[] cbuf,int offset,int length)
:将字符数据读取到cbuf数组中从offset处开始写入,写length个字符
Reader的其他方法:
-
void close()
:关闭流 -
boolean ready()
:判断流是否就绪可用 -
skip(long n)
:从当前位置跳过n个字符不读 -
void reset()
:关闭流
使用Reader的栗子: