Presentazione java7

Embed Size (px)

Citation preview

  • 1. Java 7, le novit Andrea Del Bene Jug Marche [email_address]

2. Per i pi distratti...

  • Java 6 (codename Mustang) : rilasciata l'11 Dicembre 2006 ci ha fatto compagnia per quasi 5 anni in cui successo di tutto nel mondo Java. E' stata la versione pi longeva di Java.
  • Java 7 (codename Dolphin) : rilasciata il 7 Luglio 20011. Ha avuto una gestazione decisamente travagliata.Sancisce il passaggio definitivo e totale di Java alla licenza GPL .

Dolphin doveva contenere un bel po' di novit, soprattutto sul fronte del linguaggio (progettiLambdaeCoin ) e della modularizzazione (progettoJigsaw ). 3. Per i pi distratti... Alcuni fatti contingenti (passaggio a GPL, passaggio di Sun ad Oracle...)hanno subito fatto capire che lo sviluppo di Dolphin non sarebbe stato rapido... Inoltre le feature principali sono oggettivamente molto complesse e di forte impatto sul linguaggio. Impensabile realizzarle in pochi anni... E cos Oracle chiese alla community se volevano l'uovo oggi o la gallina domani:

  • Piano A:aspettare il 2012 per avere Java 7 con tutte le featurepreviste 4. Piano B:rilasciare a met 2011 Java 7 ma senza alcune delle feature previste, posticipandole di un anno e dando vita a Java 8.

5. Il piano B Il piano B stato quello vincente. Oggi abbiamo Java 7 ma senza alcune delle caratteristiche pi complesse. I progettiLambda ,Jigsaw , e parte diCoinsono stati rinviati al Java 8 previsto il prossimo anno (ma baster davvero un anno ???) Nonstante questi tagli importanto Java 7 presenta molte interessanti novit enon certo una release in tono minore ! Le novit sono circa 25 divise nei seguenti gruppi:

  • Virtual machine 6. Language 7. Core 8. Internationalization 9. I/O and Networking(probabilmente il gruppo pi ricco) 10. Security & Cryptography 11. Database Connectivity 12. Client 13. Web 14. Management

15. Le novit di Java 7 Nome Gruppo Descrizione More new I/O APIs for the Java platform (NIO.2) I/O and networking Nuove classi per rendere l' I/O asincrono , scalabile e flessibile. Small language enhancements (Project Coin) Language Possibilit di usare le stringhe nelloswitch , migliorato ilcatching di pi eccezioni , migliorata latype inference , ecc... Concurrency and collections updates Core Introduzione di un fork/join framework e miglioramento dell'attuale libreria per la concorrenza. Elliptic-curve cryptography (ECC) Security & Cryptography Evoluzione dell'attuale sistema di crittografia a chiave pubblica RSA. Offre maggior sicurezza con chiavi pi piccole. Siccome la carne al fuoco tanta inizieremo da quelle che dovrebbero essere le novit pi forti 16. Un nuovo CSS per i JavaDoc :-) 17. New I/O in Java 7 Andrea Del Bene Jug Marche [email_address] 18. La vecchia libreria di I/O La gestione dell'I/O di Java sempre stata la feature pi criticata assieme alle gestione della date (per queste tocca aspettare la 8). Quasi tutti gli utenti (specialmente i newbies) si sono chiesti almeno una volta perch scrivere tanto codice per leggere/scrivere un file: In realt l'I/Ostream-baseddi Java non affatto male, ma come molte sui aspetti manca di qualche utility che renda il suo uso pi amichevole. //legge tutte le righe di un file FileInputStream fstream= newFileInputStream ( "textfile . txt" ) ; List lines = new ArrayList(); DataInputStream in= newDataInputStream ( fstream ) ; BufferedReader br= newBufferedReader ( newInputStreamReader ( in )) ; String strLine ; while (( strLine=br . readLine ()) != null ) { lines.add ( strLine ) ; } in . close () ; 19. Jakarta Commons I/O Per far fronte a questa complessit d'uso sono nate varie librerie tra cui la pi famosa probabilmente Jakarta Commons I/O: org.apache.commons.ioClass FileUtils java.lang.Object org.apache.commons.io.FileUtils General file manipulation utilities.Facilities are provided in the following areas:

  • writing to a file 20. reading from a file 21. make a directory including parent directories 22. copying files and directories 23. deleting files and directories 24. converting to and from a URL 25. listing files and directories by filter and extension 26. comparing file content 27. file last changed date 28. calculating a checksum

