一. Java 中的文件操作
构造File对象的过程中,可以使用 绝对路径/相对路径进行初始化.这个路径指向的文件,可以是真实存在的,也可以是不存在的.(注意,有File 对象,并不代表真实存在该文件)
示例1. get的相关用法
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()); }
运行结果:
示例2. 普通文件的创建与删除
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()); }
运行结果:
示例3. deleteOnExit 的现象
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()); }
运行结果:
但是程序运行结束后,并没有文件的存在,文件还是被删除了
实例4.创建目录
public static void main(String[] args) { //创建单级目录 File file=new File("mkdir"); file.mkdir(); //创建多级目录 file=new File("mkdir/aaa/bbb"); file.mkdirs(); }
实例5. 文件名获取
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)); }
运行结果:
注意: 只会返回文件对象的子文件名,孙子及以下的文件名则不包含。
实例6. 重命名
public static void main(String[] args) { File file=new File("./mkdir"); File dest=new File("test"); file.renameTo(dest); }
二. 文件内容的读写
文件内容的读写涉及到两种方式一种时字符流(以字符为最小单位进行读和写,reader,writer),一种是字节流(以字节为最小单位进行读和写,inputStream,outStream).
输入和输出是相对与CPU为基准来看的,从硬盘读取到内存中叫做输入,从内存中到硬盘上为输出。
InputStream
进程,使用 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); }; }
OutputStream
可以通过字符流中的 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; } }