Java7 文件操作API

Java7中提供了新的API,可以让我们非常简单的复制、移动和删除文件以及路径。

https://www.cnblogs.com/devilwind/p/8623098.html

一 基本的复制、移动和删除文件以及路径操作
 1. 首先来说如何创建一个新的文件夹和文件,直接上例子。 
Java代码 

public static void main(String[] args) {  
  
    try {  
  
        Path directoryPath = Paths.get("D:/home/sample");  
        Files.createDirectory(directoryPath);  
        System.out.println("Directory created successfully!");  
  
        Path filePath = Paths.get("D:/home/sample/test.txt");  
        Files.createFile(filePath);  
        System.out.println("File created successfully!");  
  
        Path directoriesPath = Paths.get("D:/home/sample/subtest/subsubtest");  
        System.out.println("Sub-directory created successfully!");  
        Files.createDirectories(directoriesPath);  
  
    } catch (FileAlreadyExistsException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  


  上例中,在调用createFile方法时,如果想要创建的文件已经存在,FileAlreadyExistsException会被抛出。createFile和createDirectory这个两个方法都是原子性的,即要不整个操作都能成功或者整个操作都失败。 

  复制一个文件同样非常简单,Files的copy方法就可以实现。在复制文件时,我们可以对复制操作加一个参数来指明具体如何进行复制。java.lang.enum.StandardCopyOption这个枚举可以用作参数传递给copy方法。 
 

ATOMIC_MOVE原子性的复制
COPY_ATTRIBUTES将源文件的文件属性信息复制到目标文件中
REPLACE_EXISTING替换已存在的文件
public static void main(String[] args) {  
  
    Path newFile = Paths.get("D:/home/sample/newFile.txt");  
    Path copiedFile = Paths.get("D:/home/sample/copiedFile.txt");  
  
    try {  
  
        Files.createFile(newFile);  
        System.out.println("File created successfully!");  
  
        Files.copy(newFile, copiedFile, StandardCopyOption.REPLACE_EXISTING);  
        System.out.println("File copied successfully!");  
  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  

此外copy方法还支持输入输出流作为参数,以来复制非文件系统的信息。而复制文件夹的操作也并不复杂,如下例。 
Java代码 

public static void main(String[] args) {  
  
    Path originalDirectory = Paths.get("D:/home/sample");  
    Path newDirectory = Paths.get("D:/home/sample/tmp");  
  
    try {  
  
        Files.copy(originalDirectory, newDirectory);  
        System.out.println("Directory copied successfully!");  
  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  

Java代码 

public static void main(String[] args) {  
  
    Path newFile = Paths.get("D:/home/sample/java7WebSite.html");  
    URI url = URI.create("http://jdk7.java.net/");  
  
    try (InputStream inputStream = url.toURL().openStream()) {  
  
        Files.copy(inputStream, newFile);  
        System.out.println("Site copied successfully!");  
          
    } catch (MalformedURLException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  

  在我们做开发工作的时候,有时需要用到一个临时文件做介质,这些临时文件不需要被持久的保存下来,当程序结束或者一个方法处理完,就可以被删除掉了。Java7中提供了对临时文件良好的操作方法。 
Java代码 

  public static void main(String[] args) {  
  
    try {  
  
        Path rootDirectory = Paths.get("D:/home/sample");  
        Path tempDirectory = Files.createTempDirectory(rootDirectory, "");  
  
        System.out.println("Temporary directory created successfully!");  
        String dirPath = tempDirectory.toString();  
        System.out.println(dirPath);  
  
        Path tempFile = Files.createTempFile(tempDirectory, "", "");  
  
        System.out.println("Temporary file created successfully!");  
        String filePath = tempFile.toString();  
        System.out.println(filePath);  
  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
  
}  

 我们可以通过给createTempDirectory和createTempFile方法传递不同的参数来指定临时文件的前缀和后缀,具体使用方式请参照JDK文档。 
  Files类还提供了一些方法,方便我们修改那些文件本身和时间相关的属性。 
Java代码 

public static void main(String[] args) {  
  
  try {  
  
      Path path = Paths.get("D:/home/projects/note.txt");  
  
      BasicFileAttributeView view = Files.getFileAttributeView(path, BasicFileAttributeView.class);  
  
      FileTime lastModifiedTime;  
      FileTime lastAccessTime;  
      FileTime createTime;  
  
      BasicFileAttributes attributes = view.readAttributes();  
  
      lastModifiedTime = attributes.lastModifiedTime();  
      createTime = attributes.creationTime();  
  
      long currentTime = Calendar.getInstance().getTimeInMillis();  
      lastAccessTime = FileTime.fromMillis(currentTime);  
  
      view.setTimes(lastModifiedTime, lastAccessTime, createTime);              
      System.out.println(attributes.lastAccessTime());  
        
      Files.setLastModifiedTime(path, lastModifiedTime);              
      System.out.println(Files.getLastModifiedTime(path));  
  
  } catch (IOException e) {  
      e.printStackTrace();  
  }  

  当要修改文件所属用户的时候,运行Java程序的用户需要有特定的权限,这里对不同操作系统的权限控制方式不做介绍,大家可以自己学习一下。下例中的用户JavaUser必须是存在在系统中的,否则会抛UserPrincipalNotFoundException异常。 
Java代码 

public static void main(String[] args) {  
      
    try {  
          
        Path path = Paths.get("D:/home/projects/note.txt");  
          
        UserPrincipalLookupService lookupService = FileSystems.getDefault().getUserPrincipalLookupService();  
        UserPrincipal userPrincipal = lookupService.lookupPrincipalByName("JavaUser");  
          
        Files.setOwner(path, userPrincipal);  
        System.out.println("Owner: " + Files.getOwner(path));  
          
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  

  移动文件有一些地方需要注意,首先是如果移动一个文件夹,文件夹和其子文件夹都会被移动,跨磁盘移动的文件夹时,目标文件夹必须是空的,否则会有DirectoryNotEmptyException异常抛出。 
  如果我们移动文件的时候使用了StandardCopyOption.ATOMIC_MOVE选项,其他所有选项就都会被忽略,并且如果目标文件已经存在,老文件既不会被替换也不会有IOException异常抛出,结果和具体的系统实现有关。如果移动文件不能被原子性的完成,AtomicMoveNotSupportedException异常会被抛出。 
Java代码 

public static void main(String[] args) {  
      
    try {  
          
        Path sourceFile = Paths.get("D:/home/projects/note.txt");  
        Path destinationFile = Paths.get("D:/home/sample/note.txt");  
        Files.move(sourceFile, destinationFile, StandardCopyOption.REPLACE_EXISTING);  
          
        System.out.println("File moved successfully!");  
          
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  

  删除文件可以使用Files的delete和deleteIfExists这两个方法。顾名思义,当文件不存在时deleteIfExists的删除结果为false。如果要删除一个文件夹,文件夹必须是空的,或者结合使用SimpleFileVisitor来将文件夹下所有内容都删除。 
Java代码 

public static void main(String[] args) {  
      
    try {  
          
        Path sourceFile = Paths.get("D:/home/projects/note_bak1.txt");  
        boolean result = Files.deleteIfExists(sourceFile);  
        if (result) {  
            System.out.println("File deleted successfully!");  
        }  
          
        sourceFile = Paths.get("D:/home/projects/note_bak2.txt");  
        Files.delete(sourceFile);  
        System.out.println("File deleted successfully!");  
  
    } catch (NoSuchFileException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  

例1:判断文件是否在父路径下

请务必注意,file.getCanonicalPath()函数 详见 详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

public static boolean isSubFile(File parent, File child) throws IOException {  
    return child.getCanonicalPath().startsWith(parent.getCanonicalPath());  
}  
  
  
public static boolean isSubFile(String parent, String child) throws IOException {  
    return isSubFile(new File(parent), new File(child));  
}  

例2:文件复制操作
从源文件复制到目标文件,使用Files.copy方法。我们还需要提供不同的选项——使用java.nio.file.CopyOption来指定怎样复制文件。
CopyOpDemo.java代码如下:

package test;
import java.io.IOException;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
 
public class CopyOpDemo {
	public static void main(String[] args){
		// 待复制的源文件
		Path srcFile = Paths.get("D:/tmp/test1.htm");
		// 复制后的目标文件
		Path targetFile = Paths.get("D:/destFile.txt");
		// 复制选项定义
		CopyOption[] options = new CopyOption[]{
			StandardCopyOption.REPLACE_EXISTING
		};
		// 复制文件
		try {
			Files.copy(srcFile, targetFile, options);
			System.out.println("复制成功!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

例3:遍历文件树
要遍历文件树,使用Files.walkFileTree方法。此方法需要指定根路径或起始路径。以及要重写SimpleFileVisitor的实现类的两个方法:preVisitDirectory和visitFile。两个方法定义了在访问目录和文件期间想做的事。这使得我们要打印目录和文件名就非常简单了。
RecursiveFileListDemo.java代码如下:

package test;
 
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
 
 
public class RecursiveFileListDemo {
	public static void main(String[] args) throws IOException{
		Path startPath = Paths.get("D:/tmp/s5-blank");
		Files.walkFileTree(startPath, new SimpleFileVisitor<Path>(){
			@Override
			public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs){
				System.out.println(">>>>Dir : " + dir);
				return FileVisitResult.CONTINUE;
			}
			
			@Override
			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){
				System.out.println("File : " + file);
				return FileVisitResult.CONTINUE;
			}
		});
	}
}

至此我们可以看到,Java7中复制删除或移动文件还是比较简单的,避免了之前过于复杂的API,而且大部分功能都是通过Files的静态方法实现的,对于我们使用非常方便。但文件的操作涉及到具体不同的操作系统是对文件的管理方式,因此我们还要对操作系统有一定的了解并正确使用不同的操作参数,才能更好的运用Java7中提供的这些API。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java操作doc的API 是指使用Java编程语言来操作Microsoft Word文档(.doc)的应用程序编程接口(API)。Java中提供了许多库和框架,可以方便地处理和操作Word文档。 一种常用的Java操作doc的API是Apache POI,它是一个开源的Java库,用于读取和写入Microsoft Office文件格式,包括Word文档。使用Apache POI,我们可以使用Java代码来打开、创建、修改和保存Word文档。 要操作doc文件,首先需要导入Apache POI相关的库。然后,使用Java代码来创建一个Word文档对象,可以使用`XWPFDocument`类。接下来,可以使用该类提供的方法来添加文字、插入表格、设置样式等。例如,可以使用`createParagraph()`方法创建一个新的段落,通过`createRun()`方法在该段落中添加文本。 除了Apache POI,还有其他的Java操作doc的API可供选择。例如,JWord是另一个Java库,可以用于操作Word文档。它提供了类似的功能,可以读取和写入doc文件,以及添加和修改文本、表格、图片等元素。 总的来说,Java操作doc的API使我们能够通过编程方式对Word文档进行各种操作,使得处理Word文档的自动化变得更加方便和高效。无论是在企业的办公自动化系统中,还是在个人的文档处理任务中,Java操作doc的API都可以起到非常重要的作用。 ### 回答2: Java操作doc的API是指使用Java编程语言来操作Microsoft Word文档的API。为了实现这个功能,可以使用Apache POI库。Apache POI是一个用于操作Microsoft文档格式的Java库。它提供了一组API来读取和写入.doc格式的文件。 首先,需要在项目中添加Apache POI的依赖库。然后,就可以使用API来读取和写入.doc文件。 要读取.doc文件,可以使用POI的HWPF组件。可以通过以下步骤来实现: 1. 创建一个FileInputStream对象,将.doc文件作为输入流。 2. 创建一个HWPFDocument对象,将输入流作为参数传递给它。 3. 使用HWPFDocument对象的getRange()方法来获取文档的内容范围。 4. 使用Range对象的getText()方法来获取文档的文本内容。 要写入.doc文件,可以使用POI的XWPF组件。可以通过以下步骤来实现: 1. 创建一个XWPFDocument对象,作为新的.doc文件。 2. 创建一个XWPFParagraph对象,表示一个段落。 3. 使用XWPFParagraph对象的setBorder()方法设置段落的边框。 4. 创建一个XWPFRun对象,表示一个文本段。 5. 使用XWPFRun对象的setText()方法设置文本段的内容。 6. 使用XWPFParagraph对象的addRun()方法将文本段添加到段落中。 7. 使用XWPFDocument对象的addParagraph()方法将段落添加到文档中。 8. 使用FileOutputStream类将XWPFDocument对象写入.doc文件。 通过使用这些API,可以轻松地读取和写入.doc文件Java操作doc的API提供了丰富的功能,可以使开发人员更方便地处理Word文档。 ### 回答3: Java操作doc的API主要包括Apache POI和Open XML SDK两种方式。 Apache POI是一个开源的Java API,用于处理各种Microsoft Office格式文件,包括.doc和.docx格式的Word文档。通过Apache POI,我们可以读取、创建和修改.doc文件。要操作.doc文件,首先需要添加Apache POI的相应依赖,然后使用POI的API编写代码。通过POI,我们可以读取文档中的段落、表格和图片等内容,并对其进行修改和操作。 Open XML SDK是Microsoft提供的用于操作.docx文件API。.docx是一种基于开放XML标准的Word文档格式。通过Open XML SDK,我们可以实现与Apache POI类似的功能,读取、创建和修改.docx文件。使用Open XML SDK,我们可以访问.docx中的段落、表格、样式和图像等内容,并进行相应的操作。 无论是使用Apache POI还是Open XML SDK,我们都可以通过相应的API实现对.doc文件的读取、创建和修改。例如,可以读取文档的内容并进行搜索、替换、插入、删除等操作,还可以修改文档的样式、添加表格、插入图片等。这些API提供了丰富的方法和功能,使得我们能够通过Java代码灵活地操作.doc文件。 总之,Java操作.doc的API有Apache POI和Open XML SDK两种方式,它们提供了强大的功能和丰富的方法,可以满足我们对.doc文件的读取、创建和修改需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值