File类代表操作系统的文件对象(文件、文件夹),在java.io.File包下。
File类提供了诸如:定位文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件夹)等功能。
public File(String pathname) |
根据文件路径创建文件对象 |
public File(String parent, String child) |
根据父路径名字符串和子路径名字符串创建文件对象 |
public File(File parent, String child) |
根据父路径对应文件对象和子路径名字符串创建文件对象 |
File file = new File(“文件/文件夹/绝对路径/相对路径”);
绝对路径:从盘符开始
相对路径:不带盘,默认直接从当前工程下的目录寻找文件
public boolean isDirectory() |
判断此路径名表示的File是否为文件夹 |
public boolean isFile() |
判断此路径名表示的File是否为文件 |
public boolean exists() |
判断此路径名表示的File是否存在 |
public long length() |
返回文件的大小(字节数量) |
public String getAbsolutePath() |
返回文件的绝对路径 |
public String getPath() |
返回定义文件时使用的路径 |
public String getName() |
返回文件的名称,带后缀 |
public long lastModified() |
返回文件的最后修改时间(时间毫秒值) |
public boolean createNewFile() |
创建一个新的空的文件 |
public boolean mkdir() |
只能创建一级文件夹 |
public boolean mkdirs() |
可以创建多级文件夹 |
public boolean delete() |
删除由此抽象路径名表示的文件或空文件夹 |
public String[] list() |
获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。 |
public File[] listFiles()(常用) |
获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点) |
ListFiles方法:
- 当文件不存在时,返回null
- 当文件对象代表文件时,返回null
- 当文件对象代表一个空文件夹时,返回一个长度为0的数组
- 当文件对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
- 当文件对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件当没有权限访问该文件夹时,返回null
常见字符集:ASCII、GBK、UTF-8(Unicode)
- ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):包括了数字、英文、符号。ASCII使用1个字节存储一个字符,一个字节是8位,总共可以表示128个字符信息
- GBK是中国的码表,包含了几万个汉字等字符。GBK要兼容ASCII编码,但其中文字符一般以两个字节的形式存储。
- Unicode,统一码,也叫万国码。是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的。UTF-8是Unicode的一种常见编码方式, 以单个字节为单位对Unicode中的字符进行编码。
英文和数字等在任何国家的字符集中都占1个字节
GBK字符中一个中文字符占2个字节
UTF-8编码中一个中文1般占3个字节
String编码
byte[] getBytes() |
使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中 |
byte[] getBytes(String charsetName) |
使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中 |
String解码
String(byte[] bytes) |
通过使用平台的默认字符集解码指定的字节数组来构造新的 String |
String(byte[] bytes, String charsetName) |
通过指定的字符集解码指定的字节数组来构造新的 String |
// 默认UTF-8解码
String a = new String(bytename);
// 选用GBK解码
String a = new String(bytename, "GBK");
作用:读写文件数据
I 表示intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。
O 表示output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。
字节流:操作所有类型的文件,包括音视频图片等
字符流:只能操作纯文本文件,包括Java文件、txt文件
- 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
- 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
- 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
- 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。
构造器 |
说明 |
public FileInputStream(File file) |
创建字节输入流管道与源文件对象接通 |
public FileInputStream(String pathname) |
创建字节输入流管道与源文件路径接通 |
InputStream is = new FileInputStream(new File("a.txt"));
InputStream is = new FileInputStream("a.txt");
public int read() |
每次读取一个字节返回,如果字节已经没有可读的返回-1 |
public int read(byte[] buffer) |
每次读取一个字节数组返回,如果字节已经没有可读的返回-1 |
方式一:自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成(缺点:若文件过大,字节数组会溢出)
public int read(byte[] buffer) |
每次读取一个字节数组返回,如果字节已经没有可读的返回-1 |
File f = new File("a.txt");
InputStream is = new FileInputStream(f);
byte[] buf = new byte[(int) f.length()];
// 把字节数据读取到buf数组中,返回读取的字节个数
int len = is.read(buf);
System.out.println("读取大小" + len);
// 文件内容
String rs = new String(buf);
System.out.println(rs);
方式二:官方为字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中
public byte[] readAllBytes() throws IOException |
直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回 |
//JDK9之后提供
byte[] buffer = is.readAllBytes();
System.out.println(new String(buffer));
文件字节输出流:
FileOutputStream:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流。
public FileOutputStream(File file) |
创建字节输出流管道与源文件对象接通 |
public FileOutputStream(File file,boolean append) |
创建字节输出流管道与源文件对象接通,可追加数据 |
public FileOutputStream(String filepath) |
创建字节输出流管道与源文件路径接通 |
public FileOutputStream(String filepath,boolean append) |
创建字节输出流管道与源文件路径接通,可追加数据 |
文件字节输出流(FileOutputStream)写数据出去的API
public void write(int a) |
写一个字节出去 |
public void write(byte[] buffer) |
写一个字节数组出去 |
public void write(byte[] buffer , int pos , int len) |
写一个字节数组的一部分出去。 |
流的关闭与刷新
flush() |
刷新流,还可以继续写数据 |
close() |
关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
字节输出流实现写出去的数据能换行:os.write(“\r\n”.getBytes())
构造器
构造器 | 说明 |
public FileReader(File file) |
创建字符输入流管道与源文件对象接通 |
public FileReader(String pathname) |
创建字符输入流管道与源文件路径接通 |
方法 | 说明 |
public int read() |
每次读取一个字符返回,如果字符已经没有可读的返回-1 |
public int read(char[] buffer) |
每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1 |
构造器 | 说明 |
public FileWriter(File file) |
创建字符输出流管道与源文件对象接通 |
public FileWriter(File file,boolean append) |
创建字符输出流管道与源文件对象接通,可追加数据 |
public FileWriter(String filepath) |
创建字符输出流管道与源文件路径接通 |
public FileWriter(String filepath,boolean append) |
创建字符输出流管道与源文件路径接通,可追加数据 |
方法 | 说明 |
void write(int c) |
写一个字符 |
void write(char[] cbuf) |
写入一个字符数组 |
void write(char[] cbuf, int off, int len) |
写入字符数组的一部分 |
void write(String str) |
写一个字符串 |
void write(String str, int off, int len) |
写一个字符串的一部分 |
void write(int c) |
写一个字符 |
方法 | 说明 |
flush() |
刷新流,还可以继续写数据 |
close() |
关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
字符输出流写出数据换行:fw.write("\r\n");
字节流、字符流如何选择使用?
- 字节流适合做一切文件数据的拷贝(音视频,文本)
- 字节流不适合读取中文内容输出
- 字符流适合做文本文件的操作(读,写)
- finally:放在try-catch后面的,无论是正常执行还是异常执行代码,最后一定会执行,除非JVM退出。
- 作用:一般用于进行最后的资源释放操作(专业级做法)
try {
} catch (IOException e) {
e.printStackTrace();
} finally{
}
InputStream is = null ;
OutputStream os = null;
try{
...
}catch (Exception e){
e.printStackTrace();
} finally {
// 关闭资源!
try {
if(os != null) os.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if(is != null) is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
资源用完自动释放
JDK7
try(定义流对象){
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
try(InputStream is = null ;
OutputStream os = null;
){
...
}catch (Exception e){
e.printStackTrace();
}
JDK9
定义输入流对象;
定义输出流对象;
try(输入流对象;输出流对象){
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}