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 返回2
    System.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<Path> listDirectory = Files.newDirectoryStream(path);
        for (Path path1 : listDirectory) {
            System.out.println(path1.getFileName());
        }
        // 创建一个带有过滤器,过滤文件名以java txt结尾的文件
        DirectoryStream<Path> 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 {
        // 文件大小bytes
        System.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<FileVisitOption> 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);
        }
    }
    // 访问目录前调用
    @Override
    public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException {
        return FileVisitResult.CONTINUE;
    }
    // 访问文件时调用
    @Override
    public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {
        judgeFile((Path) file);
        return FileVisitResult.CONTINUE;
    }
    // 访问文件失败后调用
    @Override
    public FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException {
        return FileVisitResult.CONTINUE;
    }
    // 访问一个目录后调用
    @Override
    public 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;
    // 定义输入流,读取每个Entry
    InputStream input = null;
    // 每一个压缩Entry
    ZipEntry entry = null;

    // 定义压缩输入流,实例化ZipInputStream
    try (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文件基本操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java后台Controller实现文件下载操作

    代码 参数: 1.filePath:文件的绝对路径(d:\download\a.xlsx) 2.fileName(a.xlsx) 3.编码格式(GBK) 4.response.request不介绍了,从控制器传入的http对象 代码片. //控制器 @RequestMapping(UrlConstants.BLACKLIST_TESTDOWNLOAD) public void downLoad(String filePath, HttpServletResponse response, Http

  • Java利用反射实现文件的读取操作

    java反射 java从很早的版本开始就引入了反射机制,java如今的框架底层大部分也都是使用反射实现的. 这篇博客就去探索下java反射使用的方便之处. 要说java的反射机制,肯定离不开Class这个类,我们从jdk的源码可以看到这个类在jdk1.0的时候就存在了. 由于我这边需要用到文件读写的功能,同时又希望写的方法相对来说比较抽象,能在多出直接使用,于是我就想到了java的反射机制. 首先这边先把我的读取文件的方法展示出来 这个是用到的接口类 /** * 实现该接口中的方法,本来打算在F

  • java 将字符串追加到文件已有内容后面的操作

    我就废话不多说了,大家还是直接看代码吧~ /** * 将字符串追加到文件已有内容后面 * * @param fileFullPath 文件完整地址:D:/test.txt * @param content 需要写入的 */ public static void writeFile(String fileFullPath,String content) { FileOutputStream fos = null; try { //true不覆盖已有内容 fos = new FileOutputSt

  • java 通过 SmbFile 类操作共享文件夹的示例

    一.添加依赖 在pom.xml文件夹中添加如下的依赖就可以引用SmbFile类的jar包. <dependency> <groupId>jcifs</groupId> <artifactId>jcifs</artifactId> <version>1.3.17</version> </dependency> 二.读取文件 /** * 读取共享文件夹下的所有文件(文件夹)的名称 * @param remoteUr

  • Java基础之文件和目录操作

    一.前言 文件和目录操作最终是与操作系统和文件系统相关的,不同系统的 实现是不一样的,但Java中的java.io.File类提供了统一的接口,底层会 通过本地方法调用操作系统和文件系统的具体实现,本节,我们就来介 绍File类.File类中的操作大概可以分为三类:文件元数据.文件操作. 目录操作,在介绍这些操作之前,我们先来看下File的构造方法. 二.构造方法 File既可以表示文件,也可以表示目录,它的主要构造方法有: File中的路径可以是已经存在的,也可以是不存在的.通过new新建一个

  • Java中多媒体文件上传及页面回显的操作代码

    文件上传页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&

  • JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过URL预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注释掉,浏览器会默认预览. response.addHeader("Content-Disposition", "attachment;filename=" + FileUtil.getOriginalFilename(path)); 然后需要注意: response.s

  • Java文件基本操作总结

    File文件类 java.io.File是文件和目录的重要类(JDK6及以前是唯一) 目录也使用File类进行表示 File类与操作系统无关,但会受到操作系统的权限限制 常用方法createNewFile , delete , exists , getAbsolutePath , getName , getParent , getPathisDirectory , isFile , length , listFiles , mkdir , mkdirs File不涉及到具体的文件内容.只会涉及属

  • 基于Java文件输入输出流实现文件上传下载功能

    本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下 前端通过form表单的enctype属性,将数据传递方式修改为二进制"流"的形式,服务端(servlet)通过  getInputStream() 获取流信息, 运用java I/O 流的基础操作将流写入到一个服务端临时创建的文件temp中,然后再次利用文件基本操作,读取并截取临时文件内容,根据其中信息创建相应的文件,将读取出来的具体信息写入,下载时,根据提交的文件名称,找到服务器端相应的文件,然后根据输

  • 读取Java文件到byte数组的三种方法(总结)

    读取Java文件到byte数组的三种方法(总结) package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Rando

  • java文件上传Demo(必看篇)

    说到文件上传我们要做到: 1.引入两个包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 2.将form改为上传文件模式:enctype="multipart/form-data" 3.开始编写相关代码 这里会用到几个关键的类:磁盘文件工厂DiskFileItemFactory : 创建servlet文件上传类:ServletFileUpload 还有几个重要的方法:DiskFileItemFactory类用于将以临时文件形式保存在磁

  • Socket+JDBC+IO实现Java文件上传下载器DEMO详解

    该demo实现的功能有: 1.用户注册: 注册时输入两次密码,若两次输入不一致,则注册失败,需要重新输入.若用户名被注册过,则提示用户重新输入用户名: 2.用户登录: 需要验证数据库中是否有对应的用户名和密码,若密码输错三次,则终止用户的登录操作: 3.文件上传: 从本地上传文件到文件数据库中 4.文件下载: 从数据库中下载文件到本地 5.文件更新: 根据id可更新数据库中的文件名 6.文件删除: 根据id删除数据库中某一个文件 7.看数据库所有文件; 8.查看文件(根据用户名); 9.查看文件

  • java文件输出流写文件的几种方法

    java文件输出流是一种用于处理原始二进制数据的字节流类.为了将数据写入到文件中,必须将数据转换为字节,并保存到文件. 复制代码 代码如下: package com.yiibai.io; import java.io.File;import java.io.FileOutputStream;import java.io.IOException; public class WriteFileExample { public static void main(String[] args) { Fil

  • Java文件(io)编程_基于File类的基本用法(必看篇)

    1.首先了解文件流的相关概念: 2.文件File类的基本用法 public class Demo_1 { public static void main(String[] args) { //创建一个文件对象 File f=new File("e:\\aa.txt"); //得到文件的路径 System.out.println("文件路径:"+f.getAbsolutePath()); //得到文件的大小,字节数 System.out.println("文

  • 两种java文件上传实例讲解

    本文通过两种文件上传实例进行比较,帮助大家更好的学习java文件上传功能,具体内容如下 1. Java附件上传代码     @Controller public class UploadFile extends BaseJsonController{ /** * 附件上传 * * @param request * @param creativeFile * @param response * @return */ @RequestMapping(value = "/upload/uploadFi

  • java 文件大数据Excel下载实例代码

    java 文件大数据Excel下载实例代码 excel可以用xml表示.故可以以此来实现边写边下载文件 package com.tydic.qop.controller; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.I

  • Eclipse不自动编译java文件的终极解决方法

    最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般是如下几个步骤.但是还是不自动编译. 最基本的解决办法--这是前提 然后clean和refresh下项目.如果这样还是不行,用下面的方法吧,终极解决方案...... 1:去除项目中的jre的classpath 2:在将jre的包添加到classpath中来 OK,大功告成!再出现eclipse无法自

随机推荐