File的解析
在程序中,我们使用java.io.File这个类来描述和操作磁盘上的一个文件或文件夹(目录)。File这个类,能新建、删除、移动,重命名文件或文件夹,也能获取或者修改文件或文件夹的信息(如大小,修改时间等),但File不能访问文件里的内容。如果需要访问文件里的内容,则需要使用输入/输出流。
路径
用来描述一个文件或者文件夹所存在的位置,可以分为 绝对路径 和 相对路径。
绝对路径
从磁盘的根目录开始,一层层的向内查找,直到找到这个文件。在不同的操作系统中,根目录的表示方式可能略有不同。例如,在UNIX和Linux系统中,根目录用斜杠(/)表示,如/home/user/file.txt
;而在Windows系统中,根目录用驱动器名和冒号表示,如C:\Users\User\file.txt
。
相对路径
是相对于当前工作目录或另一个已知位置的路径。它描述的是文件或目录与当前位置之间的相对关系。相对路径通常省略了根目录部分,直接从当前目录开始描述路径。例如,假设当前工作目录是/home/user,要访问该目录下的文件file.txt,可以使用相对路径file.txt,而不需要写出完整的绝对路径。./ : 表示当前工作目录。 ./可以省略
File的常用构造器
File(String pathname) File(String parent,String child) File(File parent,String child)
构造器只负责接收程序员传入的路径,并不会校验这个路径是否真实存在。
public class FileDemo02 {
public static void main(String[] args) {
//使用File类型来描述一个文件夹 D盘的下dir1文件夹。
// File file = new File("D:/dir1");
File file = new File("D:"+File.separator+"dir1");
bollean result = file.exists();
if (result){
System.out.println("所描述的文件或者文件夹存在");
}else{
System.out.println("所描述的文件或者文件夹不存在");
}
/**
* 调用构造器File(String parent,String child)
*/
File file1 = new File("D:/code","BianLiang.java");
System.out.println(file1.exists());
/**
* 调用构造器File(File parent,String child)
*/
File parent = new File("D:/code");
File file2 = new File(parent,"BianLiang.java");
System.out.println(file2.exists());
}
}
文件属性的相关方法
public class FileDemo03 {
public static void main(String[] args) {
//使用File构造器来描述一个真实存在的路径
File file = new File("D:/code/BianLiang.java");
System.out.println(file.getName());
System.out.println(file.getAbsolutePath());
System.out.println(file.getParent());
System.out.println(file.getPath());
System.out.println(file.isFile());
System.out.println(file.isDirectory);
System.out.println(file.isHidden());
System.out.println(file.canRead);
System.out.println(file.canWrite());
System.out.println(file.canExecute());
System.out.println(file.lastModified());
System.out.println(file.length());
File file = new File("D:/code");
String[] lists = file.list();
for(String list : lists){
System.out.println(list);
}
File[] files = file.listFiles();
for(File file1 : files){
System.out.println(file1.getName()+" "+file1.)
}
//匿名内部类定义一个过滤器对象
FilenameFilter filter = new FilenameFilter(){
//dir:要操作的那个文件夹 name:文件夹里的每一个文件或文件夹
public boolean accept(File dir,String name){
return !name.endsWith(".java");
}
};
String[] list = file.list(filter);
for(String list1:list){
System.out.println(list1);
}
File[] files1 = file.listFiles(filter);
System.out.println(Arrays.toString(files1));
}}
文件夹的多层级创建
mkdir() 创造一个空文件夹,不能多层级创建
mkdirs() 可以多层级创建
public class FileDemo06 {
public static void main(String[] args) {
File file = new File("D:/dir11/dir22/dir33");
if(!file.exists()){
file.mkdirs();
}
//重命名
File file1 = new File("D:/dir11/dir22/dir33");
if(file1.exists()){
file1.renameTo(new File("D:/dir11/dir22/dir333"));
}
//renameTo(File file)移动文件夹
File file2 = new File("D:/dir11/dir22/dir333/file1.txt");
File file3 = new File("D:/dir11/dir22/file1.txt");
if(file2.exists()){
file2.renameTo(file3);
}
}
}
File的删除功能
1.delete方法只能删除文件或者空文件夹
2.delete方法如果想删除非空文件夹,需要把里面删除干净才能被删除。
public class FileDemo07 {
public static void main(String[] args) {
// File file = new File("D:/dir11/dir22/file1.txt");
// if (file.exists()) {
// boolean f = file.delete();
// System.out.println("f:"+f);
// }
/* 测试: 删除 D:/dir11 */
File f = new File("D:/dir11");
delete(f);
}
/**
* 使用递归算法,删除指定的文件夹。
* @param file 可能是文件夹,也可能是文件。
*/
public static void delete(File file){
if(!file.exists()){
throw new RuntimeException("要删除的文件或者文件夹不存在");
}
if (file.isDirectory()) {
//获取文件夹里的内容,可能是文件夹,或者是文件
File[] files = file.listFiles();
//遍历每一个文件夹或者文件
for (File f : files) {
//f可能是文件夹,可能是文件,那就调用自己。
delete(f);
}
}
//if执行完,如果是文件夹,里面的内容清空了,然后自己就是空文件夹了,也能被删除了。
//如果不是文件夹,是文件也能删除。
file.delete();
}
}
FileInputStream
FileInputStream1.是InputStream抽象类的子类型
2 是一个低级流,用于连接文件和程序。
3 常用构造器:FileInputStream(String pathname) FileInputStream(File file)
public class FileInputStreamDemo01 {
public static void main(String[] args) {
FileInputStream fis = null;
try{
fis = new FileInputStream("D:/file1.txt");
//读取一个字符
int ch = fis.read();
System.out.println((char) ch);
//读取后续10个字符
for(int i = 0;i<10 ;i++){
ch = fis.read();//读取一次与磁盘交互一次,读取次数多,性能差
System.out.println((char) ch);
}
//提前创建一个10长度的byte数组
byte[] bs = new byte[10];
while((length = fis.read(bs)) != -1){
String str = new String()
}
}catch (FileNotFoundException e) {
throw new RuntimeException(e);
}catch (IOException e) {
e.printStackTrace();
}finally{
try{
fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
FileOutputStream
文件输出流1.是OutputStream的一个子类型
2.是一个低级流(节点流),用于连接文件和程序
3.常用构造器
FileOutputStream(File file) 会覆盖文件中原有的内容
FileOutputStream(String pathname) 会覆盖文件原有的内容
FileOutputStream(File file,boolean append) 有追加效果
FileOutputStream(String pathname,boolean append) 有追加效果
4.输出流,不会创建不存在的文件夹,但是如果文件不存在会创建出来
`write`方法可以写多个字节,但它不能写字符串。 如果要写字符串,可以使用`getBytes`方法将字符串转换为字节数组,然后使用`write`方法写入。
public class FileOutputStreamDemo01 {
public static void main(String[] args) {
//向D:的file1.txt写东西
FileOutputStream fos = null;
try{
fos = new FileOutputStream("D:/file1.txt",true);
fos.write(65);
for(int i = 'B';i<= 'Z';i++){
fos.write(i);
}
byte[] byte = "hello world".getBytes("utf-8");
fos.write(bytes,0,7);
}catch (IOException e){
e.printStackTrace();
}finally{
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}