- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- JDK1.7中java.nio.file.Files如何讀取文件
這篇文章給大家分享的是有關(guān)JDK1.7中java.nio.file.Files如何讀取文件的內容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
JDK1.7中引入了新的文件操作類(lèi)java.nio.file這個(gè)包,其中有個(gè)Files類(lèi)它包含了很多有用的方法來(lái)操作文件,比如檢查文件是否為隱藏文件,或者是檢查文件是否為只讀文件。開(kāi)發(fā)者還可以使用Files.readAllBytes(Path)方法把整個(gè)文件讀入內存,此方法返回一個(gè)字節數組,還可以把結果傳遞給String的構造器,以便創(chuàng )建字符串輸出。此方法確保了當讀入文件的所有字節內容時(shí),無(wú)論是否出現IO異?;蚱渌奈礄z查異常,資源都會(huì )關(guān)閉。這意味著(zhù)在讀文件到最后的塊內容后,無(wú)需關(guān)閉文件。要注意,此方法不適合讀取很大的文件,因為可能存在內存空間不足的問(wèn)題。開(kāi)發(fā)者還應該明確規定文件的字符編碼,以避免任異?;蚪馕鲥e誤。
readAllBytes(Path)方法的源碼:
<span > </span><span >/** * 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. * 注意該方法只適用于簡(jiǎn)單的情況,這種簡(jiǎn)單的情況能夠很方便地將所有的字節讀進(jìn)一個(gè)字節數組,但并不適合用來(lái)讀取大文件 * <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 > 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 > </span>//JDK1.8以后可以省略第二個(gè)參數,默認是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 流的方式:
先看源碼實(shí)現
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 >"C:\\FileChannelImpl.java"</span>)).forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } } }
讀文件一行寫(xiě)文件也只需要一行
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)方法返回值為L(cháng)ist<String>類(lèi)型,就是為Files.write()而設計的 * 因為Files.write()需要傳入一個(gè)Iterable<? extends CharSequence>類(lèi)型的參數 * * Files.write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options) */ List<String> stringStream=Files.readAllLines(Paths.get(filePath)); //因為Files.lines(Path path)返回的是Stream<String>,所以可以通過(guò)下面這種方法變成List<String> //List<String> stringStream2=Arrays.asList((String[])Files.lines(Paths.get(filePath)).toArray()); //StandardOpenOption為枚舉類(lèi) ,如果當前所Paths.get()的文件不存在,第三個(gè)參數可選擇StandardOpenOption.CREATE_NEW //文件存在則拋java.nio.file.FileAlreadyExistsException異常 Files.write(Paths.get("C:\\2.java"), stringStream, StandardOpenOption.CREATE_NEW); } catch (IOException e) { e.printStackTrace(); } } }
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2