Java poskytuje několik metod čtení souborů. Každá z těchto metod je vhodná pro čtení různých typů souborů v různých situacích. Některé jsou lepší pro čtení delších souborů, jiné jsou lepší pro čtení kratších souborů atd.
V tomto tutoriálu budeme ke čtení souborů používat následující třídy Java
V celém výukovém programu používáme soubor uložený v src
adresář, kde je cesta k souboru src/file.txt
.
Než budete pokračovat, uložte do tohoto souboru několik řádků textu.
Poznámka:Při používání těchto implementací musíte správně zpracovat chyby, abyste se drželi nejlepších postupů kódování.The BufferedReader
třída čte proud vstupu znaků. Ukládá znaky do vyrovnávací paměti s výchozí velikostí 8 kB, aby byl proces čtení efektivnější. Pokud chcete číst soubor po řádku, je dobrou volbou použití BufferedReader.
BufferedReader
je efektivní při čtení velkých souborů.
import java.io.*; public class FileReaderWithBufferedReader {
public static void main(String[] args) throws IOException{We
String file = 'src/file.txt';
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
//process the line as required
System.out.println(curLine);
}
bufferedReader.close();
} }
The readline()
metoda vrátí hodnotu null, když je dosaženo konce souboru.
Můžeme použít BufferedReader
třídy pro čtení souboru kódovaného UTF-8.
Tentokrát předáme InputStreamReader
objekt při vytváření BufferedReader
instance.
import java.io.*; public class EncodedFileReaderWithBufferedReader {
public static void main(String[] args) throws IOException {
String file = 'src/fileUtf8.txt';
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), 'UTF-8'));
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
//process the line as you require
System.out.println(curLine);
}
} }
Java Files
třída, představená v prostředí Java 7 v prostředí Java NIO, sestává plně ze statických metod, které pracují se soubory.
Pomocí Files
třídy, můžete načíst celý obsah souboru do pole. Díky tomu je dobrou volbou pro čtení menších souborů.
Podívejme se, jak můžeme v obou těchto scénářích použít třídu Files.
The readAllLines()
metoda Files
třída umožňuje čtení celého obsahu souboru a ukládá každý řádek v poli jako řetězce.
Můžete použít Path
třídy k získání cesty k souboru od Files
třída přijímá Path
předmět souboru.
import java.io.IOException; import java.nio.file.*; import java.util.*; public class SmallFileReaderWithFiles {
public static void main(String[] args) throws IOException {
String file = 'src/file.txt';
Path path = Paths.get(file);
List lines = Files.readAllLines(path);
} }
Můžete použít readAllBytes()
načíst data uložená v souboru do bajtového pole namísto řetězcového pole.
byte[] bytes = Files.readAllBytes(path);
Pokud si chcete přečíst velký soubor pomocí Files
třídy, můžete použít newBufferedReader()
metoda pro získání instance BufferedReader
třídy a přečtěte soubor po řádku pomocí BufferedReader
.
import java.io.*; import java.nio.file.*; public class LargeFileReaderWithFiles {
public static void main(String[] args) throws IOException {
String file = 'src/file.txt';
Path path = Paths.get(file);
BufferedReader bufferedReader = Files.newBufferedReader(path);
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
System.out.println(curLine);
}
bufferedReader.close();
} }
Java 8 představila novou metodu třídy Files pro načtení celého souboru do Stream
řetězců.
import java.io.IOException; import java.nio.file.*; import java.util.stream.Stream; public class FileReaderWithFilesLines {
public static void main(String[] args) throws IOException {
String file = 'src/file.txt';
Path path = Paths.get(file);
Stream lines = Files.lines(path);
lines.forEach(s -> System.out.println(s));
lines.close();
} }
The Scanner
třída rozdělí obsah souboru na části pomocí daného oddělovače a přečte jej po částech. Tento přístup je nejvhodnější pro čtení obsahu odděleného oddělovačem.
Například Scanner
třída je ideální pro čtení seznamu celých čísel oddělených mezerami nebo seznamu řetězců oddělených čárkami.
Výchozí oddělovač Scanner
třída je prázdné místo. Oddělovač však můžete nastavit na jiný znak nebo regulární výraz. Má také různé další metody, například next()
, nextInt()
, nextLine()
a nextByte()
pro převod obsahu do různých typů.
import java.io.IOException; import java.util.Scanner; import java.io.File; public class FileReaderWithScanner {
public static void main(String[] args) throws IOException{
String file = 'src/file.txt';
Scanner scanner = new Scanner(new File(file));
scanner.useDelimiter(' ');
while(scanner.hasNext()){
String next = scanner.next();
System.out.println(next);
}
scanner.close();
} }
Ve výše uvedeném příkladu nastavíme oddělovač na mezery a použijeme next()
metoda pro čtení další části obsahu oddělené mezerami.
Můžete použít Scanner
třídy pro čtení celého souboru najednou bez spuštění smyčky. Musíte předat “\Z”
jako oddělovač.
scanner.useDelimiter('\Z'); System.out.println(scanner.next()); scanner.close();
Poznámka:Třída skeneru není synchronizována, a proto není bezpečná pro vlákna.Jak jste viděli v tomto výukovém programu, Java nabízí mnoho metod, ze kterých si můžete vybírat podle povahy úkolu, který máte po ruce, pro čtení textových souborů. Můžete použít BufferedReader
číst velké soubory řádek po řádku.
Pokud chcete číst soubor, jehož obsah je oddělen oddělovačem, použijte Scanner
třída.
Můžete také použít Java NIO Files
třídy pro čtení malých i velkých souborů.