Cum se citește un fișier în Java

Prezentare generală

În acest tutorial, vom explora diferite moduri de a citi dintr-un fișier în Java .

În primul rând, vom învăța cum să încărcăm un fișier din classpath, o adresă URL sau dintr-un fișier JAR folosind clase Java standard.

În al doilea rând, vom vedea cum pentru a citi conținutul cu BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream și FileChannel. De asemenea, vom discuta despre modul de citire a unui fișier codat UTF-8.

În cele din urmă, vom explora noile tehnici de încărcare și citiți un fișier în Java 7 și Java 8.

Acest articol face parte din seria „Java – Back to Basic” de pe Baeldung.

Lecturi suplimentare:

Java – Creați un fișier

Cum să creați un fișier în Java folosind JDK 6, JDK 7 cu NIO sau Commons IO.
Citiți mai multe →

Java – Scrieți în fișier

Multe modalități de a scrie date în fișier folosind Java.
Citiți mai multe →

Configurare

2.1 Fișier de intrare

În majoritatea exemplelor din acest articol, vom citi un fișier text cu numele de fișier fileTest.txt care conține un rând:

Pentru câteva exemple, vom folosi un fișier diferit; în aceste cazuri, vom menționa în mod explicit fișierul și conținutul acestuia.

2.2 Metoda de ajutor

Vom folosi un set de exemple de testare cu nucleu Numai clase Java și, în teste, vom folosi afirmații cu potrivitori Hamcrest.

Testele vor partaja o metodă comună readFromInputStream care transformă un InputStream în șir pentru afirmarea mai ușoară a rezultatelor:

Rețineți că există alte modalități de a obține același rezultat. Putem consulta acest articol pentru câteva alternative.

Citirea unui fișier din Classpath

3.1 . Utilizarea Java standard

Această secțiune explică modul de citire a unui fișier disponibil pe un traseu de clasă. Vom citi „fileTest.txt” disponibil în src / main / resources :

În fragmentul de cod de mai sus, am folosit clasa curentă pentru a încărca un fișier folosind metoda getResourceAsStream și am trecut calea absolută a fișierului de încărcat.

Aceeași metodă este disponibilă pe o instanță ClassLoader, de asemenea:

Obținem classLoa der al clasei curente folosind getClass (). getClassLoader ().

Principala diferență este că atunci când se utilizează getResourceAsStream pe o instanță ClassLoader, calea este tratată ca absolută începând de la rădăcina clasei.

Atunci când este utilizat împotriva unei instanțe de clasă, calea poate fi relativă la pachet sau o cale absolută, care este sugerată de slash-ul principal.

Desigur, rețineți că, în practică, , fluxurile deschise ar trebui să fie întotdeauna închise, cum ar fi InputStream în exemplul nostru:

3.2. Utilizarea bibliotecii commons-io

O altă opțiune comună este utilizarea clasei FileUtils a pachetului commons-io:

Aici trecem obiectul File la metoda readFileToString () a clasei FileUtils. Această clasă de utilitate reușește să încarce conținutul fără a fi necesar să scrieți un cod boilerplate pentru a crea o instanță InputStream și a citi date.

Aceeași bibliotecă oferă și clasa IOUtils:

Aici vom trece obiectul FileInputStream la metoda toString () din clasa IOUtils. Această clasă de utilitate acționează în același mod ca și cea precedentă, pentru a crea o instanță InputStream și a citi date.

Citirea cu BufferedReader

Acum, permiteți ” Se concentrează pe diferite moduri de a analiza conținutul unui fișier.

Vom începe cu un mod simplu de a citi dintr-un fișier folosind BufferedReader:

Rețineți că readLine () va reveni nul când se ajunge la sfârșitul fișierului.

Citirea dintr-un fișier utilizând Java NIO

În JDK7, pachetul NIO a fost actualizat semnificativ.

Să vedem un exemplu folosind clasa Files și metoda readAllLines. Metoda readAllLines acceptă o cale.

Clasa de cale poate fi considerată o actualizare a fișierului java.io.File cu câteva operații suplimentare în loc.

5.1. Citirea unui fișier mic

Următorul cod arată cum să citiți un fișier mic folosind noua clasă Fișiere:

Rețineți că putem folosi readAllBytes () metoda de asemenea, dacă avem nevoie de date binare.

