文件:File类
语法:
1)File 变量名 = new File(String pathname);
通过将给定路径名的字符串转换成抽象路径来创建
2)File 变量名 = new File(URI uri);
通过将给定File的uri转换成抽奖路径名来创建
3)File 变量名 = new File(String parent, String child);
根据parent路径名的字符串和child路径名的字符串创建
4)File 变量名 = new File(File parent,Stirng child);
根据parent抽象路径名和child路径名字符串创建
常用方法:
boolean createNewFile():
当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件
boolean exists():
测试此抽象路径名表示的文件或目录是否存在
boolean delete():
删除此抽象路径名表示的文件或目录
boolean equals(Object obj):
测试此抽象路径名与给定对象是否相等
boolean canRead():
测试应用程序是否可以读取此抽象路径名表示的文件
boolean canWrite():
测试应用程序是否可以修改此抽象路径名表示的文件
String[] list():
返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组
File[] listFiles():
返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件
String getAbsolutePath():
返回抽象路径名的绝对路径名字符串
String getName():
返回由此抽象路径名表示的文件或目录的名,不包括路径名
String getPath():
将此抽象路径名转换为一个路径名字符串
long length():
返回由此抽象路径名表示的文件的大小,以byte为单位
boolean mkdir():
创建此抽象路径名指定的目录
boolean mkdirs():
创建此抽象路径名指定的目录,包括创建必需但不存在的父目录.注意,如果此操作失败,可能已成功创建了一些必需的父目录
Files:
createFile():
在指定的目标目录创建新文件
delete():
删除指定目标路径的文件或文件夹
copy():
将指定目标路径的文件拷贝到另一个文件中
move():
将指定目标路径的文件转移到其他路径下并删除源文件
流: java.io.*;
数据发生移动
分类:
按照方向分:以程序为标准来定义输入输出
1)输入流: XxxInputStream XxxReader
2)输出流: XxxOutputStream XxxWriter
按照处理数据的单位不同:
1)字节流:8位,传中文出现乱码
XxxInputStream XxxOutputStream
2)字符流:16位
XxxReader XxxWriter
按照功能分:
1)节点流:
从一个特定的数据源(节点)读写数据(如:文件/内存)的类叫做节点流类
2)处理流:
节点流之上的流
InputStream常用的方法:
int read():
一次读取一个byte的数据,并以int类型把数据返回来(ASCII码),如果没有数据可以读了,会返回"-1"
int read(byte[] buffer):
把所读取到的数据放在这个byte数组中,返回一个int型的数据,这个int型数据存储了返回的真正读取到的数据byte数
int read(byte[] buffer,int offset,int length):
读取length个字节,并存储到一个字节数组buffer中,并从offset位置开始返回实际读取的字节数
void close():
关闭此输入流并释放与该流关联的所有系统资源
OutputStream常用的方法:
void write(byte[] buffer):
将要输出的数组先放在一个byte数组中,然后用这个方法一次把一组数据输出出去
void write(byte[] buffer,int off,int len):
将指定字节数组中从偏移量off开始的len个字节写入此输出流
abstract void write(int b):
将指定的字节写入此输出流
void close():
关闭此输出流并释放与此流有关的所有系统资源
void flush():
刷新此输出流并强制写出所有缓冲的输出字节
Reader常用的方法:
int read():
一次读取一个char的数据,并以int类型把数据返回来(ASCII码),如果没有数据可以读了,会返回"-1"
int read(char[] cbuffer):
把所读取到的数据放在这个char数组中,返回一个int型的数据,这个int型数据存储了返回的真正读取到的数据char数
int read(char[] cbuffer,int offset,int length):
读取length个字符,并存储到一个字节数组cbuffer中,并从offset位置开始返回实际读取的字符数
void close():
关闭此Reader并释放与其关联的所有系统资源
Writer常用的方法:
void write(char[] cbuffer):
将要输出的数组先放在一个char数组中,然后用这个方法一次把一组数据输出出去
void write(char[] cbuffer,int off,int len):
将指定字符数组中从偏移量off开始的len个字符写入此输出流
int write(int b):
将指定的字符写入此输出流
void write(String str):
写入字符串
void write(String str, int off,int len):
将指定字符串中从偏移量off开始的len个字符写入此输出流
void close():
关闭此输出流并释放与此流有关的所有系统资源
void flush():
刷新此输出流并强制写出所有缓冲的输出字符
文件流:
File:
流的步骤:
1):搭建管道(创建相应的对象)
2):读写操作
3):关闭流
处理流:
1)只用字节或是字符为单位来对数据做输入输出是不够的,有时候我们需要一行一行的读数据,有时我们需要读取特定格式的数据,因此Java提供了这样的机制,能把数据流作连接(chain),让原本没有特殊访问方法的流,通过连接到特殊的流后,变成可以用特定的方法来访问数据
2)"连接"在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能
3)处理流类的构造函数中,都必须接收另外一个流对象作为参数
处理流分类:
缓冲区流
BufferedReader
BufferedWriter
BufferedInputStream
BufferedOutputStream
行号
LineNumberReader
LineNumberInputStream
数据流
DataInputStream
DataOutputStream
数据流可以写除了整型和字符型之外的数据类型的数据,其他的流不可以
字节字符转换流:
InputStreamReader:字节流转成字符流 键盘输入
OutputStreamWriter:字符流转成字节流 控制台输出
序列化与反序列化:
ObjectInputStream:反序列化:根据字节序列恢复对象的过程
ObjectOutputStream:序列化:对象转换为字节序列的过程
序列化:
将对象转换为字节序列的过程(对象的数据永久存储到文件)
反序列化:
根据字节序列恢复对象的过程(将文件的数据读取到程序的对象中)
序列化步骤:
1)创建一个可序列化的类(即实现Serializable或者Externalizable),用来保存对象的数据
2)创建对象,存储数据
3)搭建管道
4)读写操作
5)关闭流
序列化的应用场景:
1)永久性保存对象,保存对象的字节序列到本地文件中
2)通过序列化对象在网络中传递对象
3)通过序列化在进程间传递对象
注意点:
1)Serializable接口里面没有任何方法,和cloneable接口一样,是一个标记接口,表示可以该类可以被序列化,如果一个类可以被序列化,它的所有子类都可以序列化
2)Externalizable接口:Serializable的子接口
3)transient修饰的属性不进行序列化的操作,起到一定消息屏蔽的效果;被transient修饰的属性可以正确的创建,但被系统赋为默认值.即int类型为0,String类型为null.
4)ObjectInputStream和ObjectOutputStream类不会保存和读写对象中的transient和static类型的成员变量
自动资源管理器:
在JDK7之前,我们需要使用一个finally块,来确保资源确实被释放掉,不管try块是完成了还是中断了.比如说读取文件或者输入流的时候,我们需要在finally块中关闭它们;而在Java7里面,可以使用try-with-resource的特性来自动关闭资源,只要是实现了AutoClosable和Closeable接口的都可以,几乎所有的资源类型都实现了Closeable接口,并重写了close()方法
语法:
try(搭建管道的语句) {
//...
} catch(Exception e) {
e.printStackTrace();
}
把数据永久性保存:
数据库,文件流,xml
处理流套接节点流时,字节流只能套字节流,字符流只能套字符流,除了InputStreamReader和OutputStreamWriter
字节流:read()返回的int型是ASCII码的值
可以通过使用字节数组read(byte[])模拟读取中文,但是长度必须是偶数,当读取到最后一次时,如果长度不足字符数组的长度时,会自动填充一些,所以会多读取一些数据
JDK1.7以上 try-with-resource的特性来自动关闭资源
JDK1.7: nio2 java.nio.file
Paths:
Path:
Files:
WatchService: