Atrodo, kad yra įvairių būdų, kaip skaityti ir rašyti failų duomenis "Java".
Noriu perskaityti ASCII duomenis iš failo. Kokie galimi būdai ir jų skirtumai?
Mano mėgstamiausias būdas skaityti nedidelį failą - naudoti BufferedReader ir StringBuilder. Tai labai paprasta ir paprasta (nors ir ne itin efektyvu, bet daugeliu atvejų pakanka):
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
Kai kas nurodė, kad po "Java 7" turėtumėte naudoti try-with-resources (t. y. automatinio uždarymo) funkcijas:
try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
}
Kai skaitau tokias eilutes, paprastai vis tiek noriu atlikti tam tikrą eilutės tvarkymą kiekvienoje eilutėje, todėl tada renkuosi šią realizaciją.
Nors jei iš tikrųjų noriu tiesiog perskaityti failą į eilutę, visada naudoju Apache Commons IO klasės IOUtils.toString() metodą. Šaltinį galite peržiūrėti čia:
http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html
FileInputStream inputStream = new FileInputStream("foo.txt");
try {
String everything = IOUtils.toString(inputStream);
} finally {
inputStream.close();
}
Su "Java 7" dar paprasčiau:
try(FileInputStream inputStream = new FileInputStream("foo.txt")) {
String everything = IOUtils.toString(inputStream);
// do something with everything string
}
ASCII yra TEKSTO failas, todėl skaitymui reikia naudoti Readers
. Java taip pat palaiko skaitymą iš dvejetainio failo naudojant InputStreams
. Jei skaitomi didžiuliai failai, norėdami pagerinti skaitymo našumą, norėtumėte naudoti BufferedReader
ant FileReader
.
Peržiūrėkite šį straipsnį apie tai, kaip naudoti Reader
Taip pat rekomenduočiau atsisiųsti ir perskaityti šią nuostabią (dar nemokamą) knygą Thinking In Java.
In Java 7:
new String(Files.readAllBytes(...))
(docs) arba arba
Files.readAllLines(...)
"Java 8":
Files.lines(..).forEach(...)
Paprasčiausias būdas - naudoti "Java" klasę Scanner
ir objektą FileReader. Paprastas pavyzdys:
Scanner in = new Scanner(new FileReader("filename.txt"));
Scanner
turi keletą metodų eilutėms, skaičiams ir t. t. nuskaityti. Daugiau informacijos apie tai galite ieškoti Java dokumentacijos puslapyje.
Pavyzdžiui, viso turinio skaitymas į String
:
StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
sb.append(in.next());
}
in.close();
outString = sb.toString();
Be to, jei jums reikia konkrečios koduotės, vietoj FileReader
galite naudoti šį įrankį:
new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)