Java 的输入输出

在java中,文件或则目录习惯上是用java.io.File对象来表示,但是File类存在一定的缺陷,所以Java7中在NIO2包中带来了更好的替代:java.nio.file.Path接口。


java.nio.file包中还有另一个成员FileSystem类,FileSystem类表示文件系统,是个抽象类,可以调用FileSystem类的getDefault()静态方法来获取当前的文件系统:FileSystem fileSystem = FileSystems.getDefault();
FileSystem中含有其他方法:

  • getSeprator方法返回String的名称分隔符
  • getRootDirectories返回用于迭代根目录的Iterable
  • getPath用来创建Pathpublic abstract Path getPath(String first,string... more)first参数是必须的。
    用例:Path path = FileSystem.getDefault().getPath("/home/user/images");或则Path path =FileSystems.getDefault().getPath("/home","user","images");

不过java.nio.file.Paths类提供了一个快捷方法,可以通过他的静态get方法来创建PathPath path1=Paths.get("C:\temp");

  1. Path中的getNameCount方法返回路径中名称的数量,
  2. 用getName可以检索到每个名称
  3. Path getFileName()返回当前路径的文件名
  4. Path getParent()
  5. Path getRoot()

java.nio.file.Files是个强大的类,提供了处理文件和目录以及读取文件和写入文件的静态方法
1.创建和删除文件和目录
创建文件:

public static Path createFile(Path file,java.nio.file.attribute.FileAttribute<?> ... attrs)

如果不存在父目录,createFile就会抛出一个IOException,如果已经存在由file指定名称的文件、目录或者符号链接,就会抛出一个FileAlreadyExistsException。
创建目录:

public static Path createDirectory(Path directory,java.nio.file.attribute.FileAttribute<?>... attrs)

删除文件、目录或者符号链接

public static void delete(Path path)

如果path不存在,则会抛出NoSuchFileException。删除路径时,必须检测路径是否存在,用deletIfExists

public static void deleteIfExists(Path path)

如果正在删除的目录不是空的,抛出DirectoryNotEmptyException
2.检索目录的对象
用File类的newDirectoryStream方法来检索目录中文件、子目录和符号链接,这个方法将返回一个DirectoryStream来迭代目录中所有的对象。newDirectoryStream方法

public static DirectoryStream<Path> newDirectoryStream(Path path)

此方法返回DirectoryStream使用后必须关闭
用例——输出一个目录中的所有的子目录和文件

Path parent = ...
try (DirectoryStream<Path> children =Files.newDirectoryStream(parent))
{
    for (Path child: children){
        System.out.println(child);
    }
}catch (IOException e){
    e.printStackTrace();
}

3.复制和移动文件

public static Path copy(Path source,Path target

CopyOption是java.nio.file中的一个接口,StandardCopyOption枚举是他的一个实现有三个复制选项

  1. ATOMIC_MOVE,将移动个文件作为原子文件系统操作
  2. COPY_ATTRIBUTES把属性复制给新文件
  3. REPLACE_EXISTING如果文件存在,替换他
public static Path move(Path source ,Path target,CopyOption... options)throws java.io.IOException

4.文件的读取和写入
readAllBytes和readAllLines方法分别用来从二进制和文本文件读取

public static byte[] readAllBytes(Path path)throws java.io.IOException
public static List<String> readAllLines(Path path,java.nio.charset.Charset charset)throws java.io.IOException

用write分别来写入二进制文件和文本文件

public static Path write(Path path,byte[] bytes,
        OpenOption... options)throws java.io.IOException

public static Path write(Path path,java.lang.Iterable<? extends 
        CharSequences>lines,java.nio.charset.Charset charset,
        OpenOption... options)throws java.io.IOException

OpenOption接口提供下面这些值:

  1. APPEND要写入的数据添加到文件末尾
  2. CREATE不存在就创建一个新文件
  3. CREATE_NEW已经存在就创建一个新文件并且抛出异常
  4. DELETE_ON_CLOSE关闭时删除文件
  5. DSYNC文件内容更新时会同步写入
  6. READ打开文件进行读取
  7. SPARSE稀疏文件
  8. SYNC指示文件内容和元素据的更新会同步写入
  9. TRUNCATE_EXISTING如果文件打开进行写入,并且文件已经存在,就把文件的长度缩短到0
  10. WRITE写入
    java.nio.charset是个表示字符集的抽象类,需要指定在字符编码成字节和字节解码成字符是使用的字符集。
    创建Charset最容易的方法是调用静态Charset.forName传递字符集名称。例如
Charset useAscii = Charset.forName("US-ASCII");

输入输出流
根据数据的方向不同,有输入输出流,用输入流从接收端读取,用输出流写入接收端。流用java.io包中的四个抽象类来表示

  • Reader从接收端读取字符的流
  • Write将字符写入接收端的流
  • InputStream从接收端读取二进制数据的流
  • OutStream将二进制数据写入接收端的流

    使用流的典型操作顺序如下:

  • 创建流,生成的对象已经打开,因此不用调用open方法

  • 执行读取或者写入操作
  • 通过调用close方法关闭流,由于目前大多数流类都实现java.lang.AutoCloseable因此可以可以用try-with-resource语句创建流,并且让流自动关闭

    ……写的好累,以后再慢慢补充吧

猜你喜欢

转载自blog.csdn.net/Han_L/article/details/79967078