Guava Files
Guava Files
提供了多种直接复制、写入、读取文件的方法,可以便捷的直接操作,使用较为方便,并且具有丰富灵活的API
private static final String SOURCE_FILE = "D:\\project\\intellij-git\\xc-springboot\\src\\main\\resources\\source.txt"; private static final String TARGET_FILE = "D:\\project\\intellij-git\\xc-springboot\\src\\main\\resources\\target.txt"; @Test public void testCopyFile() throws IOException { //复制文件 File targetFile = new File(TARGET_FILE); File sourceFile = new File(SOURCE_FILE); Files.copy(new File(SOURCE_FILE), targetFile); assertThat(targetFile.exists(), equalTo(true)); // 判断hash是否一致 HashCode sourceHash = Files.asByteSource(sourceFile).hash(Hashing.sha256()); HashCode targetHash = Files.asByteSource(targetFile).hash(Hashing.sha256()); assertThat(sourceHash.equals(targetHash), equalTo(true)); } @Test public void testMoveFile() throws IOException { //移动文件 File targetFile = new File(TARGET_FILE); try { Files.move(new File(SOURCE_FILE), targetFile); } catch (IOException e) { } finally { Files.move(targetFile, new File(SOURCE_FILE)); } } @Test public void testToString() throws IOException { //读取文件内容 String string = "this is a source file, will be used to test Guava files"; List<String> strings = Files.readLines(new File(SOURCE_FILE), Charsets.UTF_8); String stringlist = Joiner.on("\n").join(strings); assertThat(string, equalTo(stringlist)); } @Test public void testFileLineProcess() throws IOException { //自定义读取文件函数 // 在读取文件每一行数据的时候,可以通过重写方法实现,是否做额外的处理或者是否读取改行数据 File sourceFile = new File(SOURCE_FILE); // 通过LinePorcess来对读取的每行数据进行处理 List<Integer> list = Files.asCharSource(sourceFile, Charsets.UTF_8).readLines(new LineProcessor<List<Integer>>() { List<Integer> list = new ArrayList<>(); @Override public boolean processLine(String s) throws IOException { // 返回是否处理该行 if (Strings.isNullOrEmpty(s)) { return false; } list.add(s.length()); return true; } @Override public List<Integer> getResult() { return list; } }); } @Test public void testFileAppend() throws IOException { // Append方式写问文件 File file = new File(SOURCE_FILE); // 使用APPEND模式向文件中追加内容 CharSink charSink = Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND); charSink.write("content"); // 通过CharSource读取文件 CharSource charSource = Files.asCharSource(file, Charsets.UTF_8); String read = charSource.read(); assertThat(read, equalTo("content")); } /** * 递归遍历指定路径 * 1.获取所有的路径 * 2.获取所有的文件 * <p> * 手动实现 */ @Test public void testRecursiveFile() { File file = new File("D:\\project\\intellij-git\\xc-springboot\\src\\main\\resources"); List<String> pathList = Lists.newArrayList(); // 递归遍历所有的目录 findAllFiles(file, pathList); // 输出所有的目录路径 pathList.forEach(System.out::println); // 递归遍历所有的文件 List<String> files = Lists.newArrayList(); findAllFiles(file, files); // 输出指定目录下所有的文件 files.forEach(System.out::println); } private void findAllFiles(File file, List<String> files) { if (file.isHidden()) { return; } if (file.isFile()) { files.add(file.getPath()); } if (!file.isFile()) { File[] list = file.listFiles(); for (File f : list) { findAllFiles(f, files); } } } @Test public void testTreeFIle() { //Guava的API递归遍历文件 File file = new File("D:\\project\\intellij-git\\xc-springboot\\src\\main\\resources"); // 使用前序遍历方式进行递归遍历 Iterable<File> files = Files.fileTraverser().depthFirstPreOrder(file); files.forEach(System.out::println); // 使用后序遍历的方式递归遍历 Iterable<File> files1 = Files.fileTraverser().depthFirstPostOrder(file); files1.forEach(System.out::println); // 使用广度优先遍历的方式递归遍历 Iterable<File> files2 = Files.fileTraverser().breadthFirst(file); files2.forEach(System.out::println); }