Jak číst soubor v Javě

Přehled

V tomto výukovém programu prozkoumáme různé způsoby čtení ze souboru v Javě .

Nejprve se naučíme, jak načíst soubor z cesty třídy, adresy URL nebo ze souboru JAR pomocí standardních tříd Java.

Zadruhé, uvidíme, jak číst obsah pomocí BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream a FileChannel. Budeme také diskutovat o tom, jak číst soubor kódovaný v UTF-8.

Nakonec prozkoumáme nové techniky načítání a přečíst soubor v prostředí Java 7 a Java 8.

Tento článek je součástí série „Java – Back to Basic“ v Baeldungu.

Další čtení:

Java – vytvoření souboru

Jak vytvořit soubor v Javě pomocí JDK 6, JDK 7 s NIO nebo Commons IO.
Číst více →

Java – zápis do souboru

Mnoho způsobů zápisu dat do souboru pomocí Javy.
Přečtěte si více →

Nastavení

2.1 Vstupní soubor

Ve většině příkladů v tomto článku budeme číst textový soubor s názvem fileTest.txt, který obsahuje jeden řádek:

Pro několik příkladů použijeme jiný soubor; v těchto případech výslovně zmíníme soubor a jeho obsah.

2.2 Pomocná metoda

Použijeme sadu testovacích příkladů s jádrem Pouze třídy Java a v testech použijeme tvrzení s porovnávači Hamcrest.

Testy budou sdílet běžnou metodu readFromInputStream, která transformuje InputStream na String pro snazší prosazování výsledků:

Všimněte si, že existují i jiné způsoby, jak dosáhnout stejného výsledku. Některé alternativy můžeme konzultovat v tomto článku.

Čtení souboru z Classpath

3.1 . Používání standardní Java

V této části je vysvětleno, jak číst soubor, který je k dispozici na cestě ke třídě. Přečteme soubor „fileTest.txt“ dostupný pod src / main / resources :

Ve výše uvedeném fragmentu kódu jsme použili aktuální třídu k načtení souboru pomocí metody getResourceAsStream a předali jsme absolutní cestu k načtení souboru.

Stejná metoda je k dispozici na instance ClassLoader také:

Získáváme classLoa der aktuální třídy pomocí getClass (). getClassLoader ().

Hlavní rozdíl spočívá v tom, že při použití getResourceAsStream na instanci ClassLoader je cesta považována za absolutní počínaje kořenem cesty ke třídě.

Při použití proti instanci třídy může být cesta relativní k balíčku nebo absolutní cesta, která je naznačena úvodním lomítkem.

Samozřejmě si uvědomte, že v praxi , otevřené streamy by měly být vždy uzavřeny, například InputStream v našem příkladu:

3.2. Používání knihovny commons-io

Další běžnou možností je použití třídy FileUtils balíčku commons-io:

Zde předáme objekt File do metoda readFileToString () třídy FileUtils. Tato třída obslužných programů dokáže načíst obsah bez nutnosti psaní jakéhokoli standardního kódu pro vytvoření instance InputStream a čtení dat.

Stejná knihovna také nabízí třídu IOUtils:

Zde jsme předat objekt FileInputStream metodě toString () třídy IOUtils. Tato třída obslužných programů funguje stejně jako ta předchozí, aby vytvořila instanci InputStream a četla data.

Čtení pomocí BufferedReader

Nyní dovolte “ Zaměříme se na různé způsoby, jak analyzovat obsah souboru.

Začneme jednoduchým způsobem, jak číst ze souboru pomocí BufferedReader:

Všimněte si, že readLine () se vrátí null, když je dosaženo konce souboru.

Čtení ze souboru pomocí Java NIO

V JDK7 byl balíček NIO výrazně aktualizován.

Podívejme se na příklad pomocí třídy Files a metody readAllLines. Metoda readAllLines přijímá Path.

Třídu Path lze považovat za upgrade souboru java.io.File s některými dalšími operacemi.

5.1. Čtení malého souboru

Následující kód ukazuje, jak číst malý soubor pomocí nové třídy Files:

Všimněte si, že můžeme použít readAllBytes () také metodu, pokud potřebujeme binární data.

