更新時(shí)間:2022-04-02 11:04:58 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1550次
(1)概述
Java 提供了java.nio.file讀取和寫入文件的 API。該類InputStream是表示字節(jié)輸入流的所有類的超類。
(2)用Java讀取文件
要讀取文本文件,您可以使用該Files.readAllBytes方法。下面的清單演示了此方法的用法。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
// somewhere in your code
String content = Files.readString(Path.of("resources", "work", "input.xml"));
要將文本文件逐行讀取到List類型String結(jié)構(gòu)中,您可以使用該Files.readAllLines方法。
List<String> lines = Files.readAllLines(Paths.get(fileName));
Files.readAllLines使用 UTF-8 字符編碼。它還確保在讀取所有字節(jié)后或發(fā)生異常時(shí)關(guān)閉文件。
(3)逐行讀取和過濾
該Files.lines方法允許逐行讀取文件,提供流。這個(gè)流可以被過濾和映射。 Files.lines讀取文件內(nèi)容后不會(huì)關(guān)閉文件,因此應(yīng)將其包裝在 try-with-resource 語句中。
在下面的示例中,每行末尾不必要的空格被刪除,空行是過濾器。
//read all lines and remove whitespace (trim)
//filter empty lines
//and print result to System.out
Files.lines(new File("input.txt").toPath())
.map(s -> s.trim())
.filter(s -> !s.isEmpty())
.forEach(System.out::println);
下一個(gè)示例演示如何根據(jù)某個(gè)正則表達(dá)式過濾掉行。
Files.lines(new File("input.txt").toPath())
.map(s -> s.trim())
.filter(s -> !s.matches("yourregularexpression"))
.forEach(System.out::println);
MANIFEST.MF下一個(gè)示例從位于文件夾中的文件中提取以“Bundle-Version:”開頭的行META-INF。它刪除前綴并刪除所有前導(dǎo)和尾隨空格。
package com.vogella.eclipse.ide.first;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.stream.Stream;
public class ReadMANIFESTFile {
public static void main(String[] args) throws IOException {
String versionString = readStreamOfLinesUsingFiles();
System.out.println(versionString);
}
private static String readStreamOfLinesUsingFiles() throws IOException {
Stream<String> lines = Files.lines(Paths.get("META-INF", "MANIFEST.MF"));
Optional<String> versionString = lines.filter(s -> s.contains("Bundle-Version:")).map(e-> e.substring(15).trim()).findFirst();
lines.close();
if (versionString.isPresent())
{
return versionString.get();
}
return "";
}
}
(4)用Java編寫文件
要寫入文件,您可以使用以下方法:
Files.write(stateFile.toPath(), content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE);
(5)使用 Files.list() 列出所有文件和子目錄
您可以訪問與 Java 程序的當(dāng)前執(zhí)行目錄相關(guān)的文件。要訪問運(yùn)行 Java 程序的當(dāng)前目錄,可以使用以下語句。
// writes all files of the current directory
Files.list(Paths.get(".")).forEach(System.out::println);
(6)如何識(shí)別當(dāng)前目錄
String currentDir = System.getProperty("user.dir");
創(chuàng)建一個(gè)名為com.vogella.java.files的新 Java 項(xiàng)目。創(chuàng)建以下FilesUtil.java類。
package com.vogella.java.files;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;
public class FilesUtil {
public static String readTextFile(String fileName) throws IOException {
String content = new String(Files.readAllBytes(Paths.get(fileName)));
return content;
}
public static List<String> readTextFileByLines(String fileName) throws IOException {
List<String> lines = Files.readAllLines(Paths.get(fileName));
return lines;
}
public static void writeToTextFile(String fileName, String content) throws IOException {
Files.write(Paths.get(fileName), content.getBytes(), StandardOpenOption.CREATE);
}
}
要測(cè)試這些方法,請(qǐng)?jiān)陧?xiàng)目文件夾中創(chuàng)建一個(gè)file.txt包含一些內(nèi)容的文本文件。創(chuàng)建以下Main類并運(yùn)行它。
package com.vogella.java.files;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws IOException {
String input = FilesUtil.readTextFile("file.txt");
System.out.println(input);
FilesUtil.writeToTextFile("copy.txt", input);
System.out.println(FilesUtil.readTextFile("copy.txt"));
FilesUtil.readTextFileByLines("file.txt");
Path path = Paths.get("file.txt");
}
}
Java 8 提供了一個(gè)很好的流來處理樹中的所有文件。
Files.walk(Paths.get(path))
.filter(文件::isRegularFile)
.forEach(System.out::println);
刪除目錄及其所有內(nèi)容。
String stringPath="...yourPath...";
Path path = new File(stringPath).toPath();
Files.walk(path)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
.getClass().getResourceAsStream()您可以通過任何對(duì)象的方法鏈從項(xiàng)目或 jar 文件中讀取資源。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743