当前位置: 首页 > 编程笔记 >

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

何甫
2023-03-14
本文向大家介绍JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现,包括了JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现的使用技巧和注意事项,需要的朋友参考一下

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 读取文件仅需一行代码实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 问题内容: 我只想读取文本文件的第一行并将该第一行放在字符串数组中。 这就是我所拥有的,但是它读取了整个文件。 myTextFile中的ex文本: 问题答案: 如果我了解你,那

  • 本文向大家介绍Java8中使用一行代码读取文件,包括了Java8中使用一行代码读取文件的使用技巧和注意事项,需要的朋友参考一下 JDK7中引入了新的文件操作类java.nio.file.File,它包含了很多有用的方法来操作文件,比如检查文件是否为隐藏文件,或者是检查文件是否为只读文件。开发者还可以使用Files.readAllBytes(Path)方法把整个文件读入内存,此方法返回一个字节数组,

  • 本文向大家介绍php与c 实现按行读取文件实例代码,包括了php与c 实现按行读取文件实例代码的使用技巧和注意事项,需要的朋友参考一下 php与c 实现按行读取文件 前言 感觉很糟糕的一场电话一面竟然给了二面通知,好吧,给自己一个机会也给对方一次机会,题外话。海量数据处理经常涉及到hash将原来文件的每一行散列到子文件中,那如何按行读取文件呢,这里记录一下php和c的实现 很水的一篇,只是记录一下

  • 本文向大家介绍node.js实现逐行读取文件内容的代码,包括了node.js实现逐行读取文件内容的代码的使用技巧和注意事项,需要的朋友参考一下 在此之前先介绍一个逐行读取文件内容NPM:https://github.com/nickewing/line-reader,需要的朋友可以看看。 直接上代码:

  • 本文向大家介绍python3读取csv文件任意行列代码实例,包括了python3读取csv文件任意行列代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了python3读取csv文件任意行列代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 读取每一行 reader = csv.reader(f) 此时reader返回的值是c

  • 本文向大家介绍C#读取文件MD5值的实现代码,包括了C#读取文件MD5值的实现代码的使用技巧和注意事项,需要的朋友参考一下 本文介绍一个C#函数,可以实现计算文件的MD5值,可以用于文件传输后进行有效性校验。 我们知道可以通过将一个字符串进行散列(Hash)运算得到一个32位字符串,将其作为密码来保存是最常见的MD5应用。不知道大家有没有注意到,在网上一些下载文件的地方,旁边注明了MD5校验值,也

  • 本文向大家介绍Java 读取excel 文件流代码实例,包括了Java 读取excel 文件流代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java 读取excel 文件流代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 我已经从Word DOCX文档(oleObject1.bin …等)中提取了许多OleObject文件。是否有开放源代码(主要在Java中)才能读取此文件。(如果可以轻松地移植到Java,我只会对* .net代码感兴趣)。我对Word文档的其余部分(在此问题中)不感兴趣。有一个Apache项目(http://poi.apache.org/)-我对它的工作方式很感兴趣 问题答案: Apa