概述:Java本地文件操作,涉及到文件/文件夹的创建,文件/文件夹属性的读取与设置,文件/文件夹的重命名,目录结构的遍历,以及文件内容的读取与写入。
File属于java.io.File。
---在Eclipse的大纲视图界面(Outline)中有绿色点的是用public修饰的方法,黄色代表protected方法,蓝色代表包方法,红色代表private方法。
---------------------------------------------------------------------------------------------------------------------------------------------
File类常用的方法:
构造方法:
File(String)
File(String,String)
File(File,String)
File(URI)
其他:
getName():String获取文件名
getParent():String获取上一级文件的路径
getParentFile():File返回父级文件
getPath():String获取文件的路径
isAbsolute():boolean判断是否为绝对路径
getAbsolutePath():String获取绝对路径
getAbsoluteFile():File获取绝对路径的File对象
toURL():URL转化为URL
toURI():URI转化为URI
canRead():boolean判断是否可读
canWrite():boolean判断是否可写
exists():boolean判断文件是否存在
isDirectory():boolean判断是否是一个文件夹
isFile():boolean判断是否是文件
isHidden():boolean判断文件是否隐藏
length():long得到文件的长度
createNewFile():boolean将File对象创建为一个真正的文件
delete():boolean删除文件
deleteOnExit():void当程序退出时删除文件
list():String[]列出文件(名称)
listFiles():File[]列出文件的列表
mkdir():boolean创建文件夹
mkdirs():boolean创建多级文件夹
renameTo(File):boolean将文件重命名
setReadOnly():boolean将文件设置为只读
setWritable(boolean):boolean将文件设置为可写
canExecute():boolean判断文件是否在当前操作系统中可执行
createTempFile(String,String,File):File创建临时文件
compareTo():int文件的对比
----------------------------------------------------------------------------------------------------------------------------------------
注意:File对象既可以指代一个文件,也可以指代一个文件夹,实际上File对象更像是表示文件或文件夹的路径。
创建File对象时传入文件名称(带后缀名)如果没有指定路径的话,那么文件会默认为当前项目的根目录下。
在填写File构造方法中参数的相对路径时,一定不要以"/"开头。
../代表上一级文件夹,也就是工程项目的上一级。../../代表上一级的上一级,两级向上跳转,“./”代表当前目录。
----------------------------------------------------------------------------------------------------------------------------------------
renameTo方法的效果更像是一种文件的移动,将文件移动到指定路径的同时进行文件名的变更,但是值得注意的是,
renameTo方法必须在同一分区中进行,比如windows系统中的不同盘区,跨盘区执行renameTo方法就是不允许的。而linux系统就不会收这个限制。
如果非要进行跨区的文件移动,就需要用拷贝的相关方法,而不是文件的重命名。
-------------------------------------------------------------------------------------------------------------------------------------------
在删除文件夹的时候,此文件夹必须是空文件夹,否则不能被删除。
---------------------------------------------------------------------------------------------------------
常用的文件属性读取:
File file = new File("test.txt");
//判断文件是否存在
file.exists()
//读取文件名称
file.getName()//这里注意:获取到的文件名一定是前面Java声明的file对象的名字
//读取文件路径
file.getPath()//相对路径
//读取文件绝对路径
file.getAbsolutePath()
//读取文件父级路径
new File(file.getAbsolutePath).getParent()//注意,因为file对象是通过
相对路径进行构造的,因此,在调用getParent()方法时会返回null,因此我们
需要获取到file的绝对路径之后,才可以获取到file的父级路径。
//读取文件大小
file.length()//返回值是long型的数值,是字节(byte)
//判断文件是否被隐藏。
file.isHidden()
//判断文件是否可读
file.canRead()
//判断文件是否可写
file.canWrite()
//判断是否为文件夹
file.isDirectory()
------------------------------------------------------------------------------------------------------------------------
package crc16test;import java.io.File;public class Scannner {public static void main(String[] args) {printFiles(new File("../crc-16"), 1);}/*** 文件打印* @param dir* @param tab 文件缩进*/public static void printFiles(File dir, int tab) {//这种打印方式,可以输出系统的隐藏文件if (dir.isDirectory()) {File next[] = dir.listFiles();for (int i = 0; i < next.length; i++) {for (int j = 0; j < tab; j++) {System.out.print("|--");}System.out.println(next[i].getName());if (next[i].isDirectory()) {printFiles(next[i], tab + 1);}}}}
}
输出结果:
|--.classpath
|--.project
|--.settings
|--|--org.eclipse.core.resources.prefs
|--|--org.eclipse.jdt.core.prefs
|--bin
|--|--crc16test
|--|--|--Converters.class
|--|--|--CRC.class
|--|--|--Crc16.class
|--|--|--HelloFile.class
|--|--|--MyOuter$MyInner.class
|--|--|--MyOuter.class
|--|--|--ReadAndWriteFile.class
|--|--|--room.html
|--|--|--Scannner.class
|--|--|--SetProperty.class
|--|--|--Solution.class
|--|--|--sss.txt
|--json.jar
|--newFile.txt
|--src
|--|--crc16test
|--|--|--Converters.java
|--|--|--CRC.java
|--|--|--Crc16.java
|--|--|--HelloFile.java
|--|--|--MyOuter.java
|--|--|--ReadAndWriteFile.java
|--|--|--room.html
|--|--|--Scannner.java
|--|--|--SetProperty.java
|--|--|--Solution.java
|--|--|--sss.txt
|--text.txt
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
package crc16test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;public class ReadAndWriteFile {public static void main(String[] args) {File file = new File("text.txt");/* 文件的输入 */if (file.exists()) {System.err.println("exist");try {// 1.创建一个文件输入流FileInputStream fis = new FileInputStream(file);// 2.创建文件输入流的Reader/*** InputStreamReader有多个构造器,但是因为FileInputStream是字节输入流,* 而InputStreamReader是字符输入流,因此在调用构造器时,我们选择带有字符编码的* 构造器,否则会出现乱码。另外注意,文件默认为GBK编码,在创建文件的时候应当先设置好字符* 编码为UTF-8,这样好统一前后的编码。*/InputStreamReader isr = new InputStreamReader(fis, "UTF-8");// 3.创建一个带有缓冲的输入流BufferedReader br = new BufferedReader(isr);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();isr.close();fis.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else {System.err.println("THE FILE DOES NOT EXIST");}/* 文件的输出 *///文件的输出不必担心文件是否存在的问题,因为程序会自动进行文件的创建File newFile = new File("newFile.txt");try {FileOutputStream fos = new FileOutputStream(newFile);OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");BufferedWriter bw = new BufferedWriter(osw);// 注意,这种写入方式,是覆盖性的。bw.write("123\n");bw.write("456\n");bw.close();osw.close();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}System.out.println("写入完成。");}
}
输出结果:
exist
长恨歌
一二三四五六,一二三四五六。
六五四三二一,六五四三二一。
一二三四五六,一二三四五六。
六五四三二一,六五四三二一。
写入完成。