29. I fantastici 4 del nuovo I/O Per migliorare l' I/O Java 7 ha introdotto due classi utilities ricalcando quanto fatto con Collections e Arrays per le rispettive entit. Sono le classiFileseFileSystems , entrambe nel packagejava.nio.file . Le classi prendono spunto da quanto fatto in Jakarta Commons I/O, proponendo addirittura metodi quasi identici comestatic List readAllLines() . Ovviamente non si sono limitati a copiare la concorrenza. Le classiFileseFileSystemsnon operano direttamente sulla classe File o sugli stream ma su due nuove entit nuove di zecca, ossial'interfacciaPathe la classe astrattaFileSystempresenti sempre nel packagejava.nio.file . FileSystemsfa da factory perFileSystem , che a sua volta instanziaPath . FileSystems FileSystem Path 30. L'interfaccia Path e la classe Paths E' un po' l'elemento centrale del nuovo I/O. Non rappresenta direttamente un file o una directory, ma piuttosto il suo pathsystem dependent.Restituisce l'istanza File associata tramitetoFile() . Permette di navigare l'albero del file system in un modo che ricorda molto la navigazione di un documento XML: path ha un parent e dei siblings e un path root (vedremo in un esempio successivamente). Paths la classe utility per istanziare dei Path usando il FileSystem locale bypassando la chiamata a FileSystems

  • Apertura di un file:

Path path=FileSystems.getDefault().getPath("logs", "access.log"); Path path=Paths.get("logs", "access.log");

  • Apertura di un file con classePaths :

31. Esempi apertura file e navigazione FS Sia getPath di FileSystem sia get di Paths accettano uno o pi parametri stringa che compongono il path:

  • Apertura di un file con percorso /home/andrea/text.txt:

Path path=Paths.get("home", "andrea", text.txt);

  • La stessa cosa la possiamo ottenere sfruttando i metodi resolve che permettono di navigare il file system partendo da un path ed innestandone altri:

Path path=Paths.get("home"); path = path.resolve(andrea); path = path.resolve(text.txt); 32. Classe Files E' la classefactotume corrisponde grossomodo a FileUtils di Jackarta Commons. Tra i metodi pi interessanti (tutti static) si segnalano:Nome Ritorna Descrizione copy Path Copia un file. Presente in diverse versioni per supportare in input il tipo Path ma anche InputStream e OutPustream.

  • create(temp)Directory 33. Create(temp)File 34. Delete 35. ...
  • Path 36. Void per delete

Supporto alla creazione/distruzione di directory e file. Delete esiste solo nella version con Path in input. Esistono versioni di creazione per lavorare nella directory temporanea di sistema readAllLines List Legge tutte le righe di un file testuale. Funzione pensata per file non troppo grandi. readAttributes BasicFileAttributes o Map Lettura degli attributi di un file 37. Lettura di tutte le righe di un file

  • L'esempio iniziale di lettura di tutte le righe di un filein Java 7 si riduce alle seguenti righe di codice:

//legge tutte le righe di un file PathfileToRead=Paths.get ( "textfile . txt" ) ; List lines=Files.readAllLines( fileToRead, UTF-8 );

  • Non devo pi gestire direttamente glistreame la loro creazione/chiusura.

38. Ciclare su una directory

  • Problema : ciclare su una dierctory stampandone il contenuto. 39. Soluzione : uso del metodo walkFileTree

