Java之文件IO

这里写图片描述
上图是自己课后总结的集合类知识点,需要.xmind文件的在此自行下载。
http://note.youdao.com/noteshare?id=dc82b073f2993aa4925fc1b9caec7be1&sub=A648D45E410A4BC085329D98AF3D1D4F
jdk1.0 BIO(阻塞式IO)
BIO( File InputStream OutputStream Reader Writer)

一、File:与文件操作本身操作(创建 删除 取得信息)
有关的类。File即可描述文件 也可描述文件夹。
public File(String pathname) ; 根据路径取得File类实例化对象
public File(String parent, String child),根据父路径和子路径取得File路径
1.1创建新文件 :只负责创建文件,对于内容不做处理。
public boolean createNewFile() throws IOException
1.2 判断文件是否存在(文件与文件夹均可)
public boolean exists()
1.3 删除文件
public boolean delete()
1.4 判断File对象是否为文件
public boolean isFile()
1.5 取得操作系统分隔符
File.separator
1.6 取得父File对象或父路径
取得父路径
public String getParent()
取得父File对象
public File getParentFile()
1.7创建目录 ( 无论多少级目录 一次创建)
public boolean mkdir()
1.8 判断File对象是文件还是文件夹 取得文件信息
判断File对象是文件
public boolean isFile()
判断File对象是文件夹
public boolean isDirectory()
1.9 取得文件大小(字节大小)
pubic long length()
1.10 取得文件最后修改日期
public long lastModified()
1.11 列出目录中全部组成:
public File[] listfiles()

Java流分为两类 :字节流 字符流。字节流与字符流本质区别只有一个:
字节流是( OutputSteam 、IntputSteam)原生操作
字符流是( Writer Reader )经过处理后的操作。

流的操作模式,以文件输出为例:
1.根据文件路径取得File对象;
2.取得File对象的输入输出流(拿到管道);
3.通过输入、输出传输数据;
4.关闭流。

二、OutputStream:字节输出流 抽象类
public abstract class OutputStream implements Closeable, Flushable
要想通过程序进行输出,可以考虑使用字节输出流。
2.1 实现接口的方法
Closeable: public void close() throws IOException; 关闭流
Flushable: public void flush() throws IOException; 刷新缓存区
2.2字节输出方法 重点
void write (int b) :输出单个字节
void write (byte b[ ]) :将字节全部输出
void write (byte b[ ] , int off,int len) : 将部分字节数组内容输出

Windows下换行符:“\r\n”
linux下换行符:“\n”
public FileOutputStream(File file) throws FileNotFoundException 覆盖
进行文件输出的时候 ,所有文件会帮助用户自动创建,无需调用createFile()手工创建。
默认输出为输出覆盖,要想进行文件的追加,使用 FileOutputStream进行追加。
public FileOutputStream(File file, boolean append) 追加

2.3 自动关闭支持
AutoCloseable (jdk1.7提供的接口)
要想使用AutoCloseable,必须结合try catch
自动关闭指的是close方法无需手工调用 JVM会自动调用。

三、InputStream 字节输入流(jdk1.0)抽象类
3.1 int read() :读取单个字节 ,如果返回-1表示读取完毕。
3.2 int read(byte b[]) :读取数据到字节数组中,返回值有三类:
a. 返回字节数组 b,length
b. 返回读取数据大小, len < b.length
c. 返回-1 表示读取完毕;
3.3 int read(byte b[],int off,int len) 读取部分数据到字节数组中。

四、字符输入流 Reader 抽象类 jdk1.5 非阻塞式io
方法同InputStream 只不过是字符而已

五、字符输出流 Writer
void write (String str) :直接输出字符串
不关闭流,数据无法输出到终端;
如果不关闭流 可以强制清空缓存区 调用flush()即可。
进行IO处理的时候 处理的是图片 音乐 文字都可以使用字节流,只有处理中文时才考虑使用字符流。

六、转换流
OutputStreamWriter extends Writer
OutputStreamWriter:将字节输出流变为字符输出流(Writer对于文字的输出要比OutputStream方 便)
InputStreamReader:将字节输入流变为字符输入流(InputStream读取的是字节,不方便中文的处理)
缓冲区
byte[] data = new byte[1024] ; // 开辟缓冲区一次性读入多个内容
int len = 0 ;
// len = inputStream.read(data)) != -1,表示将数据读取到字节数组之中,而后返回读取个数
while((len = inputStream.read(data)) != -1)
{
outputStream.write(data,0,len) ;
// 将字节数组的部分内容写到目标文件中
}

七、字符编码
GBK 、GB2312:表示国标编码,GBK包括简体和繁体编码,GB2312只包括简体;
UNICODE :Java提供的16进制编码,可以描述世界上任意文字信息;
ISO-8859-1:只支持英文,国际通用编码,浏览器默认编码;
UTF编码(UTF-8):结合UINCODE+ISO-8859-1:支持所有编码。

以后开发中,就用UTF-8。

乱码本质:90%产生原因是编、解码不一致。

八、内存操作流:以内存作为终端。
字节操作流:
ByteArrayInputStream
ByteArrayOutputStream
字符内存流:
CharArrayReader
CharArrayWriter

九、打印流 重要
打印流属于OutputStream功能的增强版,其本质不会脱离OutputStream。
PrintStream :字节打印流
PrintWriter :字符打印流
打印流属于典型的装饰设计模式,装饰设计模式是基于抽象类的设计模式
核心依然是某个类的功能,但是为了得到更好的操作效果,扩充其功能而已

OutputStream不是很方便,其缺点有两个:
1、所有的数据必须转换为字节数组。
2、如果要输出的是int、double等类型就不方便了

十、.system类对IO的支持
a. 标准输出(显示器) : public final static PrintStream out ;
b. 错误输出 : public final static PrintStream err ;
c. 标准输入(键盘):public final static InputStream in;

十一、两种输入流
BufferedReader :字符缓冲流 , 扩充InputStream的功能;
BufferedInputStream 字节缓冲流
public String readline():直接读取一行输入,默认使用回车作为分隔符。
java.util.Scanner(1.5提供) 命令行使用此类:解决 BufferedReader 的缺陷;
Scanner(1.5提供)是专门进行输入流处理的程序类,利用本类可以方便处理各种数据类型,同时还可以结合正则表达式。
a.hasNextXXX()判断是否有指定类型数据
b.nextXXX()取得指定类型的数据(默认碰到tab、空格、 换行时,作为新的个体)
c.定义分隔符 useDelimiter(Pattern pattern)
d.构造方法:public Scanner(InputStream source)
总结: 输出流就用打印流(PrintReader),输入流就用Scanner。

十二、序列化 所有项目开发一定有序列化的概念存在 序列化:将内存中的对象变为二进制流的形式在网络传输或保存到文件中。 不是所有类都可以序列化,要想序列化,必须实现java.io.Serializable接口。 但是这个接口并没有任何的方法定义,只是一个标识而已。 Serializable接口为标记接口,JVM会将此类识别并自动序列化。 序列化与反序列化操作 ObjectOutputStream、 writeObject(object obj) 将对象序列化输出 ObjectInputStream readObject(object obj) 将对象反序列化输入 transient关键字: 默认会将对象中所有属性序列化保存,某些属性不希望被序列化保存,使用transient关键字。 输出流就用打印流(PrintReader) 输入流就用Scanner