I/O Flashcards
Welke classes vallen er onder de Reader API
- FileReader
- StringReader
- CharArrayReader
Hoe maak ik een nieuwe referentie van een bestand aan?
File file = new File("map/naar/bestand.txt");
Stel, we hebben een file object:File file = new File("map/naar/bestand.txt");
.
Hoe checken we of dit bestand bestaat? (geef beide opties)
file.exists(); // returnt boolean
ofFiles.exists(file.toPath());
Stel, we hebben een file object:File file = new File("map/naar/bestand.txt");
.
Hoe checken we of dit een bestand of map is? (geef beide opties)
file.isDirectory(); // returnt boolean
ofFiles.isDirectory(file.toPath());
hoe maak ik een bestand aan? (geef beide opties)
- Maak eerst een file object aan:
File file = new File("map/naar/bestand.txt");
file.createNewFile(); // returnt boolean
let op dat dit alleen werkt als de map/naar
map beschikbaar is.
hoe maak ik een map(directory) aan? (geef beide opties)
- Maak eerst een file object aan:
File dir = new File("map/naar");
-
dir.mkdir(); // returnt boolean
ofFiles.createDirectory(dir.toPath());
let op dat dit alleen werkt als de map
map beschikbaar is. Is dit niet het geval dan wordt er simpelweg false gereturnd en gebeurt er niets.
Als je wil dat alle nog niet bestaande mappen aangemaakt worden, kun je mkdirs gebruiken.
Stel ik heb een file object:File file = new File("path/to/file/file.txt");
wat is het verschil tussen file.mkdir
en file.mkdirs
? Wat is het resultaat in beide gevallen (aangenomen dat alle mappen nog niet bestaan).
mkdir maakt enkel de map file.txt
aan wanneer path/to/file al bestaat. Gezien dit niet het geval is returnt mkdir false en gebeurt er niets.
mkdirs maakt de map file.txt
en alle nog niet bestaande parent mappen aan.
let op: er worden in beide gevallen geen bestanden aangemaakt. file.txt wordt als map gezien.
Stel ik heb een file object:File file = new File("path/to/file/file.txt");
Hoe kan ik het absolute pad van deze file ophalen?
met file.getAbsolutePath();
Stel ik heb een file object:File file = new File("path/to/file/../file/file.txt");
Wat is hier het verschil tussen file.getAbsolutePath()
en file.getCanonicalPath()
?
getAbsolutePath doet geen conversie en zal dus bijvoorbeeld C:/code/javaproj/path/to/file/../file/file.txt
teruggeven.
getCanonicalPath doet de conversie van de ../
wel en geeft daarom C:/code/javaproj/path/to/file/file.txt
terug.
Beschouw deze code:
~~~
Path pathOne = Paths.get(“/animals/tiger”);
Path pathTwo = Paths.get(“animals/lion”);
System.out.println(pathOne.resolve(pathTwo));
~~~
Wat wordt er geprint?
/animals/tiger/animals/lion
Wanneer een absoluut pad in een relatief pad word geresoved, worden de paden simpelweg achter elkaar geplakt.
Beschouw deze code:
~~~
Path pathOne = Paths.get(“/animals/tiger”);
Path pathTwo = Paths.get(“animals/lion”);
System.out.println(pathTwo.resolve(pathOne));
~~~
Wat wordt er geprint?
/animals/tiger
Wanneer een relatief pad in een absoluut pad word geresoved, wordt het relatieve pad genegeerd en het absolute pad teruggegeven.
Beschouw deze code:
~~~
Path pathOne = Paths.get(“animals/lion”);
Path pathTwo = Paths.get(“animals/zebra”);
System.out.println(pathOne.resolve(pathTwo));
~~~
Wat wordt er geprint?
animals/lion/animals/zebra
.
Resolve met twee relatieve paden zorgt ervoor dat ze simpelweg achter elkaar worden geplakt
Beschouw deze code:
~~~
Path pathOne = Paths.get(“/animals/tiger”);
Path pathTwo = Paths.get(“/animals/giraffe”);
System.out.println(pathOne.resolve(pathTwo));
~~~
Wat wordt er geprint?
/animals/giraffe
Wanneer resolve wordt uitgevoerd op twee absolute paden dan wordt het pad dat als parameter wordt meegegeven als leidend beschouwd.
Beschouw deze code:
~~~
Path path3 = Paths.get(“E:\habitat”);
Path path4 = Paths.get(“E:\sanctuary\raven\poe.txt”);
System.out.println(path3.relativize(path4));
System.out.println(path4.relativize(path3));
~~~
Wat wordt er geprint?
..\sanctuary\raven\poe.txt
en..\..\..\habitat
Relativize geeft instructies om van pad a naar pad b te komen.
Beschouw deze code:
~~~
var p2 = Path.of(“/cats/../panther/food/”);
System.out.println(p2.normalize());
~~~
Wat is het resultaat?
panther/food
.
normalize zorgt ervoor dat alle ../
elementen eruit worden gehaald en een eenvoudig leesbaar pad overblijft. Ook de laatste /
wordt weggehaald.
Beschouw deze code:
~~~
Path pathOne = Paths.get(“animals/lion”);
Path pathTwo = Paths.get(“c:/animals/zebra”);
System.out.println(pathOne.relativize(pathTwo));
~~~
Wat wordt er geprint?
Niets, dit geeft een error (IllegalArgumentException).
Relativize vereist dat beide paden relatief of absoluut zijn. Relatieve en absolute paden kunnen niet met elkaar gerelativeerd worden.
Hoe maak ik een referentie naar een bestand dat ik uit wil lezen?
met FileReader.
Bijvoorbeeld:
~~~
Reader reader = new FileReader(“path/to/myFile.txt”);
~~~
let op: new FileReader gooit een FileNotFoundException dus zorg ervoor dat deze, of IOException wordt afgevangen.
Reader reader = new FileReader("path/to/myFile.txt");
Stel ik wil reader.read()
doen. Wat voor parameters worden er verwacht? En wat returnt het?
Het vraagt een character array (dus char[]
).
Het returnt het aantal karakters dat gelezen is.
Hoe kan ik met FileReader een bestand uitlezen?
Reader reader = new FileReader("files/myFile.txt"); char[] buf = new char[1]; StringBuilder sb = new StringBuilder(); int read = reader.read(buf); while (read > 0) { sb.append(buf, 0, read); read = reader.read(buf); } System.out.println(sb);
let er wel op om reader te closen en een IOException of FileNotFoundException te gooien.
Hoe schrijf ik met fileWriter naar een bestand?
Bijvoorbeeld zo:
~~~
try (Writer w = new FileWriter(“files/newFile.txt”)) {
w.write(“Nieuw bestand.”);
} catch (IOException e) {
e.printStackTrace();
}
~~~
Hoe werkt BufferedWriter en hoe verschilt het van de ‘standaard’ FileWriter.
Bijvoorbeeld zo:
~~~
try (Writer w = new FileWriter(“files/newFile.txt”)) {
BufferedWriter bufferedWriter = new BufferedWriter(w);
bufferedWriter.write(“Tekst wegschrijven met BW”);
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
~~~
BufferedWriter voorkomt dat er vele kleine schrijf acties moeten worden gedaan. Met .flush() wordt in 1 keer alles naar de file weggeschreven.