public classWalkThroughtDir { public static voidmain(String[] args)throwsException{ Path start = Paths.get(System.getProperty( "user.home" )); Files.walkFileTree(start,newSimpleFileVisitor() { @ Override publicFileVisitResult visitFile(Path file, BasicFileAttributes attrs) throwsIOException{ System.out.println(file); returnFileVisitResult.CONTINUE; } @ Override publicFileVisitResult postVisitDirectory(Path dir, IOException e) throwsIOException{ System.out.println(dir); returnFileVisitResult.CONTINUE; } });} } 40. Esplorare le propriet dei file

  • Problema : recuperare i permessi POSIX di un file 41. Soluzione : Files.getPosixFilePermissions(...
  • Problema : interrogare un file sulla sua eseguibilit 42. Soluzione : Files.isExecutable(...
  • Problema : recuperare l'utenet possessore di un file 43. Soluzione : UserPrincipal Files.getOwner(...
  • Problema : ... 44. Soluzione : ...

45. File change notification

  • Problema : monitorare i cambiamenti e le attivit che avvengono in una directory. 46. Soluzione : uso del metodo walkFileTree

public static voidmain(String[] args)throwsException { WatchService watcher=FileSystems.getDefault().newWatchService(); Path dir = Paths.get(System.getProperty( "user.home" )); WatchKey key = dir.register(watcher,StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY); for(;;) { // wait for key to be signalled key = watcher.take(); // process events for(WatchEvent event: key.pollEvents()) { System.out.println(event.context()); } // reset key key.reset(); } } 47. Asynchronous I/O

  • L'I/O asincrono prevede la possibilit di scrivere/leggere su file o su stream generali di I/O (come le socket) in maniea asincrona.
  • E' una caratteristica a met strada tra I/O e concorrenza....
  • Con questo tipo di I/O i nostri programmi non sono pi costretti ad aspettare la fine dei cicli di I/O per proseguire con l'esecuzione.
  • Questa feature stata costruita come estensione naturale degli strumenti di concorrenza aggiunti con Java 5: 48. classi Future, ExecutorService, ecc...
  • Purtroppo non si trovano ancora esempi di codice completi di questa feature :-(

49. Asynchronous I/O

  • ...per possiamo riassumere lo schema d'uso di questa feature con le socket.
  • Creare un pool di thread, sottoclasse diExecutorService 50. Creare un gruppoAsynchronousChannelGroup : AsynchronousChannelGroup group = AsynchronousChannelGroup 51. .Ottenere un canale asincrono: AsynchronousSocketChannel channel = AsynchronousSocketChannel.open(group); 52. Leggere/scrivere sul canale Future result = channel.write(buf, position);

53. Concurrency and collections updates Andrea Del Bene Jug Marche [email_address] 54. Il modello Fork/Join Nel campo del calcolo distribuito il modello Fork/Join mira a risolvere problemi complessi dividendolo in micro-problemi pi semplici da eseguire in parallelo. Il problema ed i suoi sottoproblemi sono risolti da una singola unit esecutiva ( Task ) che rispetta il seguente algoritmo (funzione): Result solve(Problem problem) { if (problem is small) directly solve problem else { -split problem into independent parts -fork new subtasks to solve each part -join all subtasks -compose result from subresults } } 55. Implementare Fork/Join in Java Implementare il modello Fork/Join non cos semplice come sembra... Se ad un task si fa corrispondere un Thread Java si otterrebbe un'implementazione molto pesante e l'overhead supererebbe i benefici. Dug Lea un professore dell'universit di New York, luminare della programmazione parallela. Ha scritto una libreria per introdurre il modello Fork/Join in Java. Quella libreria diventata la JSR 166y, rilasciata in Java 7 La libreria si occupa interamente della creazione dei task e della loro sincornizzazione. 56. Somma di un array di interi 1/2 public classSolverextends RecursiveAction{ private int [] list; public longresult; publicSolver( int [] array) { this .list = array; } @ Override protected voidcompute() { if(list.length == 1) { result = list[0]; }else{ intmidpoint = list.length / 2; int [] l1 = Arrays.copyOfRange(list, 0, midpoint); int [] l2 = Arrays.copyOfRange(list, midpoint, list.length); Solver s1 =newSolver(l1); Solver s2 =newSolver(l2); invokeAll(s1, s2); result = s1.result + s2.result; } } public longgetResult(){ return result; } } Vediamo un esempio di applicazione del modello Fork/Join. Come caso d'uso consideriamo la somma degli elementi interi di un array. 57. Somma di un array di interi2/2 public static voidmain(String[ ]args ){ // Check the number of available processors intnThreads = Runtime.getRuntime().availableProcessors(); System.out . println( nThreads ); int [] list =new int [2000000]; Random generator =newRandom(19580427); for ( inti = 0;i < list.length ; i ++ ) { list[i] = generator.nextInt(500000); } Solver mfj =newSolver(list); ForkJoinPool pool =new ForkJoinPool(nThreads); pool . invoke( mfj ); longresult = mfj.getResult(); System.out .println ( "Done. Result: "+ result); } 58. Progetto Coin Andrea Del Bene Jug Marche [email_address] 59. Strings in switch public classTestStringsInSwitch { public voidtest() { finalString str ="foo" ; switch(str) { case "foo" : System.out.println( "mooh" ); break ; case "bar" : System.out.println( "miau" ); break ; default : break ; } } public static voidmain( finalString[] args) { newTestStringsInSwitch().test(); } } 60. Diamond operator importjava.util.ArrayList; importjava.util.List; public classTestDiamondOperator { public voidtest() { finalList list =newArrayList (); list.add( "Foo" ); System.out.println(list); } public static voidmain( finalString[] args) { newTestDiamondOperator().test(); } } E' stata migliorata latype inferenceaggiungendo l'operatore diamondutile quando si istanziano le collection 61. Multy catch and rethrow public classTestMultiCatchAndRethrow { classExAextendsException { } classExBextendsException { } public voidtestMultiCatch() { final inta = 0;try{ if(a == 0){ throw newExA(); } if(a == 1){ throw newExB(); } }catch( ExA|ExB ex ) { System.out.println(ex.getClass() +" was thrown and caught" ); } } public voidtestReThrow()throwsExB { final inta = 0; try{ if(a == 0) { throw newExA(); } if(a == 1) { throw newExB(); } }catch( finalExA exa) { System.out.println( "Exa was caught" ); }catch( finalException ex) { System.out.println(ex.getClass() +" was thrown, caught and rethrown" ); throw ex; } } } 62. Automatic resource management public classTestAutomaticResourceManagement { public voidtest() { try( finalBufferedReader br =newBufferedReader( newFileReader( "./TestAutomaticResourceManagement.java" ))) { String line; while((line = br.readLine()) !=null ) { System.out.println(line); } }catch( finalIOException e) { } } public static voidmain( finalString[] args) { newTestAutomaticResourceManagement().test(); } } 63. Integer litterals public classTestIntegerLiterals { public voidtest() { final intlarge = 1_000_000; System.out.println(large); final intbinary = 0b1011; System.out.println(binary); } public static voidmain( finalString[] args) { newTestIntegerLiterals().test(); } } Si tratta di un po' di zucchero sintattico per esprimere pi comodamente nel codice dei valori numerico/binari. 64. Crittografia a curva ellittica Andrea Del Bene Jug Marche [email_address] 65. I cifrari a chiave pubblica.

  • RSA il cifrario a chiave pubblica correntemente pi utilizzato, ma non l'unico cifrario di questo tipo esistente.
  • Un limite di RSA la grandezza della sue chiavi. Per avere un minimo di sicurezza occorre una chiave di 1024 bit, ma gi se ne sconsiglia l'uso in favore dei 2048 bit. Con i cifrari simmetrici la chiavi di solito lunga 128 bit o 256 bit.
  • TUTTIi cifrari a chiave pubblica noti si basano su operazioni matematiche semplici daeseguirema difficili daricostruire . 66. Per difficile si intende che teoricamente possibile ricostruire e clonare le chiavi private partendo da quelle pubbliche, ma la mole di calcoli scoraggia chiunque dal farlo

67. Le operazioni difficili dei cifrari

  • L'operazionedifficile da ricostruire che sta alla base di RSA la scomposizione dei numeri interi in fattori primi
  • In RSA ci si scambia un numerocche il prodotto di due numeri primip1ep2moooolto grandi: 68. c = p1 * p2 69. Questo prodotto facile da eseguire noti p1 e p2, ma quasi impossibile ricavare p1 e p2 noto solo c!
  • In un cifrario a curva ellittica come operazione difficile da ricostruiresi usa il logaritmo discreto. Dati i numeria, b, xep(primo) si esegue la seguente operazione: 70. a bmod p = x 71. Anche in questo caso l'operazione semplice noti i 4 elementi, ma se x ignota ricavarla richiede una capacit computazionale fantascientifica.

72. Cuva ellittica vs RSA

  • Il vantaggio dei cifrari a curva ellittica (ECC) su RSA la dimensione della chiave. La stessa sicurezza che RSA ha con 2048 bit di chiave ECC la fornisce con soli 192 bit
  • Java 7 fornisce un'implementazione portabile di ECC. La classe centrale EllipticCurve nel package java.security.spec.

73. Support for Dynamically Typed Languages in the JVM Andrea Del Bene Jug Marche [email_address] 74. Linguaggi dinamici su JVM

  • Questa feature si pone come obbiettivo l'integrazione di altri linguaggi diversi da Java sulla JVM
  • La specifica JSR 277 si poneva un obbiettivo simile, ma considerava solol'interpretazionedi linguaggi, non lacompilazione .
  • Per questa feature stato quindi cambiato il bytecode Java tenendo conto delle esigenze dei linguaggi con tipi dinamici, dovendo ovviamente preservare la retrocompatibilit
  • Non sono purtroppo presenti esempi di codice al riguardo :-(
  • Avr comunque un forte impatto sui linguaggi non-Java presenti sulla JVM.

75. Grazie ! Andrea Del Bene JUG Marche - www.jugancona.it