File - IO
1 File
1.1 对象的创建【关联文件】
1.1.1 注意
File对象既可以代表文件、也可以代表文件夹
File封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许是不存在的
1.1.2 常用方法
- 根据文件路径创建文件对象: public File(String pathname)
- 根据父路径和子路径名字创建文件对象: public File(String parent, String child)
- 根据父路径对应文件对象和子路径名字创建文件对象: public File(File parent, String child)
1.2 创建文件
1.2.1 常用方法
- 创建一个新的空的文件: public boolean createNewFile()
- 只能创建一级文件夹: public boolean mkdir()
- 可以创建多级文件夹:public boolean mkdirs()
1.3 删除文件删除文件、空文件夹
public boolean delete(
1.4 判断文件类型
1.4.1 常用方法
- 判断当前文件对象,对应的文件路径是否存在,存在返回true: public boolean exists()
- 判断当前文件对象指代的是否是文件,是文件返回true: public boolean isFile()
- 判断当前文件对象指代的是否是文件夹,是文件夹返回true: public boolean isDirectory()
1.5 获取文件信息
1.5.1 常用方法
- 获取文件的名称(包含后缀): public String getName()
- 获取文件的大小,返回字节个数:public long length()
- 获取文件的最后修改时间: public long lastModified()
- 获取创建文件对象时,使用的路径: public String getPath()
- 获取绝对路径: public String getAbsolutePath()
1.6 遍历文件夹
- 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回: public String[] list()
- 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回: public File[] listFiles()
2 递归
2.1 概念
递归是一种算法, 在程序设计语言中广泛应用, 层层递进,不断回归
常用于多层包含, 例如文件夹的遍历, 子类目的创建; 或者算法中, 例如二分查找, 斐波那契数列, 汉诺塔
2.2 形式
2.2.1 直接递归
方法自己调用自己
2.2.2 间接递归
方法调用其他方法,其他方法又回调方法自己
3 FileOutputSteam(文件字节输出流)
3.1 作用
以内存为基准,把内存中的数据以字节的形式写出到文件中去
3.2 流关联文件
3.2.1 常用方法
- 创建字节输出流管道与源文件对象接通: public FileOutputStream(File file)
- 创建字节输出流管道与源文件路径接通: public FileOutputStream(String filepath)
- 创建字节输出流管道与源文件对象接通,可追加数据: public FileOutputStream(File file, boolean append)
- 创建字节输出流管道与源文件路径接通,可追加数据: public FileOutputStream(String filepath,boolean append)
3.3 写数据
3.3.1 常用方法
- 写一个字节出去: public void write(int a)
- 写一个字节数组出去: public void write(byte[] buffer)
- 写一个字节数组的一部分出去: public void write(byte[] buffer , int pos , int len)
- 关闭流: public void close() throws IOException
4 FileInputStream(文件字节输入流)
4.1 作用
以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去
4.2 流关联文件
- 创建字节输入流管道与源文件接通: public FileInputStream(File file)
- 创建字节输入流管道与源文件接通: public FileInputStream(String pathname)
4.3 读数据
- 每次读取一个字节返回,如果发现没有数据可读会返回-1: public int read()
- 每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会 返回-1: public int read(byte[] buffer)
- 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回: public byte[] readAllBytes() throws IOException
4.4 注意
4.4.1 字节数组调用数据
当使用字节数组调用数据时, 应注意, 当调用的数据占用不止一个字节时, 在字节数组的间隔, 有可能导致因分段产生的错乱, 如果数据大小不大可以采用一次性读取所有数据, 也可以调节字节数组的长度调大, 但是会造成空间浪费
4.4.2 一次性读取数据
当一次性读取数据时, 如果数据过大, 会导致占用内存空间大于分配给java虚拟机的空间, 导致异常error, 此时应该使用字节数组的方法读取数据
4.5 代码示范
4.5.1 字节数组调用数据
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
public class inputMultiple {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("D:\\code\\IdeaProjects\\java-advanced-190\\day09-file-IO\\src\\com\\itheima\\AKB48\\akb48.txt");
// 创建200大小的空byte array
byte[] bytes = new byte[200];
// 读取器计数=0
int read = 0;
// 读取, 当读取不到数值结束. 否则输出从0到read(长度)的bytes文件
while ((read = fis.read(bytes))!=-1){
System.out.println(Arrays.toString(bytes));
String output = new String(bytes,0,read);
System.out.println(output);
}
// 关流
fis.close();
}
}
4.5.2 一次性读取数据
import java.io.FileInputStream;
import java.io.IOException;
public class ReadallByte{
public static void main(String[] args) throws Exception {
// 流关联文件
FileInputStream fis = new FileInputStream("D:\\code\\IdeaProjects\\java-advanced-190\\day09-file-IO\\src\\com\\itheima\\AKB48\\akb48.txt");
// 一次性读取文件
byte[] bytes = fis.readAllBytes();
// 解码
String strByte = new String(bytes);
System.out.println(strByte);
// 关流
fis.close();
}
}
5 编码和解码
5.1 编码
String strCode = "yui是全天下最有用的表妹!";
// 编码
byte[] a = strCode.getBytes();
System.out.println(Arrays.toString(a));
5.2 解码
// 解码1
String strDecode = new String(a);
System.out.println(strDecode);
// 解码2
byte[] c = {-24, -128, -127};
String strPlay = new String(c);
System.out.println(strPlay);