文件IO操作详解
这篇文章我将总结关于文件IO的一些概念的东西和关于文件IO类的使用1.认识路径2.文件类型3.文件系统操作4.文件内容操作认识路径路径也是一个目录结构是一颗目录树N叉搜索树~~~绝对路径E:\JavaCode\文件IO我们在文件夹中复制一个文件路径这个文件路径就是一个绝对路径比如我要查找我当前电脑下的一个文件文件IO我就可以按照绝对路径去查找先从E盘 ---- JavaCode 就可以查找到文件IO此文件~~~相对路径./JavaCode意思是在当前文件下查找JavaCode此文件./表示当前文件位置文件类型1.文本文件内部存储的是字符串内容每个部分都是一个字符2.二进制文件可以存储任意的数据当你不清楚这个文件究竟是文本文件还是二进制文件时其实你打开看一眼就知道了如果打开的是乱码文件那么就是一个二进制文件~~~IO -----InputStream(输入流)OutputStream输出流对于输入和输出在计算机中是站在CPU的视角看待的文件系统操作文件系统操作主要是针对文件进行创建复制删除查看目录查看当前路径移除.....1.) File的构造方法File的对象就对应一个文件或者一个目录目录也是一种文件~~~而./test.txt当前路径就取决于你程序运行时所在的工作目录public class Demo { public static void main(String[] args) { File file new File(./test.txt); } }2.getParent ---- 获取File对象的父目录文件路径public class Demo { public static void main(String[] args) { File file new File(./test.txt); System.out.println(File对象的父目录路径为 file.getParent()); } }3.) getName --- 获取File对象的纯文件名public class Demo { public static void main(String[] args) { File file new File(./test.txt); System.out.println(File对象的纯文件名为 file.getName()); } }4.getPath --- 获取File对象的整个路径public class Demo { public static void main(String[] args) { File file new File(./test.txt); System.out.println(File对象的路径为 file.getPath()); } }5.getAbsolutePath --- 获取File对象的绝对路径public class Demo { public static void main(String[] args) { File file new File(./test.txt); System.out.println(File对象的绝对路径为 file.getAbsolutePath()); } }6.getCononicalFile ---- 获取Filed对象修饰过的绝对路径public class Demo { public static void main(String[] args) { File file new File(./test.txt); System.out.println(File对象的路径为 file.getCanonicalFile()); } }针对AbsolutePath中不必要的的内容给去掉~~~7.判断当前文件是否存在 ---- existspublic class Demo { public static void main(String[] args) { File file new File(./test.txt); System.out.println(test.txt文件是否存在 file.exists()); } }8.) 判断当前文件是否是一个目录文件 --- isDirectorypublic class Demo { public static void main(String[] args) { File file new File(./test.txt); System.out.println(test.txt文件是否是一个目录文件 file.isDirectory()); } }9.判断当前文件是否是一个普通文件 --- isFilepublic class Demo { public static void main(String[] args) { File file new File(./test.txt); System.out.println(test.txt文件是否是一个普通文件 file.isFile()); } }10.创建文件 --- createNewFilecreateNewFile 会返回一个返回值 --- 是否创建成功true 或 falsepublic class Demo { public static void main(String[] args) { File file new File(./test.txt); //查看文件是否存在 System.out.println(test.txt文件是否存在 file.exists); //创建文件 System.out.println(test.txt文件是否创建成功 file.createNewFile()); //再次查看文件是否存在 System.out.println(test.txt文件是否存在 file.exists()); } }11.删除File对象文件 --- deletepublic class Demo { public static void main(String[] args) { File file new File(./test.txt); //查看文件是否存在 System.out.println(test.txt文件是否存在 file.exists); //创建文件 System.out.println(test.txt文件是否创建成功 file.createNewFile()); //再次查看文件是否存在 System.out.println(test.txt文件是否存在 file.exists()); //删除File对象的文件 System.out.println(test.txt文件是否删除成功 file.delete()); //再次查看文件是否存在 System.out.println(test.txt文件是否存在 file.exists()); } }12.删除File对象的文件但是在进程退出前才会删除 --- deleteOnExitpublic class Demo { public static void main(String[] args) { File file new File(./test.txt); //查看文件是否存在 System.out.println(test.txt文件是否存在 file.exists); //创建文件 System.out.println(test.txt文件是否创建成功 file.createNewFile()); //再次查看文件是否存在 System.out.println(test.txt文件是否存在 file.exists()); //删除File对象的文件 System.out.println(test.txt文件是否删除成功 file.deleteOnExit()); //再次查看文件是否存在 System.out.println(test.txt文件是否存在 file.exists()); } }13.返回目录下的所有文件名 --- list返回值是Stringpublic class Demo { //通过lis拿到D盘下的所有文件名 -- list只保存文件名 public static void main(String[] args) { File file new File(D:/); //通过list拿到D盘目录下的所有文件的文件名 String[] files file.list(); //如果目录下没有文件就是一个空目录 if(files null) { System.out.println(空目录); return; } for(String name : files) { //打印文件名 System.out.println(name); } } }14.通过listFile可以拿到某个目录下的所有文件并保存起来后期可以针对某个文件进行操作public class Demo { //通过listFile拿到D盘下的所有文件通过File对象收集起来后续就可以通过File类中的方法进行操作 public static void main(String[] args) { File file new File(D:/); File[] files file.listFiles(); //如果目录下没有文件就是一个空目录 if(files null) { System.out.println(空目录); return; } for(File name : files) { System.out.println(name.getName());//获取文件名字 } } }15.创建目录 --- mkdir创建一层目录public class Demo { //创建目录 --- 一层 public static void main(String[] args) { File file new File(./test); System.out.println(是否存在test file.exists()); file.mkdir(); System.out.println(是否存在test file.exists()); } }创建多层目录public class Demo { //创建多层目录 public static void main(String[] args) { File file new File(./aaa/ppp/lll); System.out.println(是否存在目录: file.exists()); file.mkdirs(); System.out.println(是否存在目录 file.exists()); } }16.重命名也是复制粘贴操作 ---- renameTo(本质其实就是将原来文件替换为另有一个文件)public class Demo { public static void main(String[] args) throws IOException { File file new File(./test.txt); //创建文件 file.createNewFile(); File dest new File(./test001.txt); file.renameTo(dest);//将源目标file替换为dest目标文件 } }文件内容操作对于文件内容操作有俩种1.读把文件的内容获取出来2.写对文件内容进行修改操作系统也提供了api给我们进行获取调用Java针对操作系统的api也进行一定的封装让我们使用起来更加方便 --- 流对象而在Java在标准库中又分为俩类1.字节流读写的时候以字节为单位进行读写 ---- 适合二进制文件2.字符流读写的时候以字符为单位进行读写 ---- 适合文本文件字节流InputStream读 OutputStream写但是他们这俩个类都是抽象类需要使用他们的父类FileInputStream读FileOutputStream写字符流Read读 Write写这俩个类同样也是抽象类也是需要使用他们的父类FileRead读FileWrite写读操作使用字节流使用版本一的read方法进行读取 --- 但是每次都需要通过read从硬盘中读取数据比较耗时public class Demo6 { //读操作 --- InputStream public static void main1(String[] args) throws IOException { //创建流对象创建流对象的时候就自动打开文件了 InputStream inputStream new FileInputStream(./test.txt); //使用版本一的read方法进行读取1 --- 但是每次都需要通过read从硬盘中读取数据比较耗时 while(true) { //每次往硬盘中读取信息,当读道文件末尾会返回-1 int n inputStream.read(); if(n -1) { //说明读取到文件末尾结束循环 break; } //使用十六进制打印字节 System.out.printf(%x\n, n); } } }使用版本二read方法进行读取 --- 一次性读取文本数据存放到数组中public class Demo6 { //读操作 --- InputStream public static void main1(String[] args) throws IOException { //创建流对象创建流对象的时候就自动打开文件了 InputStream inputStream new FileInputStream(./test.txt); while(true) { //如果文本数据很大超过1024一次可能读取不完所以就需要通过while循环分多次读取 byte[] b new byte[1024]; int n inputStream.read(b); if(n -1) { //说明读取到文件末尾 break; } //遍历数组 for(int i 0; i n; i) { System.out.printf(%x\n, b[i]); } } } }使用try with resources --- 括号内需要写有关Closeable的接口后续当try执行完毕或者捕获异常也会自动调用close方法public class Demo6 { //读操作 --- InputStream public static void main1(String[] args) throws IOException { try(InputStream inputStream new FileInputStream(./test.txt)) { while(true) { byte[] b new byte[1024]; int n inputStream.read(b); if(n -1) { //读取到文件末尾 break; } for(int i 0; i n; i) { System.out.printf(%x\n, b[i]); } } }catch(IOException e) { e.printStackTrace(); } } }读操作使用字符流一次读取一个字符public static void main2(String[] args) { try(Reader reader new FileReader(./test.txt)) { //一次读取一个字符 while(true) { int n reader.read(); if(n -1) { //说明读到文本末尾 break; } char ch (char)n;//字符转换 System.out.print(ch); } } }一次读取多个字符public static void main2(String[] args) { try(Reader reader new FileReader(./test.txt)) { while(true) { char[] chars new char[1024]; int n reader.read(chars); if(n -1) { break; } for(int i 0; i n; i) { System.out.print(chars[i]); } } }catch (IOException e) { e.printStackTrace(); } } }写操作使用字节流每次使用wirte写入----每次写入都需要访问硬盘public static void main1(String[] args) { try (OutputStream outputStream new FileOutputStream(./test.txt,true)) { //每次写入使用write outputStream.write(65); outputStream.write(66); outputStream.write(67); outputStream.write(68); }通过字节数组一次性写入减少访问硬盘次数提高效率public static void main1(String[] args) { try (OutputStream outputStream new FileOutputStream(./test.txt,true)) { //通过字节数组一次写入数组内容即可不需要多次write去访问硬盘写入 byte[] bytes {70,71,72,73}; outputStream.write(bytes); }catch (IOException e) { e.printStackTrace(); } }写操作使用字符流public static void main(String[] args) { try(Writer writer new FileWriter(./test.txt)) { //以字符串形式写入 writer.write(你好呀~~~); }catch(IOException e) { e.printStackTrace(); } }写一个实际的例子例子一给定一个指定目录并提供关键词找到目录中包含关键词的文件名public class Demo { public static void main(String[] args) throws IOException { Scanner scanner new Scanner(System.in); //让用户输入一个路径 System.out.print(请输入一个路径); String rootPath scanner.next(); //再让用户输入关键词 System.out.print(请输入一个关键词); String key scanner.next(); //判断关键词是否为空 if(key.isEmpty()) { System.out.println(非法的关键词~~~); return; } //判断路径是否为有效路径 --- 不能为空也不能为普通文件 File rootFile new File(rootPath); if(!rootFile.isDirectory()) { System.out.println(违法路径~~~~); return; } //搜索路径 search(rootFile, key); } public static void search(File rootFile, String key) throws IOException { File[] files rootFile.listFiles(); //判定files是否为空 if(files null) { return; } for(File file : files) { if(file.isDirectory()) { //如果还是一个目录那么就重新递归一下 search(file, key); }else if(file.isFile()) { //如果是一个文件那么查看文件名是否包含在这个文件中 //判断key是否包含在这个文件中 if(file.getName().contains(key)) { //如果包含那么询问 Scanner scanner new Scanner(System.in); System.out.print(文件路径为 file.getCanonicalPath()); System.out.print(请问是否删除该文件Y/N); String ret scanner.next(); if(ret.equals(Y) || ret.equals(y)) { file.delete(); System.out.println(删除成功); }else { System.out.println(取消删除); } } }else { //程序是不会走到这里的所以暂时不处理 } } } }例子二文件复制public class Demo { public static void main(String[] args) { Scanner scanner new Scanner(System.in); System.out.print(请输入你要复制的文件的路径); String src scanner.next(); System.out.print(请输入要复制到的位置); String dest scanner.next(); //判断输入的复制文件的路径是否合法 File srcFile new File(src); if(!srcFile.isFile()) { System.out.println(要复制文件的路径是一个非法路径); return; } File destFile new File(dest); File destParent destFile.getParentFile();//拿到想要复制到文件目的地的地方查看他的父目录是否是一个目录防止复制到一个文件夹中 if(!destParent.isDirectory()) { System.out.println(复制到位置的路径是一个非法目录路径); return; } try(InputStream inputStream new FileInputStream(srcFile); OutputStream outputStream new FileOutputStream(destFile)) { //读取文件内容写入到bytes数组中 while(true) { byte[] bytes new byte[1024]; int n inputStream.read(bytes); if(n -1) { break; } //写入 outputStream.write(bytes, 0, n); } }catch(IOException e) { e.printStackTrace(); } } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419705.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!