5.2. Citirea unui fișier mare

Dacă dorim să citim un fișier mare cu clasa Fișiere, putem utiliza BufferedReader.

Următorul cod citește fișierul folosind noua clasă Files și BufferedReader:

5.3. Citirea unui fișier folosind Files.lines ()

JDK8 oferă metoda lines () din clasa Files. Returnează un flux de elemente șir.

Să vedem un exemplu de cum să citiți datele în octeți și să le decodificați folosind setul de caractere UTF-8.

Următorul cod citește fișierul folosind noul Files.lines ():

Folosind Stream cu canale IO precum operațiile de fișiere, trebuie să închidem fluxul în mod explicit folosind metoda close ().

După cum putem vedea, API-ul Files oferă un alt mod ușor de a citi conținutul fișierului într-un șir.

În secțiunile următoare, vom analiza alte metode mai puțin obișnuite de citirea unui fișier care poate fi adecvat în anumite situații.

Citirea cu scanerul

În continuare, să folosim un scaner pentru a citi din fișier. Aici vom folosi spațiul alb ca delimitator:

Rețineți că delimitatorul implicit este spațiul alb, dar mai multe delimitatori pot fi folosiți cu un scaner.

Clasa Scanner este utilă când citiți conținut din consolă sau când conținutul conține valori primitive, cu un delimitator cunoscut (de exemplu: o listă de numere întregi separate prin spațiu).

Citirea cu StreamTokenizer

Acum, să citim un fișier text în jetoane folosind un StreamTokenizer.

Tokenizorul funcționează mai întâi aflând care este următorul token, șir sau număr. Facem acest lucru uitându-ne la câmpul tokenizer.ttype.

Apoi, vom citi simbolul real pe baza acestui tip:

  • tokenizer.nval – dacă tipul a fost un număr
  • tokenizer.sval – dacă tipul a fost un șir

În acest exemplu, vom folosi un fișier de intrare diferit care conține pur și simplu:

Următorul cod citește din fișier atât șirul, cât și numărul:

Rețineți cum este utilizat sfârșitul simbolului fișierului la sfârșit.

Această abordare este utilă pentru analizarea unui flux de intrare în jetoane.

Citirea cu DataInputStream

Putem folosi DataInputStream pentru a citi binare sau tipuri de date primitive dintr-un fișier.

Următorul test citește fișierul utilizând un DataInputStream:

Citirea cu FileChannel

Dacă citiți un fișier mare, FileChannel poate fi mai rapid decât IO standard.

Următorul cod citește octeți de date din fișier folosind FileChannel și RandomAccessFile:

Citirea unui cod UTF-8 ed File

Acum să vedem cum să citiți un fișier codat UTF-8 folosind BufferedReader. În acest exemplu, vom citi un fișier care conține caractere chinezești:

Citirea conținutului de la adresa URL

Pentru a citi conținutul dintr-o adresă URL, vom folosi Adresa URL „/” în exemplul nostru:

Există și modalități alternative de conectare la o adresă URL. Aici am folosit adresa URL și clasa URLConnection disponibile în SDK-ul standard.

Citirea unui fișier dintr-un JAR

Pentru a citi un fișier care se află într-un Fișier JAR, vom avea nevoie de un JAR cu un fișier în interior. Pentru exemplul nostru, vom citi „LICENȚIE.txt” din fișierul „hamcrest-library-1.3.jar”:

Aici vrem să încărcăm LICENȚIE.txt care se află în biblioteca Hamcrest, așa că vom folosi clasa Matcher care ajută la obținerea unei resurse. Același fișier poate fi încărcat și cu ajutorul clasificatorului.

Concluzie

După cum putem vedea, există multe posibilități pentru încărcarea unui fișier și citirea datelor din acesta folosind Java simplu.

Putem încărca un fișier din diferite locații, cum ar fi classpath, URL sau fișiere jar.

poate utiliza BufferedReader pentru a citi rând cu rând, Scanner pentru a citi folosind diferite delimitatori, StreamTokenizer pentru a citi un fișier în jetoane, DataInputStream pentru a citi date binare și tipuri de date primitive, SequenceInput Stream pentru a lega mai multe fișiere într-un singur flux, FileChannel pentru a citi mai repede din mare fișiere etc.

Write a Comment

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *