一、java.io.File类
1、他代表磁盘上的文件或目录
2、他内部封装了一些方法,可以查看此文件或目录的一些信息
文件/目录是否存在,判断时文件还是目录,文件/目录的大小、修改时间、是否可读/可写
3、凡是与输入和输出有关的类、接口等都定义在java.io包下
4、File是一个类,可以由构造器创建其对象,此对象对应着一个文件(.txt/.avi/.doc/.ppt/.mp3/.jpg)或者文件目录
5、文件的路径可以是绝对路径,也可以是相对路径
6、File类对象与平台无关
7、File中的方法仅涉及到如何创建、删除、重命名等操作。File类无法处理涉及到文件内容的操作,必须有IO流才能处理
8、File类的对象常作为IO流的具体类的构造器的形参
二、File类常用方法
1、构造方法
public File(String name)
File的构造方法接受的是String,是否是有效的路径无所谓,后期可以通过File内部的一些方法类判断
public File(String parent,String child)
public File(File parent,String child)
2、访问文件名:
getName()//获取文件名
getPath()//获取文件相对路径
getAbsoluteFile()
getAbsolutePath()//获取绝对路径
getParent()//获取父目录
renameTo(File newName)//相同目录下:重命名 不同目录下:重命名并剪切
3、文件操作相关
createNewFile()//创建文件
delete()//删除文件/目录,不能删除多级目录,如果要删除多级目录则使用递归
4、文件检测
exists()//判断文件是否存在
canWrite()//判断是否可写
canRead()//判断是否可读
isFile()//判断是否是文件
isDirectory()//判断是否是目录
isHidden()//判断文件是否隐藏
5、目录操作相关
mkDir()//创建目录
mkDirs()//创建多级目录
list()//获取此目录下所有文件和目录的名称
listFiles()//获取此目录下所有文件和目录的File数组
如果只需要获取名称,没有后续操作则使用list()
如果需要对文件或目录进行后续操作则使用listFile()
6、获取常规文件信息
public long lastModified()//上次修改的时间
public long length()//文件长度
7、接口
FilenameFilter(接口):文件过滤器需要定义一个类实现该接口,并重写accept()方法
三、IO流(有方向的、线性的)
1、基本流(四个抽象类)
抽象基类
字节流
字符流
输入流
InputStream
Reader
输出流
OutputStream
Writer
2、流的分类
2/1 按数据流向:
输入流:从外部向应用程序读取数据
输出流:从应用程序向外部写出数据
2/2 按处理数据的单位不同:字节流(文本文件意外的都用字节流处理)、字符流(处理文本文件)
2/3 按角色不同:节点流(直接作用于文件上的是节点流)、处理流
3、抽象基类
节点流
缓冲流(能提高文件的读写速度)
InputStream
FileInputStream
BufferedInputStream
OutputStream
FileOutputStream
BufferedOutputStream
Reader
FileReader
BufferedReader
Writer
FileWriter
BufferedWriter
4、字节流
4/1 方法
4/1/1 FileInputStream(字节流)--->InputStream的子类
构造方法:
FileInputStream(String name):使用name作为文件路径,构造一个通向这个文件的输出管道
FileInputStream(File file):使用File作为文件路径,构造一个通向这个文件的输出管道
成员方法:
public int read():从此输入流中读取一个数据字节
public int read(byte[] b):从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
public int read(byte[] b, int off, int len):从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
4/1/2 FileOutputStream(字节流)--->OutputStream的子类
构造方法:
FileOutputStream(File file):创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
public FileOutputStream(File file,boolean append):创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。
public FileOutputStream(String fileName,boolean append)
普通方法:
public void write(int b):输出一个字节
public void write(byte[] b):输出一个字节数组
public void write(byte[] b,int off,int len):输出一个byte数组的一部分
4/2 换行符
Windows下的换行符:\r\n
5、转换流(字符流)
InputStreamReader OutputStreamWriter
编码:字符串 --->字节数组 String ---> getBytes()
解码:字节数组--->字符串 byte[] ---> String(使用String构造方法)
当我们写入文件时,如果需要显示在屏幕上,最好指定编码方式,保证写入时的编码方式和读取时的编码方式一致
5/1 OutputStreamWriter(转换流、字符流):
构造方法:
public OutputStreamWriter(OutputStream out)
public OutputStreamWriter(OutputStream out,String charseName)
写入的方法:
public void write(int n):写一个字符
public void write(char[] cbuf):写入一个字符数组
public void write(char[] cbuf,int off,int len):写入一个字符数组的一部分
public void write(String str):写入一个字符串
public void write(String str,int off,int len):写入一个字符串的一部分
5/2 InputStreamReader(转换流、字符流)
构造方法:
InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader
InputStreamReader(InputStream in,String charseName):创建一个使用指定字符集的InputStreamReader
读取的方法:
int read():读取单个字符
int read(char[] cbuf):一次读取一个字符数组
int read(char[] cbuf,int off,int len);
6、字符流
6/1 FileWriter(字符流、基本流)--->OutputStreamWriter的子类
构造方法:
FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append):根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd):构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName):根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append): 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
成员方法:父类的成员方法()没有自己的成员方法
6/2 FileReader(字符流、基本流)---> InputStreamReader的子类
构造方法:
FileReader(File file):在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(FileDescriptor fd):在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader。
7、标准输入输出流
System.out:返回类型----InputStream(字节流)
System.in:返回类型-----OutputStream(字节流)
8、数据流
用来处理基本数据类型、字节数组、String的数据:DataInputStream DataOutputStream
DataOutputStream:数据输出流允许应用程序以适当的方式将基本Java数据类型写入输出流中,然后应用程序可以使用输入流将数据读入
java.lang.Object
|----java.io.OutputStream
|----java.io.FilterOutputStream
|----java.io.DataOutputStream
成员方法:
void flush():清空此数据输出流。
int size():返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数。
void write(byte[] b, int off, int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入基础输出流。
void write(int b):将指定字节(参数 b 的八个低位)写入基础输出流。
void writeBoolean(boolean v):将一个 boolean 值以 1-byte 值形式写入基础输出流。
void writeByte(int v):将一个 byte 值以 1-byte 值形式写出到基础输出流中。
void writeBytes(String s):将字符串按字节顺序写出到基础输出流中。
void writeChar(int v):将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。
void writeChars(String s):将字符串按字符顺序写入基础输出流。
void writeDouble(double v):使用 Double 类中的 doubleToLongBits 方法将 double 参数转换为一个 long 值,然后将该 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
void writeFloat(float v):使用 Float 类中的 floatToIntBits 方法将 float 参数转换为一个 int 值,然后将该 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
void writeInt(int v):将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
void writeLong(long v):将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
void writeShort(int v):将一个 short 值以 2-byte 值形式写入基础输出流中,先写入高字节。
void writeUTF(String str):以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
DataInputStream:
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
java.lang.Object
|-----java.io.InputStream
|-----java.io.FilterInputStream
|-----java.io.DataInputStream
DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
成员方法:
int read(byte[] b):从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中。
int read(byte[] b, int off, int len):从包含的输入流中将最多 len 个字节读入一个 byte 数组中。
boolean readBoolean():参见 DataInput 的 readBoolean 方法的常规协定。
byte readByte():参见 DataInput 的 readByte 方法的常规协定。
char readChar(): 参见 DataInput 的 readChar 方法的常规协定。
double readDouble(): 参见 DataInput 的 readDouble 方法的常规协定。
float readFloat():参见 DataInput 的 readFloat 方法的常规协定。
void readFully(byte[] b):参见 DataInput 的 readFully 方法的常规协定。
void readFully(byte[] b, int off, int len):参见 DataInput 的 readFully 方法的常规协定。
int readInt():参见 DataInput 的 readInt 方法的常规协定。
long readLong(): 参见 DataInput 的 readLong 方法的常规协定。
short readShort():参见 DataInput 的 readShort 方法的常规协定。
int readUnsignedByte():参见 DataInput 的 readUnsignedByte 方法的常规协定。
int readUnsignedShort():参见 DataInput 的 readUnsignedShort 方法的常规协定。
String readUTF():参见 DataInput 的 readUTF 方法的常规协定。
static String readUTF(DataInput in):从流 in 中读取用 UTF-8 修改版格式编码的 Unicode 字符格式的字符串;然后以 String 形式返回此字符串。
int skipBytes(int n):参见 DataInput 的 skipBytes 方法的常规协定。
9、对象流
9/1 用于存储和读取对象的处理流,他可以把对象写入到数据源中,也可以把对象从数据源中还原回来
9/2 序列化(Serialize):用ObjectOutputStream类将一个Java对象写入IO流中
反序列化(Deserialize):用ObjectInputStream类从IO流中恢复该Java对象
9/3 要让某个类的对象支持序列化机制,这个类必须是可序列化的
94 要实现一个可序列化的类:
9/4/1 类实现Serializable接口
9/4/2 类的属性也实现了Serializable接口
9/4/3 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:
private static final long serialVersionUID;
9/4/4 ObjectOutputStream和ObjectInputStream不能序列化transient修饰的成员变量
10、RandomAccessFile类(不属于任何流)
10/1 RandomAccessFile 类不属于流,是Object类的子类。支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件(即既可以充当输入流,又可以充当输出流)
支持只访问文件的部分内容
可以向已存在的文件后追加内容
10/2 RandomAccessFile 类对象可以自由移动记录指针:
long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到 pos 位置
10/3 构造器
public RandomAccessFile(File file, String mode):创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。
public RandomAccessFile(String name, String mode):创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
10/4 创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 RandomAccessFile 的访问模式:
r: 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新
10/5 成员方法
public long length():返回文件的长度
读:
public int read():读取一个字节数据
public int read(byte[] b):一次读取一个字节数组的数据
public int read(byte[]b, int start,int length):一次读取字节数组的一部分
写:
public void write(byte[] b):读取b.length个字节的数据写到文件中
public void write(byte[] b, int start, int length):
public void write(int n):写入指定字节
11、内存操作流——字节缓冲流
ByteArrayInputStream:从内存读取,不需要close
ByteArrayOutPutStream:向内存中写入,不需要close
StringBuffer:用来缓存字符串
ByteArrayOutPutStream:用来缓存byte[]数组
12、操作字符数组
CharArrayReader
CharArrayWriter
13、操作字符串
StringReader
StringWriter
14、打印流
Writer:
|-----PrintWriter
PrintWriter实现自动刷新和换行
OutputStream
|-----FilterOutputStream
|-----PrintStream
PrintWriter构造方法:
PrintWriter(File file):不具有自动刷新功能
PrintWriter(String fielName):不具有自动刷新功能
PrintWriter(OutputStream out, boolean autoFlush) :通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter(Writer out, boolean autoFlush): 创建新 PrintWriter。
如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作。
write方法,即使启动了自动刷新,也不会自动刷新缓冲区。
PrintWriter out = new PrintWriter(new FileWriter("demo11.txt"),true);
out.println("java");//write() + newLine() + flush(),相当于打印+换行+刷新
15、总结
输入流:InputStream
成员方法:
int read()
int read(byte[] b)
int read(byte[] b, int start,int end)
|-----FileInputStream
|-----FilterInputStream
|-----BufferedInputStream
输出流:OutputStream
成员方法:
write(int n)
write(byte[] b)
write(byte[] b, int start, int end)
|-----FileOutputStream
|-----FilterOutputStream
|-----BufferedOutputStream
输入流:Reader
成员方法:
int read()
int read(char[] b)
int read(char[] b, int start,int end)
|-----InputStreamReader
|-----FileReader
|-----BufferedReader
成员方法:
int read()
int read(char[] b)
int readLine()
int read(char[] b, int start,int end)
输出流:Writer
成员方法:
void write(int c)
void write(char[] ch)
void write(char[] ch, int start, int end)
void write(String str)
void write(String str, int start,int end)
|-----OutputStreamWriter
|-----FileWriter
|-----BufferedWriter