anchor.diff:  == Exercice: abstract path concept
   Here we will reuse our previous code to write at different places in our default file system and to a zip file.
   
  -* Create a new `zip` file and obtain the `FileSystem` instance that represents it, thanks to this https://github.com/oliviercailloux/sample-flows/blob/zipfile/src/main/java/io/github/oliviercailloux/sample_flows/ZipFileCreator.java[sample code]. Obtain the root path of this file system with `https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/nio/file/FileSystem.html#getPath(java.lang.String,java.lang.String...)[getPath("")]`. Pass this path to `helloBye()`. Check (manually) that you have successfully created a zip file containing the expected files. Modify the code of the `main` method (but not the one of `helloBye`) so that the zip file will contain files `myfolder/hello.txt` and `myfolder/subfolder/bye.txt`.
  +* Create a new `zip` file and obtain the `FileSystem` instance that represents it, thanks to this https://github.com/oliviercailloux/sample-flows/blob/zipfile/src/main/java/io/github/oliviercailloux/sample_flows/ZipFileCreator.java[sample code]. Obtain the root path of this file system with `https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/FileSystem.html#getPath(java.lang.String,java.lang.String...)[getPath("")]`. Pass this path to `helloBye()`. Check (manually) that you have successfully created a zip file containing the expected files. Modify the code of the `main` method (but not the one of `helloBye`) so that the zip file will contain files `myfolder/hello.txt` and `myfolder/subfolder/bye.txt`.
   * Assume that you modify `helloBye` so that it creates the paths it needs using `Path.of` (and using strings, converting the path given as argument to a string by using `toString()`) instead of by creating the paths it needs from the path instance given as argument. What would continue to work, among what we did so far, and what would fail? Explain, using the explanations given in the section here above, why it is impossible to make this whole exercice work if creating path instances using `Path.of`.
   
   == Make sure your methods that write data can write anywhere
  
positive.code: == Overview
  There are four essential kinds of objects that represent flows of information in Java.
  
  * https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/InputStream.html[InputStream]: to read flows of bytes.
  * https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/OutputStream.html[OutputStream]: to write flows of bytes.
  * https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/Reader.html[Reader]: to read flows of characters.
  * https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/Writer.html[Writer]: to write flows of characters.
  
  It is typical for a flow of character to be encoded as a flow of bytes. For example, to store the string `Hello, world` in a text file on your hard disk, using the https://en.wikipedia.org/wiki/UTF-8[UTF-8] encoding standard, the string would be first https://en.wikipedia.org/wiki/UTF-8#Codepage_layout[encoded] as the bytes _48_, _65_, _6C_, _6C_, _6F_, _2C_, _20_, _77_, _6F_, _72_, _6C_, _64_ in hexadecimal (or equivalently in decimal, _72_, _101_, _108_, _108_, _111_, _44_, _32_, _119_, _111_, _114_, _108_, _100_), then written (as a bit stream) on the disk. In Java, a mapping between characters and bytes is called a _character set_. You should always opt for the https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/charset/StandardCharsets.html#UTF_8[`UTF-8`] character set when you have a choice, as it is the standard general purpose character set.
  
  The most common way of obtaining a flow is to read from a file. To designate the file, you typically use a path relative to your project directory (the place where `pom.xml` is stored, when you use Maven). 
  
  Two essential classes help you deal with files: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Path.html[`Path`] and https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Files.html[`Files`]. For example, use `Files#newBufferedWriter()` to obtain a `Writer` that writes to a file.
  
  Classes that represent flows (such as the four above) implement `Closeable`. This signals that they must be _closed_ after use. (This serves to release resources that might have been reserved by the operating system, or to proceed with finalizing operations, such as effectively writing to disk by flushing the cache.) Do not forget to close your flows after use by calling `close()`. Use the https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html[try-with-resources] statement for this, as it is a simple way of making sure `close()` is duly called.
  
  
negative.code: 
  We now want to test this method. We could create a file, let the method read from that file, and then delete the file, but we prefer to avoid creating a file unnecessarily. This is possible thanks to the abstraction represented by `Reader`: remember that such an object represents a flow of characters, and this may come from a file, from memory, from the network, …
  
  * Create a unit test that creates a `String` equal to `firstname\nlastname`. The test gives the string to your `readPersons` method created in the previous exercice. To do this, use a https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/StringReader.html[`StringReader`]. The test asserts that the created person has the right first and last names.
  
  == Exercice: Write two files
  In this exercice we will write code that writes two files, `hello.txt` and `subfolder/bye.txt`.
  