首页 > 开发 > Java > 正文

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

2024-07-13 10:13:38
字体:
来源:转载
供稿:网友

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

readAllBytes(Path)方法的源码:

<span style="font-size:32px;"> </span><span style="font-size:18px;">/**  * 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.  * 注意该方法只适用于简单的情况,这种简单的情况能够很方便地将所有的字节读进一个字节数组,但并不适合用来读取大文件  * <p> 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.  */</span><span style="font-size:18px;">   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);     }   }</span> 

读取文件只要一行

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<String> readAllLines(Path path, Charset cs) throws IOException {     try (BufferedReader reader = newBufferedReader(path, cs)) {       List<String> 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 {<span style="white-space:pre">               </span>//JDK1.8以后可以省略第二个参数,默认是UTF-8编码       List<String> 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<String> 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(<span style="font-family: Arial, Helvetica, sans-serif;">"C://FileChannelImpl.java"</span>)).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<String>类型,就是为Files.write()而设计的        * 因为Files.write()需要传入一个Iterable<? extends CharSequence>类型的参数        *        * Files.write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options)        */       List<String> stringStream=Files.readAllLines(Paths.get(filePath));       //因为Files.lines(Path path)返回的是Stream<String>,所以可以通过下面这种方法变成List<String>       //List<String> 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 读取文件仅需一行代码实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表