目录
非文本文件复制( FileInputStream、FileOutputStream)
非文本文件复制 BufferedInputStream、BufferedOutputStream
文本复制(BufferedReader、BufferedWriter)
File类
File类的使用
1、File类的一个对象,代表一个文件或一个文件目录(俗称文件夹)
2、 File类生命在java.io包下
3. File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,
并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用I0流来完成。
4.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的”终点".
构造器
代码:输出文件路径,并没有创建文件
public static void main(String[] args) {
//构造器1:
File file1=new File("hello.txt"); //相对路径,相对于当前nodule
File file2=new File("D:\\IDEA项目\\hi.txt"); //绝对路径
System.out.println(file1);//hello.txt
System.out.println(file2);//D:\IDEA项目\hi.txt
//构造器2
File file3=new File("D:\\IDEA项目","1.txt");
System.out.println(file3);//D:\IDEA项目\1.txt
//构造器3
File file4=new File(file3,"2.txt");
System.out.println(file4);//D:\IDEA项目\1.txt\2.txt
}
常用方法
public String getAbsolutePath():获取绝对路径
public String getPath():获取路径
public String getName():获取名称
public String getParent():获取上层文件目录路径,若无,返回null
public Long Length():获取文件长度(字节数)。不能获取目录长度
public Long lastModified() :获取最后一次修改的时间,毫秒数
下面两个方法都适用于文件目录
public String[ ] List():获取指定目录下的所有文件或者文件目录的名称数组
public File[ ] ListFiles():获取指定目录下的所有文件或者文件目录的File数组
public boolean isDirectory():判断是否是文件目录
public boolean isFile() :判断是否是文件
public boolean exists():判断是否存在
public booLean canRead() :判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden() :判断是否隐藏
移动文件:
public boolean renameTo(File dest):把文件重命名为指定的文件路径
比如:file1.renameTo(file2)为例,将file1重命名为file2
要想保证返回true,需要file1在硬盘中是存在的,file2是不存在的
创建硬盘中对应的文件或文件目录
public boolean createNewFile() :创建文件。若文件存在,则不创速,返回false
public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建
public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
删除磁盘中的文件或文件目录
public boolean delete(): 删除文件或者文件夹删除文件夹时必须先把文件夹内的文件删光才可以删除文件夹
删除注意事项:
Java中的删除不走回收站。
代码:
public static void main(String[] args) throws IOException {
File file1 = new File("hi.txt");
if (!file1.exists()) {
file1.createNewFile();
System.out.println("创建成功");
} else {//文件存在
file1.delete();
System.out.println("删除成功");
}
IO流
流的分类
按数据单位分为字节流和字符流
按照流向分为输入流和输出流
按照角色为节点流和处理流
IO流体系
文件流
访问文件的那行是节点流 (文件流)
FileInputStream 方法: ( read(byte[ ] buffer) )
FileOutputStream 方法: ( write(byte[ ] buffer,0,len) )
FileReader 方法: ( read(char[ ] cbuf) )
FileWrite 方法: ( write(char[ ] cbuf,0,len) )
案例一:FileReader
read():返回读入的一个字符,如果达到文件末尾返回-1
异常的处理,要用到try-catch-finally,否则流出异常会无法关闭,或者没有读取到文件时关闭时空指针异常。
读入的文件不存在会出现FileNotFoundException
FileReader fileReader = null;
try {
File file = new File("D:\\IDEA项目\\day106\\hello.txt");
//提供具体的流
fileReader = new FileReader(file);
//数据读入
//read():返回读入的一个字符,如果达到文件末尾返回-1
int data = fileReader.read();
while (data != -1) {
System.out.print((char) data);
data = fileReader.read();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4、回收流
try {
if(fileReader!=null) //判断不为空才释放
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
read()的重载:read(char[] cbuf):返回每次读入cbuf数组中每个字符的个数,达到文件末尾,返回-1。
注意:cbuf [ 5 ] 数组每次从file中读取5个字符,如果文件中剩余字符不足五个,那就把从0开始读进数组中,但是数组后面的上次读取的数据不会清空。
例:helloworld123,输出的字符数组分别为hello world 123ld是
FileWriter
从内存中写出数据到硬盘的文件里
1、输出操作,对应的File可以不存在,并不会报异常
2、File对应的硬盘中文件如果不存在,在输出的过程中,会自动创建此文件
File对应的硬盘中文件如果存在:
如果构造器是FileWriter(file,false)/ FileWriter(file):对原有文件覆盖
如果流使用的构造器是FileWriter(file,true):不会对原文件覆盖,而是在原文件上追加
public static void main(String[] args) {
FileWriter fw = null;
try {
//1、提供File类对象,指明写出到的文件
File file = new File("hello1.txt");
//2、提供FileWriter对象,用于数据写出
fw = new FileWriter(file);
//3、写出操作
fw.write("hello!");
fw.write("hello!");
} catch (IOException e) {
e.printStackTrace();
}finally {
//4、资源关闭
try {
if(fw!=null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
文件复制
例:从一个文件中读取内容放入另一个文件中
注:不能使用字符流处理字节文件(例如图片)
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
//1、提供File类对象,指明写出\读入的文件
File file1 = new File("hello.txt");
File file2 = new File("hello1.txt");
//2、提供FileWriter\FileReader对象,用于数据写出\读入
fr = new FileReader(file1);
fw = new FileWriter(file2);
//3、操作
char[] cbuf = new char[5];
int len; //记录每次读取到cbuf数组中的长度
while ((len = fr.read(cbuf)) != -1) {//判断没有读取到末尾
fw.write(cbuf