java.nio.file.files_JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现

JDK1.7中引入了新的文件操作类java.nio.file这个包,其中有个Files类它包含了很多有用的方法来操作文件,比如检查文件是否为隐藏文件,或者是检查文件是否为只读文件。开发者还可以使用Files.readAllBytes(Path)方法把整个文件读入内存,此方法返回一个字节数组,还可以把结果传递给String的构造器,以便创建字符串输出。此方法确保了当读入文件的所有字节内容时,无论是否出现IO异常或其它的未检查异常,资源都会关闭。这意味着在读文件到最后的块内容后,无需关闭文件。要注意,此方法不适合读取很大的文件,因为可能存在内存空间不足的问题。开发者还应该明确规定文件的字符编码,以避免任异常或解析错误。

readAllBytes(Path)方法的源码:

/**

* Reads all the bytes from a file. The method ensures that the file is

* closed when all bytes have been read or an I/O error, or other runtime

* exception, is thrown.

* 注意该方法只适用于简单的情况,这种简单的情况能够很方便地将所有的字节读进一个字节数组,但并不适合用来读取大文件

*

Note that this method is intended for simple cases where it is

* convenient to read all bytes into a byte array. It is not intended for

* reading in large files.

*

* @param path

* the path to the file

*

* @return a byte array containing the bytes read from the file

*

* @throws IOException

* if an I/O error occurs reading from the stream

* 如果大于文件2G,将抛出内存溢出异常

* @throws OutOfMemoryError

* if an array of the required size cannot be allocated, for

* example the file is larger that {@code 2GB}

* @throws SecurityException

* In the case of the default provider, and a security manager is

* installed, the {@link SecurityManager#checkRead(String) checkRead}

* method is invoked to check read access to the file.

*/

public static byte[] readAllBytes(Path path) throws IOException {

try (SeekableByteChannel sbc = Files.newByteChannel(path);

InputStream in = Channels.newInputStream(sbc)) {//JDK1.7 try-with-resource

long size = sbc.size();

if (size > (long)MAX_BUFFER_SIZE)

throw new OutOfMemoryError("Required array size too large");

return read(in, (int)size);

}

}

读取文件只要一行

package entryNIO;

import java.io.IOException;

import java.nio.file.Files;

import java.nio.file.Paths;

public class BufferAndChannel {

public static void main(String[] args) {

try {

System.out.println(

new String(Files.readAllBytes(Paths.get("C:\\FileChannelImpl.java")))

);

} catch (IOException e) {

e.printStackTrace();

}

}

}

readAllLines方法的源码

public static List readAllLines(Path path, Charset cs) throws IOException {

try (BufferedReader reader = newBufferedReader(path, cs)) {

List result = new ArrayList<>();

for (;;) {

String line = reader.readLine();

if (line == null)

break;

result.add(line);

}

return result;

}

}

package entryNIO;

import java.util.List;

import java.io.IOException;

import java.nio.charset.StandardCharsets;

import java.nio.file.Files;

import java.nio.file.Paths;

public class BufferAndChannel {

public static void main(String[] args) {

//如果是文本文件也可以这么读 调用readAllLines 方法

try { //JDK1.8以后可以省略第二个参数,默认是UTF-8编码

List lines = Files.readAllLines(Paths.get("C:\\FileChannelImpl.java"), StandardCharsets.UTF_8);

StringBuilder sb = new StringBuilder();

for (String line : lines) {

sb.append(line+"\n");// \r\n 换行符

}

String fromFile = sb.toString();

System.out.println(fromFile);

} catch (IOException e) {

e.printStackTrace();

}

}

}

使用Java8 流的方式:

先看源码实现

public static Stream lines(Path path) throws IOException {

return lines(path, StandardCharsets.UTF_8);

}

package entryNIO;

import java.io.IOException;

import java.nio.file.Files;

import java.nio.file.Paths;

public class BufferAndChannel {

public static void main(String[] args) {

//Java8 新增lines方法

try {

// Java8用流的方式读文件,更加高效

Files.lines(Paths.get("C:\\FileChannelImpl.java")).forEach(System.out::println);

} catch (IOException e) {

e.printStackTrace();

}

}

}

读文件一行写文件也只需要一行

package entryNIO;

import java.util.Arrays;

import java.util.List;

import java.io.IOException;

import java.nio.file.Files;

import java.nio.file.Paths;

import java.nio.file.StandardOpenOption;

public class BufferAndChannel {

public static void main(String[] args){

//Java8 新增lines方法

String filePath="C:\\FileChannelImpl.java";

try {

// Java8用流的方式读文件,更加高效

/*Files.lines(Paths.get(filePath)).forEach((line)->{

try {

Files.write(Paths.get("\\1.java"), line.getBytes(), StandardOpenOption.APPEND);

//Files.copy(in, target, options);

} catch (IOException e) {

e.printStackTrace();

}

}); */

/* Files.readAllLines(Path path)方法返回值为List类型,就是为Files.write()而设计的

* 因为Files.write()需要传入一个Iterable extends CharSequence>类型的参数

*

* Files.write(Path path, Iterable extends CharSequence> lines, OpenOption... options)

*/

List stringStream=Files.readAllLines(Paths.get(filePath));

//因为Files.lines(Path path)返回的是Stream,所以可以通过下面这种方法变成List

//List stringStream2=Arrays.asList((String[])Files.lines(Paths.get(filePath)).toArray());

//StandardOpenOption为枚举类 ,如果当前所Paths.get()的文件不存在,第三个参数可选择StandardOpenOption.CREATE_NEW

//文件存在则抛java.nio.file.FileAlreadyExistsException异常

Files.write(Paths.get("C:\\2.java"), stringStream, StandardOpenOption.CREATE_NEW);

} catch (IOException e) {

e.printStackTrace();

}

}

}

以上这篇JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值