Java文件基本操作总结

File文件类

  • java.io.File是文件和目录的重要类(JDK6及以前是唯一)
  • 目录也使用File类进行表示
  • File类与操作系统无关,但会受到操作系统的权限限制
  • 常用方法createNewFile , delete , exists , getAbsolutePath , getName , getParent , getPathisDirectory , isFile , length , listFiles , mkdir , mkdirs
  • File不涉及到具体的文件内容、只会涉及属性
public static void main(String[] args) {// 创建目录File directory = new File("D:/temp"); boolean directoryDoesNotExists = ! directory.exists(); if (directoryDoesNotExists) {// mkdir是创建单级目录// mkdirs是连续创建多级目录directory.mkdirs(); }// 创建文件File file = new File("D:/temp/test.txt"); boolean fileDoesNotExsits = ! file.exists(); if (fileDoesNotExsits) {try {file.createNewFile(); } catch (IOException e) {e.printStackTrace(); }}// 遍历directory下的所有文件消息File[] files = directory.listFiles(); for (File file1 : files) {System.out.println(file1.getPath()); }}

运行结果:
D:\temp\test.txt
Java NIO
  • Java 7提出的NIO包,提出新的文件系统类
  • Path , Files , DirectoryStream , FileVisitor , FileSystem
  • 是对java.io.File的有益补充
  • 文件复制和移动
  • 文件相对路径
  • 递归遍历目录
  • 递归删除目录
Path类
public static void main(String[] args) {// Path和java.io.File基本类似Path path = FileSystems.getDefault().getPath("D:/temp", "abc.txt"); // D:/ 返回1 D:/temp 返回2System.out.println(path.getNameCount()); // 用File的toPath()方法获取Path对象File file = new File("D:/temp/abc.txt"); Path path1 = file.toPath(); System.out.println(path.compareTo(path1)); // 结果为0 说明两个path相等// 获取Path方法三Path path3 = Paths.get("D:/temp", "abc.txt"); // 判断文件是否可读System.out.println("文件是否可以读取: " + Files.isReadable(path)); }

Files类
public static void main(String[] args) {// 移动文件moveFile(); // 访问文件属性fileAttributes(); // 创建目录createDirectory(); }private static void createDirectory() {Path path = Paths.get("D:/temp/test"); try {// 创建文件夹if (Files.notExists(path)) {Files.createDirectory(path); } else {System.out.println("文件夹创建失败"); }Path path2 = path.resolve("a.java"); Path path3 = path.resolve("b.java"); Path path4 = path.resolve("c.txt"); Path path5 = path.resolve("d.jpg"); Files.createFile(path2); Files.createFile(path3); Files.createFile(path4); Files.createFile(path5); // 不带条件的遍历输出DirectoryStream listDirectory = Files.newDirectoryStream(path); for (Path path1 : listDirectory) {System.out.println(path1.getFileName()); }// 创建一个带有过滤器,过滤文件名以java txt结尾的文件DirectoryStream【Java文件基本操作总结】 pathsFilter = Files.newDirectoryStream(path, "*.{java,txt}"); for (Path item : pathsFilter) {System.out.println(item.getFileName()); }} catch (Exception e) {e.printStackTrace(); }}@SuppressWarnings("all")private static void fileAttributes() {Path path = Paths.get("D:/temp"); // 判断是否是目录System.out.println(Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)); try {// 获取文件的基础属性BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class); // 判断是否是目录System.out.println(attributes.isDirectory()); // 获取文件最后修改时间System.out.println(new Date(attributes.lastModifiedTime().toMillis()).toLocaleString()); } catch (Exception e) {e.printStackTrace(); }}private static void moveFile() {Path from = Paths.get("D:/temp", "text.txt"); // 将文件移动到D:/temp/test/text.txt, 如果目标文件以存在则替换Path to = from.getParent().resolve("test/text.txt"); try {// 文件大小bytesSystem.out.println(Files.size(from)); // 调用文件移动方法,如果目标文件已存在则替换Files.move(from, to, StandardCopyOption.REPLACE_EXISTING); } catch (Exception e) {e.printStackTrace(); }}

递归遍历查找指定文件
public class Demo2 {public static void main(String[] args) {// 查找以.jpg结尾的String ext = "*.jpg"; Path fileTree = Paths.get("D:/temp/"); Search search = new Search(ext); EnumSet options = EnumSet.of(FileVisitOption.FOLLOW_LINKS); try {Files.walkFileTree(fileTree, options, Integer.MAX_VALUE, search); } catch (IOException e) {e.printStackTrace(); }}}class Search implements FileVisitor {private PathMatcher matcher; public Search(String ext) {this.matcher = FileSystems.getDefault().getPathMatcher("glob:" + ext); }public void judgeFile(Path file) throws IOException {Path name = file.getFileName(); if (name != null && matcher.matches(name)) {// 文件名匹配System.out.println("匹配的文件名: " + name); }}// 访问目录前调用@Overridepublic FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException {return FileVisitResult.CONTINUE; }// 访问文件时调用@Overridepublic FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {judgeFile((Path) file); return FileVisitResult.CONTINUE; }// 访问文件失败后调用@Overridepublic FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException {return FileVisitResult.CONTINUE; }// 访问一个目录后调用@Overridepublic FileVisitResult postVisitDirectory(Object dir, IOException exc) throws IOException {System.out.println("postVisit: " + (Path) dir); return FileVisitResult.CONTINUE; }}

运行结果:
匹配的文件名: d.jpg
postVisit: D:\temp\test
postVisit: D:\temp
Java的IO包
  • Java读写文件,只能以数据流的形式进行读写
  • java.io包中
  • 节点类:直接对文件进行读写
  • 包装类:
  • 1、转换类:字节 / 字符 / 数据类型的转化类 。
  • 2、装饰类:装饰节点类。
节点类
  • 直接操作文件类
  • InputStream,OutStream(字节)
  • FileInputStream , FileOutputStream
  • Reader , Writer(字符)
  • FileReader , FileWriter
转换类
  • 从字符到字节之间的转化
  • InputStreamReader: 文件读取时字节,转化为Java能理解的字符
  • OutputStreamWriter: Java将字符转化为字节输入到文件中
装饰类
  • DataInputStream , DataOutputStream :封装数据流
  • BufferedInputStream ,BufferOutputStream:缓存字节流
  • BufferedReader , BufferedWriter:缓存字符流
文本文件的读写 写操作
public static void main(String[] args) {writeFile(); }public static void writeFile(){try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:/temp/demo3.txt")))) {bw.write("hello world"); bw.newLine(); bw.write("Java Home"); bw.newLine(); } catch (Exception e) {e.printStackTrace(); }}

Demo3.txt文件内容
hello world
Java Home
读操作
public static void main(String[] args) {readerFile(); }private static void readerFile() {String line = ""; try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:/temp/demo3.txt")))) {while ((line = br.readLine()) != null) {System.out.println(line); }} catch (Exception e) {e.printStackTrace(); }}

运行结果:
hello world
Java Home
二进制文件读写java
public static void main(String[] args) {writeFile(); }private static void writeFile() {try (DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:/temp/test.dat")))) {dos.writeUTF("hello"); dos.writeUTF("hello world is test bytes"); dos.writeInt(20); dos.writeUTF("world"); } catch (Exception e) {e.printStackTrace(); }}

文件内容
hellohello world is test bytes world
读操作
public static void main(String[] args) {readFile(); }private static void readFile() {try (DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("D:/temp/test.dat")))) {System.out.println(in.readUTF() + in.readUTF() + in.readInt() + in.readUTF()); } catch (Exception e) {e.printStackTrace(); }}

运行结果:
hellohello world is test bytes20world
ZIP文件的读写
  • zip文件操作类:java.util.zip包中
  • java.io.InputStream , java.io.OutputStream的子类
  • ZipInputStream , ZipOutputStream压缩文件输入 / 输出流
  • ZipEntry压缩项
多个文件压缩
// 多个文件压缩public static void main(String[] args) {zipFile(); }public static void zipFile() {File file = new File("D:/temp"); File zipFile = new File("D:/temp.zip"); FileInputStream input = null; try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) {// 添加注释zos.setComment(new String("多个个文件压缩".getBytes(),"UTF-8")); // 压缩过程int temp = 0; // 判断是否为文件夹if (file.isDirectory()) {File[] listFile = file.listFiles(); for (int i = 0; i < listFile.length; i++) {// 定义文件的输出流input = new FileInputStream(listFile[i]); // 设置Entry对象zos.putNextEntry(new ZipEntry(file.getName() +File.separator + listFile[i].getName() )); System.out.println("正在压缩: " + listFile[i].getName()); // 读取内容while ((temp = input.read()) != -1) {// 压缩输出zos.write(temp); }// 关闭输入流input.close(); }}} catch (Exception e) {e.printStackTrace(); }}

注意:压缩的文件夹不能有子目录,否则会报FileNotFoundException: D:\temp\test (拒绝访问。),这是由于input = new FileInputStream(listFile[i]); 读取的文件类型是文件夹导致的
多个文件解压缩
// 多个文件解压缩public static void main(String[] args) throws Exception{// 待解压的zip文件,需要在zip文件上构建输入流,读取数据到Java中File file = new File("C:\\Users\\Wong\\Desktop\\test.zip"); // 输出文件的时候要有文件夹的操作File outFile = null; // 实例化ZipEntry对象ZipFile zipFile = new ZipFile(file); // 定义解压的文件名OutputStream out = null; // 定义输入流,读取每个EntryInputStream input = null; // 每一个压缩EntryZipEntry entry = null; // 定义压缩输入流,实例化ZipInputStreamtry (ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file))) {// 遍历压缩包中的文件while ((entry = zipInput.getNextEntry()) != null) {System.out.println("解压缩 " + entry.getName().replaceAll("/", "") + " 文件"); // 定义输出的文件路径outFile = new File("D:/" + entry.getName()); boolean outputDirectoryNotExsits = !outFile.getParentFile().exists(); // 当输出文件夹不存在时if (outputDirectoryNotExsits) {// 创建输出文件夹outFile.getParentFile().mkdirs(); }boolean outFileNotExists = !outFile.exists(); // 当输出文件不存在时if (outFileNotExists) {if (entry.isDirectory()) {outFile.mkdirs(); } else {outFile.createNewFile(); }}boolean entryNotDirctory = !entry.isDirectory(); if (entryNotDirctory) {input = zipFile.getInputStream(entry); out = new FileOutputStream(outFile); int temp = 0; while ((temp = input.read()) != -1) {out.write(temp); }input.close(); out.close(); System.out.println("解压缩成功"); }}} catch (Exception e) {e.printStackTrace(); }}

到此这篇关于Java文件基本操作总结的文章就介绍到这了,更多相关Java文件基本操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读