目录
一. Java 中的文件操作
示例1. get的相关用法
示例2. 普通文件的创建与删除
示例3. deleteOnExit 的现象
实例4.创建目录
实例5. 文件名获取
实例6. 重命名
二. 文件内容的读写
InputStream
OutputStream
构造File对象的过程中,可以使用 绝对路径/相对路径进行初始化.这个路径指向的文件,可以是真实存在的,也可以是不存在的.(注意,有File 对象,并不代表真实存在该文件)
public static void main(String[] args) throws IOException {
File file=new File("./test.txt");
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
运行结果:
public static void main(String[] args) throws IOException {
File file=new File("hello_world.txt");
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println("创建 file 对象后");
file.createNewFile();
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println("删除file对象后");
file.delete();
System.out.println(file.exists());
System.out.println(file.isFile());
}
运行结果:
public static void main(String[] args) throws IOException {
File file =new File("mkdir");
System.out.println(file.exists());
System.out.println(file.createNewFile());
file.deleteOnExit();
System.out.println(file.exists());
}
运行结果:
但是程序运行结束后,并没有文件的存在,文件还是被删除了
public static void main(String[] args) {
//创建单级目录
File file=new File("mkdir");
file.mkdir();
//创建多级目录
file=new File("mkdir/aaa/bbb");
file.mkdirs();
}
public static void main(String[] args) {
File file=new File("mkdir");
String []strs=file.list();
for (String s:strs) {
System.out.println(s);
}
System.out.println("==========");
File []files=file.listFiles();
System.out.println(Arrays.toString(files));
}
运行结果:
注意: 只会返回文件对象的子文件名,孙子及以下的文件名则不包含。
public static void main(String[] args) {
File file=new File("./mkdir");
File dest=new File("test");
file.renameTo(dest);
}
文件内容的读写涉及到两种方式一种时字符流(以字符为最小单位进行读和写,reader,writer),一种是字节流(以字节为最小单位进行读和写,inputStream,outStream).
输入和输出是相对与CPU为基准来看的,从硬盘读取到内存中叫做输入,从内存中到硬盘上为输出。
进程,使用 PCB 这样的结构来表示,其中有一个结构为 文件描述符表,记载了当前进程都打开了哪些文件,每次打开一个文件,就会在这个表里,申请到一个位置,这个表可以当成一个数组,数组下标就是文件描述符,数组元素就是这个文件在内核中的结构体表示。但是,这个表长度不是有限制的,不能无休止的打开,但是又不释放,一旦满了,继续打开,就会打开失败。因此为了防止文件资源泄露,打开文件后必须关闭字节流。
示例1:
public static void main(String[] args) {
//此处可以是全路径也可以是相对路径,同时也可以直接传File对象
//这种写法可以自动释放资源,因为InputStream继承自Closeable接口
try(InputStream inputStream=new FileInputStream("./hello.txt")) {
while (true){
int n=inputStream.read();
if(n==-1){
break;
}
//System.out.println(n);
System.out.printf("%x\n",n);
}
} catch (IOException e) {
throw new RuntimeException(e);
};
}
可以通过字符流中的 reader/writer 进行字符的读取和写入,通过FileReader/FileWriter来实现
public static void main(String[] args) { try (Writer writer=new FileWriter("hello.txt");){ writer.write("你好世界"); writer.write('你'); writer.write('好'); writer.write('世'); writer.write('界'); writer.flush(); } catch (IOException e) { throw new RuntimeException(e); } } public static void main(String[] args) { try(Reader reader=new FileReader("hello.txt")) { while (true){ int ch=reader.read(); if(ch==-1){ break; } //若不以字符的方式打印,则打印的是字符在Unicode表中对应的值 System.out.printf("%c",ch); } }catch (IOException e) { throw new RuntimeException(e); } }
注:对于输入流中的读的返回值:
• read() 无参数版本,返回该字节的内容;
• read(byte [] buffer) ,返回读到的字节数,也就是实际读到的长度,他直接调用read(byte [] buffer, 0, buffer.length);
• read(byte [] buffer, int offset, int length) ,返回值是实际读的长度;
示例:在系统中查找包含输入内容的文件:
public class Demo10 {
public static void main(String[] args) throws IOException {
File file=null;
Scanner scanner= null;
System.out.println("请输入要查找内容的根目录:");
scanner = new Scanner(System.in);
String pos=scanner.nextLine();
file=new File(pos);
if(!file.isDirectory()){
System.out.println("你输入的不是目录或目录不存在");
return;
}
System.out.println("请输入要查找的内容:");
String target=scanner.nextLine();
findPath(file,target);
}
public static void findPath(File pos,String target) throws IOException {
System.out.println("当前搜索到:"+pos.getCanonicalPath());
if(pos.isDirectory()){
File []files=pos.listFiles();
for (File file:files) {
findPath(file,target);
}
}else if(pos.isFile()){
if(contains(pos,target)){
System.out.println(pos.getCanonicalPath()+"包含我要找的内容");
}
}else {
return;
}
}
public static boolean contains(File pos,String target) {
StringBuilder sb=new StringBuilder();
try (Reader reader=new FileReader(pos)){
while (true){
int n=reader.read();
if(n==-1){
break;
}
sb.append((char)n);
}
}catch (IOException e) {
throw new RuntimeException(e);
}
if (sb.toString().contains(target)){
return true;
}
return false;
}
}