process’i/o’and’file’nio.2’ - ut · agenda 1. process’i/o’ 1. starang’processes’...
TRANSCRIPT
![Page 1: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/1.jpg)
Process I/O and File NIO.2 Java Fundamentals
2014, Tartu
Neeme Praks @nemecec
![Page 2: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/2.jpg)
Agenda
1. Process I/O 1. StarAng Processes 2. Handling I/O 3. Stopping Processes
2. New File API (NIO.2) 1. Basics 2. Metadata
![Page 3: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/3.jpg)
PROCESS I/O
![Page 4: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/4.jpg)
Process
• A process is an instance of a computer program that is being executed.
• It contains the program code and its current acAvity.
![Page 5: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/5.jpg)
Process Tools
• Windows GUI: Task Manager, Process Explorer • Windows CLI: tasklist, wmic • UNIX GUI: System Monitor • UNIX CLI: ps, top • Mac OS X: Ac?vity Monitor • Java: jps
![Page 6: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/6.jpg)
Java Process APIs
• Two APIs – RunAme.exec()
• Since the beginning (Java 1.0) • Error-‐prone and inconvenient
– ProcessBuilder • Since Java 1.5 • Much beZer than RunAme.exec()
![Page 7: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/7.jpg)
3rd-‐party process APIs
• Apache commons-‐exec – CompaAble with Java 1.3+ – Verbose API – Very mature, no acAve development
• zt-‐exec – CompaAble with Java 1.5+ – Inspired by ProcessBuilder and commons-‐exec – Concise API – Fixes a lot of small issues across the board
![Page 8: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/8.jpg)
StarAng Process in Java ProcessBuilder builder = new ProcessBuilder( "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe”, "https://courses.cs.ut.ee/2014/javaFund/fall");builder.start();
![Page 9: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/9.jpg)
StarAng Process in Java (2)
ProcessBuilder builder = new ProcessBuilder(”ps”);builder.start();
Where does the process output go?
![Page 10: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/10.jpg)
Process Streams
1. Output 2. Error 3. Input
• They NEED to be processed!
![Page 11: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/11.jpg)
Process Stream Piping Stream My Own Process My Sub Process Output OutputStream
System.out InputStream Process.getInputStream()
Error OutputStream System.err
InputStream Process.getErrorStream()
Input InputStream System.in
OutputStream Process.getOutputStream()
![Page 12: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/12.jpg)
Inherit Process Standard Output
ProcessBuilder builder = new ProcessBuilder("ps");builder.redirectOutput( Redirect.INHERIT);builder.start();
![Page 13: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/13.jpg)
Inherit All Streams
ProcessBuilder builder = new ProcessBuilder("ps");builder.inheritIO();builder.start();
![Page 14: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/14.jpg)
Redirect Process Output to File
ProcessBuilder builder = new ProcessBuilder("ps");File file = new File("out.txt");builder.redirectOutput( Redirect.to(file));builder.start();
![Page 15: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/15.jpg)
Copy Process Output ProcessBuilder builder = new ProcessBuilder("ps");Process process = builder.start();InputStream out = process.getInputStream();IOUtils.copy(out, System.out);
![Page 16: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/16.jpg)
Copy Process Error ProcessBuilder builder = new ProcessBuilder("ls", "notfound");Process process = builder.start();InputStream err = process.getErrorStream();IOUtils.copy(err, System.err);
![Page 17: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/17.jpg)
Copy Process Output and Error ProcessBuilder builder = new ProcessBuilder("ls", "notfound");builder.redirectErrorStream(true);Process process = builder.start();InputStream out = process.getInputStream();IOUtils.copy(out, System.out);
![Page 18: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/18.jpg)
Copy Process Output and Input ProcessBuilder builder = new ProcessBuilder("head", "-n", "3");Process p = builder.start();//run in backgroundnew Thread(() -> copyStream( p.getInputStream(), System.out)).start();IOUtils.copy(System.in, p.getOutputStream());
Process.getOutputStream() may be buffered – it’s not flushed immediately.
![Page 19: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/19.jpg)
Copy with Immediate Flush void copyStreamWithFlush( InputStream in, OutputStream out) { int i; while ((i = is.read()) != -1) { os.write(i); os.flush(); }}
![Page 20: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/20.jpg)
Seang Working Directory ProcessBuilder builder = new ProcessBuilder("ls");builder.directory(new File("/"));builder.redirectOutput(Redirect.INHERIT);builder.start();
![Page 21: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/21.jpg)
Seang Environment ProcessBuilder builder = new ProcessBuilder("env");builder.inheritIO();Map<String, String> env = builder.environment();env.put("foo", "bar");env.put("PATH", "/myBin" + File.pathSeparator + env.get("PATH"));builder.start();
![Page 22: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/22.jpg)
Seang PATH ProcessBuilder builder = new ProcessBuilder("Calculator"); Map<String, String> env = builder.environment();env.put("PATH", "/Applications/Calculator.app/Contents/MacOS” + File.pathSeparator + env.get("PATH")); builder.start();
Will it work?
![Page 23: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/23.jpg)
Seang PATH ProcessBuilder builder = new ProcessBuilder("Calculator"); Map<String, String> env = builder.environment();env.put("PATH", "/Applications/Calculator.app/Contents/MacOS” + File.pathSeparator + env.get("PATH")); builder.start();
IOException: Cannot run program "Calculator": error=2, No such file or directory
PATH is not used for finding the command!
![Page 24: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/24.jpg)
Wait for Process Stop ProcessBuilder builder = new ProcessBuilder( "/Applications/Calculator.app" + "/Contents/MacOS/Calculator");Process process = builder.start();process.waitFor();
![Page 25: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/25.jpg)
Check Process Exit Status ProcessBuilder builder = new ProcessBuilder("cat", "test.txt");builder.inheritIO();Process process = builder.start();int exitCode = process.waitFor();//0 – success, 1 – file not foundif (exitCode != 0) { throw new IllegalStateException( "Exit code: " + exitCode);}
![Page 26: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/26.jpg)
Stop Process ProcessBuilder builder = new ProcessBuilder( "ping", "ut.ee");builder.redirectOutput(Redirect.INHERIT);Process process = builder.start();Thread.sleep(5000);process.destroy();
![Page 27: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/27.jpg)
Stop Process in Finally
Process process = builder.start();try { doStuff(process);}finally { process.destroy();}
![Page 28: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/28.jpg)
RunAme.exec()
• Since Java 1.5 use ProcessBuilder instead • Issues:
– Single String command is split by spaces – fails if arguments contain spaces (quotes don’t help)
– Environment is passed as String[] not Map – Parent environment is only inherited if no custom variables are set
![Page 29: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/29.jpg)
Apache Commons Exec
• hZp://commons.apache.org/exec/ • Enables to
– Pump process streams – Destroy a process on Ameout – Expect certain exit values – Handle compleAon or failure using a callback – SubsAtute variables in command line
• JDK 1.3+ compaAble
![Page 30: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/30.jpg)
Stop Process on Timeout (commons-‐exec)
CommandLine cmdLine = new CommandLine( "/Applications/Calculator.app" + "/Contents/MacOS/Calculator");DefaultExecutor executor = new DefaultExecutor();executor.setWatchdog( new ExecuteWatchdog(10*1000));executor.execute(cmdLine);
![Page 31: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/31.jpg)
zt-‐exec
• hZps://github.com/zeroturnaround/zt-‐exec • Even beZer than commons-‐exec!
– Improved API • One-‐liners for common but complex use-‐cases • One-‐liners for reading process output to string • Async processes (java.uAl.concurrent.Future)
– Improved stream, Ameout and exit code handling • JDK 1.5+ compaAble • Used by MongoDB, documents4j
![Page 32: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/32.jpg)
Stop Process on Timeout (zt-‐exec)
try { new ProcessExecutor().command( "/Applications/Calculator.app" + "/Contents/MacOS/Calculator") .timeout(10, TimeUnit.SECONDS).execute();}catch (TimeoutException e) { // process is automatically destroyed}
![Page 33: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/33.jpg)
(Unix) Process Signals Name Number Descrip?on
HUP 1 Hang up (log out) INT 2 Interrupt (Ctrl+C) QUIT 3 Quit (Ctrl+Break) KILL 9 Non-‐catchable, non-‐ignorable kill TERM 15 Somware terminaAon signal
![Page 34: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/34.jpg)
Java Thread Dump Tools
• Ctrl+Break • jstack <pid> • kill –QUIT <pid> • sendsignal.exe <pid>
![Page 35: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/35.jpg)
Stopping Gracefully
• Close Window • Ctrl+C • kill <pid> • taskkill /PID <pid>
![Page 36: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/36.jpg)
Stopping Forcefully
• kill -‐KILL <pid> • taskkill /F /PID <pid>
![Page 37: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/37.jpg)
Process.destroy() method
• By Javadoc it forcibly terminates the sub-‐process.
• But actually – It forcefully terminates on Windows – and gracefully terminates on UNIX
• New destroyForcibly() method in Java 8
![Page 38: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/38.jpg)
Forceful TerminaAon on UNIX
• Execute external ‘kill –KILL <pid>’ command • Geang PID via Java ReflecAon API class UNIXProcess extends Process { private final int pid; … }
• Geang PID of last bash command my-‐app & echo $!
![Page 39: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/39.jpg)
NIO.2 (FILE I/O)
![Page 40: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/40.jpg)
Based On
• File I/O (Featuring NIO.2) Java Tutorial • hZp://docs.oracle.com/javase/tutorial/essenAal/io/fileio.html
![Page 41: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/41.jpg)
What is NIO.2?
• Why do we need it? • New I/O API introduced in Java 7
– File Paths – File OperaAons – Managing Metadata – Walking the File Tree – Finding Files – Watching a Directory for Changes
![Page 42: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/42.jpg)
Other Benefits
• Supports symbolic links • Improved support for relaAve paths • Improved support for directory lisAngs • Improved error handling
![Page 43: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/43.jpg)
Path vs OperaAons
• Old File I/O – java.io.File handles both
• NIO.2 FILE I/O – java.nio.file.Path handles a path – java.nio.file.Files handles operaAons
![Page 44: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/44.jpg)
Paths Paths.get("c:\\example\\data\\input.txt");Paths.get("/example/data/input.txt");Paths.get("example/data/input.txt");Paths.get("example\\data\\input.txt");Paths.get("example", "data", "input.txt");Paths.get("/", "example", "data", "input.txt");Paths.get( URI.create("file:/example/data/input.txt"));
![Page 45: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/45.jpg)
Path class Path { String toString(); Path getFileName(); Path getName(int index); int getNameCount(); Path subpath(int beginIndex, int endIndex); Path getParent(); Path getRoot(); //continues on the next slide}
![Page 46: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/46.jpg)
Path (2)
class Path { Path normalize(); boolean isAbsolute(); Path toAbsolutePath(); Path resolve(Path other); Path relativize(Path other); File toFile(); URI toUri(); //continues on the next slide}
![Page 47: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/47.jpg)
Path (3) Path toRealPath(LinkOption... Options) enum LinkOption { NOFOLLOW_LINKS; } path.toRealPath(); //follows symbolic linkspath.toRealPath(LinkOption.NOFOLLOW_LINKS);//doesn't follow symbolic links
![Page 48: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/48.jpg)
Checking Files class Files { boolean exists( Path path, LinkOption... options); boolean notExists( Path path, LinkOption... options); boolean isReadable(Path path); boolean isWritable(Path path); boolean isExecutable(Path path); boolean isSameFile(Path path, Path path2); //continues on the next slide}
![Page 49: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/49.jpg)
DeleAng Files class Files { void delete(Path path) throws IOException; boolean deleteIfExists(Path path) throws IOException; //continues on the next slide}
May throw • NoSuchFileExcepAon • DirectoryNotEmptyExcepAon
![Page 50: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/50.jpg)
Copying Files class Files { Path copy(Path source, Path target, CopyOption... options); long copy(InputStream in, OutputStream out); long copy(InputStream in, Path target, CopyOption... options); long copy(Path source, OutputStream out); //continues on the next slide}
![Page 51: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/51.jpg)
Copying Files (2) enum StandardCopyOption implements CopyOption { REPLACE_EXISTING, COPY_ATTRIBUTES, ATOMIC_MOVE;}enum LinkOption implements CopyOption { NOFOLLOW_LINKS;}
![Page 52: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/52.jpg)
Moving Files class Files { Path move(Path source, Path target, CopyOption... options);} Supported opAons: • REPLACE_EXISTING • ATOMIC_MOVE
![Page 53: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/53.jpg)
LisAng Directories try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) { for (Path file: stream) System.out.println(file.getFileName());} catch (IOException | DirectoryIteratorException x) { System.err.println(x);}
![Page 54: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/54.jpg)
Filtering Directory LisAngs DirectoryStream<Path> stream = Files.newDirectoryStream(dir, new Filter<Path>() { boolean accept(Path path) { return Files.isDirectory(path); } } ); DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.class");
![Page 55: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/55.jpg)
Reading and WriAng Files class Files { byte[] readAllBytes(Path path); List<String> readAllLines( Path path, Charset cs); Path write( Path p, byte[] bytes, OpenOption... oo); Path write( Path path, Iterable<? extends CharSequence> lines, Charset c, OpenOption... oo);}
![Page 56: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/56.jpg)
NIO.2 FILE METADATA
![Page 57: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/57.jpg)
Basic File AZributes class Files { long size(Path path); boolean isDirectory( Path path, LinkOption... lo); boolean isRegularFile( Path path, LinkOption... lo); boolean isSymbolicLink(Path path); boolean isHidden(Path path); //to be continued}
![Page 58: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/58.jpg)
Last Modified Time FileTime time = Files.getLastModifiedTime(path);long millis = time.toMillis();long millis = System.currentTimeMillis();FileTime time = FileTime.fromMillis(millis);Files.setLastModifiedTime(path, time);
![Page 59: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/59.jpg)
File Owner UserPrincipal owner = Files.getOwner(path);String name = owner.getName();
String name = "James";UserPrincipal owner = path.getFileSystem(). getUserPrincipalLookupService(). lookupPrincipalByName(name);Files.setOwner(path, owner);}
![Page 60: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/60.jpg)
POSIX File Permissions
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_WRITE GROUP_EXECUTE
OTHERS_READ OTHERS_WRITE OTHERS_EXECUTE
![Page 61: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/61.jpg)
Geang POSIX File Permissions
Set<PosixFilePermission> perms = Files.getPosixFilePermissions(path);boolean ownerRead = perms.contains( PosixFilePermission.OWNER_READ);System.out.println(perms);System.out.println( PosixFilePermissions.toString(perms));
![Page 62: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/62.jpg)
Seang POSIX File Permissions Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>();perms.add(PosixFilePermission.OWNER_READ);Files.setPosixFilePermissions(path, perms);Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-xr-x");Files.setPosixFilePermissions(path, perms);
![Page 63: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/63.jpg)
Single File AZributes class Files { Object getAttribute(Path path, String attribute, LinkOption... options); Path setAttribute(Path path, String attribute, Object value, LinkOption... options); //to be continued}
![Page 64: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/64.jpg)
Reading File AZributes class Files { <A extends BasicFileAttributes> A readAttributes( Path path, Class<A> type, LinkOption... options); //to be continued}
![Page 65: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/65.jpg)
File AZribute Views class Files { <V extends FileAttributeView> V getFileAttributeView( Path path, Class<V> type, LinkOption... options); //that's it}
![Page 66: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/66.jpg)
Supported AZributes
FileAZributeView BasicFileAZributeView BasicFileAZributes DosFileAZributeView DosFileAZributes PosixFileAZributeView PosixFileAZributes FileOwnerAZributeView AclFileAZributeView UserDefinedFileAZributeView
![Page 67: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/67.jpg)
DOS File AZributes DosFileAttributes attr = Files.readAttributes( path, DosFileAttributes.class); interface DosFileAttributes extends BasicFileAttributes { boolean isReadOnly(); boolean isHidden(); boolean isArchive(); boolean isSystem();}
![Page 68: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/68.jpg)
Summary
• Use ProcessBuilder or zt-‐exec to start sub processes
• Handle sub process I/O correctly – Either Inherit I/O (since Java 7) – Or pump the streams (zt-‐exec, commons-‐exec)
• Remember to stop your sub process
![Page 69: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/69.jpg)
Summary (2)
• Use NIO.2 File API for – faster directory lisAngs and beZer charset support – beZer metadata – listening for changes – finding files
![Page 70: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/70.jpg)
QUESTIONS?
![Page 71: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/71.jpg)
Homework #3
Write a Java program which mirrors a directory (not recursively) 1. Take the source and target directory paths as
input arguments. 1. Fail if source directory does not exist. 2. Create the target directory if it does not exist.
![Page 72: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/72.jpg)
Homework #3 (2)
2. On startup compare directory lisAngs (use java.nio.file.DirectoryStream) and... 1. Copy new files from source to target directory. 2. Copy updated (check last modified Ames) files
from source to target directory. 3. Remove files from target directory which have
been removed from source directory. 4. Ignore sub directories in both source and target
directory.
![Page 73: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/73.jpg)
Homework #3 (3)
3. Watch source directory for changes (use java.nio.file.WatchService) and mirror them into the target directory. 1. Exit when the source directory gets removed
(watch key is invalid – tested on UNIX not Windows).
4. Don’t scan enAre directory on each event
![Page 74: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/74.jpg)
Homework #3 (4)
5. Use Java 7 File APIs (java.nio.file) instead of the old (java.io.File).
6. Print a message about each file operaAon you make.
7. Source directory must not be altered.
![Page 75: Process’I/O’and’File’NIO.2’ - ut · Agenda 1. Process’I/O’ 1. StarAng’Processes’ 2. Handling’I/O’ 3. Stopping’Processes’ 2. New’File’API(NIO.2)’ 1](https://reader034.vdocumento.com/reader034/viewer/2022042318/5f0764747e708231d41cc1f0/html5/thumbnails/75.jpg)
Homework #3 (5)
Use jf-‐skeleton in GitHub hZps://github.com/zeroturnaround/jf-‐skeleton/ Submit zipped source code via e-‐mail Address: [email protected] Deadline: next Monday, 6th of October