Alla fine ci sono riuscito.
Credo di padroneggiare abbastanza le tecniche per la creazione di un file, ma ho avuto difficoltà nella copia mediante FileInputStream e FileOutputStream
Ora riprovo a trasferirmi un file dalla cartella DCIM/Camera alla cartella DCIM/Screenshots.
Il file è casa.jpg.
Ottengo l'accesso all'external storage.
File sd= Environment.getExternalStorageDirectory();Voglio sapere qual è il Path di questo file. Come faccio?
Provo:
File sd= Environment.getExternalStorageDirectory(); System.out.println("Path: "+Environment.getExternalStorageDirectory().getAbsolutePath());
11-15 17:44:47.621 13976-13976/? I/System.out: Path: /storage/emulated/0Ora voglio i nomi di tutti i sottofiles e le sottocartelle di questo External Storage.
File sd= Environment.getExternalStorageDirectory(); System.out.println("Path: "+Environment.getExternalStorageDirectory().getAbsolutePath()); for(File f : sd.listFiles()){ System.out.println(f.toString()); }Proviamo:
11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Samsung 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Android 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/DCIM 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Music 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Podcasts 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Ringtones 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Alarms 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Notifications 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Pictures 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Movies 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Download 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Playlists 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/WhatsApp 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/.aide 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/AppProjects 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/docs 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Voice Recorder 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/com.facebook.katana 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/runtastic 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/com.facebook.orca 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/.facebook_cache 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/MBSTPH 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/MBSTGO 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/VIRAL 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/LazyList 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/Tencent 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/pacer_steps_chart.jpg 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/JavaScript 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/.mrnom 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/adb 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/CallRecordings 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/.SMT 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/.Studio 11-15 17:48:49.941 15616-15616/? I/System.out: /storage/emulated/0/.SPenSDK30Okay...
Ora voglio scendere in DCIM/Camera/casa.jpg.
DCIM è una sottocartella dell'External Storage.
Come faccio a ottenere un file?
File sd= Environment.getExternalStorageDirectory(); File src=new File(sd,"//DCIM//Camera//casa.jpg"); File dst=new File(sd,"//DCIM//Screenshots//casa.jpg");Ecco i files corrispondenti all'immagine originale e alla copia che voglio creare.
Ora devo usare gli Stream...
E qua c'è tutto l'apparato.
File sd= Environment.getExternalStorageDirectory(); File src=new File(sd,"//DCIM//Camera//casa.jpg"); File dst=new File(sd,"//DCIM//Screenshots//casa.jpg"); try { FileInputStream in=new FileInputStream(src); FileOutputStream out=new FileOutputStream(dst); byte[] buffer=new byte[1024]; int len; while((len=in.read(buffer))!=-1) { out.write(buffer,0,len); } in.close(); out.flush(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }Intanto vediamo se funziona...
Sì, è riuscito! In Screenshots mi trovo il file casa.jpg che funziona.
Ora vediamo come "funziona".
Il metodo read(buffer) di FileInputStream legge dei bytes dal file in un buffer di bytes..
Restituisce un int che rappresenta il numero di bytes letti, mentre se non ci sono più bytes da leggere dal file al buffer, restituisce -1.
Ecco perché
while((len=in.read(buffer))!=-1) { out.write(buffer,0,len); }...finché len, che è uguale al numero di bytes letto nel buffer, è diverso da -1, va scritto nel FileOutputStream quel numero di bytes preso dal buffer.
E forse, finalmente lo abbiamo capito.
Nessun commento:
Posta un commento