5.2. Čtení velkého souboru

Pokud chceme číst velký soubor s třídou Files, můžeme použít BufferedReader.

Následující kód načte soubor pomocí nová třída Files a BufferedReader:

5.3. Čtení souboru pomocí Files.lines ()

JDK8 nabízí metodu lines () uvnitř třídy Files. Vrátí prvky Stream of String.

Podívejme se na příklad, jak číst data do bytů a dekódovat je pomocí znakové sady UTF-8.

Následující kód přečte soubor pomocí nový Files.lines ():

Při použití Streamu s IO kanály, jako jsou operace se soubory, musíme stream explicitně zavřít pomocí metody close ().

Jak vidíme, API souborů nabízí další snadný způsob, jak načíst obsah souboru do řetězce.

V dalších částech se podíváme na další méně běžné metody čtení souboru, který může být v některých situacích vhodný.

Čtení pomocí skeneru

Dále použijeme ke čtení ze souboru skener. Zde použijeme mezeru jako oddělovač:

Všimněte si, že výchozí oddělovač je mezera, ale u skeneru lze použít více oddělovačů.

Třída skeneru je užitečná při čtení obsah z konzoly, nebo pokud obsah obsahuje primitivní hodnoty, se známým oddělovačem (např .: seznam celých čísel oddělených mezerou).

Čtení pomocí StreamTokenizer

Nyní si přečtěte textový soubor do tokenů pomocí StreamTokenizer.

Tokenizer funguje tak, že nejprve zjistíte, jaký je další token, řetězec nebo číslo. Děláme to tak, že se podíváme na pole tokenizer.ttype.

Potom si přečteme skutečný token založený na tomto typu:

  • tokenizer.nval – pokud byl typ číslo
  • tokenizer.sval – pokud byl typ String

V tomto příkladu použijeme jiný vstupní soubor, který jednoduše obsahuje:

Následující kód načte ze souboru řetězec i číslo:

Všimněte si, jak je na konci použit token souboru.

Tento přístup je užitečný pro analýzu vstupního proudu do tokenů.

Čtení pomocí DataInputStream

Pomocí DataInputStream můžeme číst binární nebo primitivní datové typy ze souboru.

Následující test načte soubor pomocí DataInputStream:

Čtení pomocí FileChannel

Pokud čtou velký soubor, FileChannel může být rychlejší než standardní IO.

Následující kód čte datové bajty ze souboru pomocí FileChannel a RandomAccessFile:

Čtení kódování UTF-8 ed Soubor

Nyní se podívejme, jak číst soubor kódovaný v UTF-8 pomocí BufferedReader. V tomto příkladu „přečteme soubor, který obsahuje čínské znaky:

Čtení obsahu z adresy URL

Ke čtení obsahu z adresy URL použijeme „/“ URL v našem příkladu:

Existují také alternativní způsoby připojení k adrese URL. Zde jsme použili třídu URL a URLConnection, která je k dispozici ve standardní sadě SDK.

Čtení souboru z JAR

Čtení souboru, který je umístěn uvnitř Soubor JAR, budeme potřebovat soubor JAR se souborem uvnitř. V našem příkladu si přečteme soubor „LICENSE.txt“ ze souboru „hamcrest-library-1.3.jar“:

Zde chceme načíst soubor LICENSE.txt, který se nachází v knihovně Hamcrest, takže použijeme třída Matcheru, která pomáhá získat zdroj. Stejný soubor lze načíst také pomocí Classloaderu.

Závěr

Jak vidíme, existuje mnoho možností pro načtení souboru a čtení dat z něj pomocí prosté Javy.

Můžeme načíst soubor z různých míst, jako jsou soubory classpath, URL nebo jar.

Pak jsme lze použít BufferedReader ke čtení řádek po řádku, Scanner ke čtení pomocí různých oddělovačů, StreamTokenizer ke čtení souboru do tokenů, DataInputStream ke čtení binárních dat a primitivních datových typů, SequenceInput Stream k propojení více souborů do jednoho proudu, FileChannel k rychlejšímu čtení z velkých soubory atd.

Write a Comment

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *