`
AsWater
  • 浏览: 24680 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java SE 7新特性之文件操作(6) - 创建文件和读取文件

阅读更多

转自 开发者的天空

 

本文中我们来讨论在NIO2 中怎样创建文件 、读取文件和写文件。NIO2提供了多种创建 文件的方法,使得我们在创建文件的时候就可以指定文件的某些初始属性。例如在支持POSIX的文件系统上指定文件的所有者,访问权限等。关于文件的属性, 请看上一篇文章Java SE 7新特性之文件操作 (5) - 管理元数据
创建文件
可以调用createFile(FileAttribute<?>)方法创建一个空文件。该方法的参数就是文件的初始属性。下面的例子是怎样 在创建文件的时候赋予该文件某些权限的属性:

 

如 果在调用该方法的时候没有传入任何参数,那么创建的文件将具有缺省的文件属性。下面的代码创建了一个具有缺省文件属性的文件:

Path file = ...;
try {
    file.createFile();   //Create the empty file with default permissions, etc.
} catch (FileAlreadyExists x) {
    System.err.format("file named %s already exists%n", file);
} catch (IOException x) {
    //Some other sort of failure, such as permissions.
    System.err.format("createFile error: %s%n", x);
}
 

如 果要创建的文件已经存在,该方法会抛出异常。
注意在调用createFile方法时,检查文件是否存在和创建具有特定的属性的文件是在同一个原子操作中。
还可以使用newOutputSteam方法来创建文件,在本文的后面我们会讲到怎样使用newOutputStream方法来创建文件。
通过Stream I/O读文件
我们可以通过newInputStream(OpenOption...)方法打开和读取文件。这个方法返回一个unbuffered输入流(input stream),我们可以用它来从文件中读取字节内容。

Path file = ...;
InputStream in = null;
try {
    in = file.newInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException x) {
    System.err.println(x);
} finally {
    if (in != null) in.close();
}
 

注 意该方法接受可变个数的参数,参数类型为OpenOption,指定了文件怎样打开。如果不传入参数,则使用默认的READ方式打开。READ方式是所有 的实现都支持的方式。有一些实现也支持其他的打开方式。
如果传入的OpenOption或其组合不正确,会抛出异常。如果程序没有读权限或I/O错误,也会抛出异常。
Creating and Writing a File by Using Stream I/O
使用Stream I/O来创建和写文件
我们可以使用newOutputStream方法来创建文件、扩展文件或覆盖已有文件。这个方法为了写文件而打开或创建文件,该方法返回一个 unbuffered的输出流(output stream)。newOutputStream方法有两种形式:


  • newOutputStream(OpenOption...)
  • newOutputStream(Set<? extends OpenOption>, FileAttribute<?>...)


这两种形式都接受一组OpenOption作为参数,第二种形式还允许指定初始的文件属性。这个方法支持的StandardOpenOption有:


  • WRITE –为了写访问而打开该文件.
  • APPEND – 将新数据扩展在文件的末尾。该选项和WRITE或CREATE选项一起使用。
  • TRUNCATE_EXISTING – 将文件截断为0字节长. 该选项和WRITE选项一起使用来覆盖原有文件。
  • CREATE_NEW – 创建一个新的文件。如果原来的文件存在这抛出异常。
  • CREATE – 如果原文件存在这打开它,否则创建新的文件。
  • DELETE_ON_CLOSE – 当Stream关闭时删除该文件。这个选项对临时文件比较有用。
  • SPARSE – 表明新创建的文件是Sparse文件. 关于Sparse文件的具体信息请看http://space.itpub.net/8242091/viewspace-619756
  • SYNC – 保持该文件(包括内容和元数据)与底层存储设备同步。
  • DSYNC – 保持文件内容与底层存储设备同步。


如果没有指定OpenOption,该方法的行为是:如果文件不存在,则创建新文件;如果文件存在,那么截断它。也就是说缺省的选择是CREATE和 TRUNCATE_EXISTING选项的组合。
下面的代码打开一个日志 文件,如果文件不存在,则创建一个新文件。如果文件 存在,这将新的内容扩展到文件尾部。

import static java.nio.file.StandardOpenOption.*;

Path logfile = ...;

//Convert the string to a byte array.
String s = ...;
byte data[] = s.getBytes();

OutputStream out = null;
try {
    out = new BufferedOutputStream(logfile.newOutputStream(CREATE, APPEND));
    ...
    out.write(data, 0, data.length);
} catch (IOException x) {
    System.err.println(x);
} finally {
    if (out != null) {
        out.flush();
        out.close();
    }
}
 

使用Channel I/O来读写文件
Stream I/O每次读取一个字符,Channel I/O每次读取一个缓冲块的数据。ByteChannel接口提供了基本的读写功能。SeekableByteChannel扩展了 ByteChannel并提供了维护一个channel中的位置并改变该位置的能力。SeekableByteChannel还支持截断文件和查询文件大 小的功能。
移动到文件中不同的位置,从该位置开始读或写的能力使我们可以随机访问文件 。有两种形式的 newByteChannel方法可以用来读或写文件,这两种形式和newOutputStream方法一样。


  • newByteChannel(OpenOption...)
  • newByteChannel(Set<? extends OpenOption>, FileAttribute<?>...)


这两个方法都允许指定OpenOption,newOutputStream所支持的选择这里也支持,而且这里还支持另外一个选项READ,因为 SeekableByteChannel既支持读也支持写。
如果选项是READ,那么该channel就是为了读访问打开。如果选项是WRITE或APPEND,则该channel就是为了写访问打开。如果没有指 定,该channel默认是为了读打开。
下面的代码从文件中读取内容并输出到控制台上:

SeekableByteChannel sbc = null;
try {
    sbc = file.newByteChannel();  //Defaults to READ
    ByteBuffer buf = ByteBuffer.allocate(10);

    //Read the bytes with the proper encoding for this platform.
    //If you skip this step, you might see something that looks like Chinese
    //characters when you expect Latin-style characters.
    String encoding = System.getProperty("file.encoding");
    while (sbc.read(buf) > 0) {
        buf.rewind();
        System.out.print(Charset.forName(encoding).decode(buf));
        buf.flip();
    }
} catch (IOException x) {
    System.out.println("caught exception: " + x);
} finally {
    if (sbc != null) sbc.close();
}

下 面的代码是为了UNIX或其他支持POSIX的文件系统编写的。这段代码创建一个新的日志文件或者扩展原有的日志文件,该日志文件创建时指定了访问权限 (所有者有读写权限,同组用户只有读权限,其他用户没有读权限)。

import static java.nio.file.StandardCopyOption.*;

//Create the set of options for appending to the file.
Set<OpenOptions> options = new HashSet<OpenOption>();
options.add(APPEND);
options.add(CREATE);

//Create the custom permissions attribute.
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-r------");
FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);

//Convert the string to a ByetBuffer.
String s = ...;
byte data[] = s.getBytes();
ByteBuffer bb = ByteBuffer.wrap(data);

SeekableByteChannel sbc = null;
try {
    sbc = file.newByteChannel(options, attr);
    sbc.write(bb);
} catch (IOException x) {
    System.out.println("exception thrown: " + x);
} finally {
    if (sbc != null) sbc.close();
}
 
分享到:
评论

相关推荐

    Java SE 6 新特性: XML API 与 Web 服务

    - **DOM Level 3**:Document Object Model (DOM) Level 3支持在Java SE 6中得到增强,提供了更多的API用于解析、创建和操作XML文档,包括DOM事件和命名空间支持。 - **SAX 2.0.2**:Simple API for XML (SAX)也...

    Oracle Fundamentals of the Java Programming Language, Java SE 6 Ed 1 课程学习文档

    Java集合框架提供了一套用于存储和操作对象的标准接口和实现,主要包括: - **List**:有序集合,允许重复元素。 - **Set**:不允许重复元素的无序集合。 - **Map**:键值对集合,每个键都是唯一的。 #### 6. 输入...

    java se 经典实例

    这些实例可以帮助你理解如何存储和操作数据集,以及何时选择哪种数据结构。例如,你可能会遇到一个关于排序和查找算法的实例,如快速排序或二分查找。 多线程是Java的一大亮点,它允许程序同时执行多个任务。通过...

    Java SE 类库查询手册

    集合框架是Java SE中最基础也是最核心的部分之一,它提供了一组接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等),以及对它们进行操作的工具类(如Collections和Comparator)。...

    core java se 9 for impatient

    《Core Java SE 9 for the Impatient》是针对已有一定Java基础的程序员设计的一本速成教程,旨在帮助他们快速掌握Java SE 9的新特性和关键概念。这本书深入浅出地介绍了Java编程语言的最新版本,使读者能够在短时间...

    基于Java的INI文件操作类库 ini4j.zip

    `ini4j`通过提供Java接口,使开发者能够方便地创建、读取、更新和删除这些元素。 2. **ini4j API**:`ini4j`库提供了丰富的API,例如`Wini`、`Ini`和`Config`等类,它们分别用于处理Windows风格的INI文件、通用INI...

    java-se代码练习学习 Java学习资料

    这个压缩包文件"watermelon-java-se-master"很可能是某个Java初学者或进阶者的代码实践仓库,包含了他在学习Java SE过程中编写的各类练习项目。让我们深入探讨一下这个标题和描述中隐含的知识点,以及可能包含的文件...

    java-se 学习总结项目 Java学习资料

    - **文件操作**:学习如何创建、读取、修改和删除文件。 4. **多线程**: - **线程的创建与同步**:通过Thread类和Runnable接口创建线程,使用synchronized关键字、wait()、notify()和notifyAll()实现线程同步。 ...

    java-se练习代码 Java学习资料

    2. **类与对象**:面向对象是Java的核心特性,包括类的定义、对象的创建、封装、继承和多态性。练习可能要求你创建和操作自定义类。 3. **异常处理**:Java中的try-catch-finally语句用于处理程序运行时可能出现的...

    mysql-connector-java-5.1.49.jar

    MySQL Connector/J是MySQL数据库系统与Java应用程序之间的重要桥梁,它是一个实现了JDBC(Java Database Connectivity)规范的驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。"mysql-...

    Java学习资料 Java SE 介绍 Java SE 阶段的相关代码,主要为课堂中用到的事例

    6. **集合框架**:Java集合框架包括接口(如List、Set、Map)和实现这些接口的类(如ArrayList、HashSet、HashMap),是存储和操作对象的重要工具。 7. **IO流**:Java的输入输出系统允许程序读取和写入各种数据源...

    JAVA SE应用详解

    - **文件操作**:File类提供了创建、删除和读取文件的方法,FileInputStream和FileOutputStream用于文件读写。 7. **网络编程** - **Socket编程**:创建客户端Socket连接服务器,ServerSocket等待客户端连接,...

    (超赞)JAVA精华之--深入JAVA API

    - `java.io.File` 用于表示文件和目录路径名,提供了许多方法来获取和设置文件属性。 - **文件流的建立** - `FileInputStream` 和 `FileOutputStream` 分别用于读取和写入文件。 - **缓冲区流** - `...

    java-se基础代码练习 Java学习资料

    Java SE(标准版)是Java平台的核心,它提供了丰富的API和工具,用于开发和运行桌面应用程序、服务器应用程序以及分布式系统。这份"java-se基础代码练习"的资源集合,旨在帮助初学者和进阶者深入理解Java编程语言的...

    星座运势(java se)

    在Java中,try-catch语句块用于捕获并处理可能出现的错误,例如用户输入的无效日期或文件读取失败。 7. **多线程**:虽然星座运势程序可能不需要复杂的多线程操作,但为了提高用户体验,比如加载数据时显示进度条,...

    OCA Oracle Certified Associate Java SE 8 Programmer I Study Guide

    根据提供的文件信息,我们可以深入探讨《OCA Oracle Certified Associate Java SE 8 Programmer I Study Guide》这一书籍中的关键知识点。此书旨在帮助准备Oracle认证助理Java SE 8 Programmer I考试的考生进行有效...

    java SE基础练习代码 Java学习资料

    6. **IO流**: Java的IO流处理允许程序读取和写入数据,包括文件操作、网络通信等。NIO(New IO)提供了更高效的数据传输方式。 7. **多线程**: Java内置了对多线程的支持,可以创建Thread对象或实现Runnable接口来...

    java操作xml和sql server 2008必备包(crimson jdom sqljdbc sqljdbc4)

    而sqljdbc4.jar是针对Java SE 7及更高版本的,提供了更多的特性,如支持Java 7的try-with-resources语句。这些驱动程序使得Java应用程序能够通过JDBC(Java Database Connectivity)接口与SQL Server 2008进行通信,...

Global site tag (gtag.js) - Google Analytics