JavascriptProva

martedì 15 novembre 2016

Copiare un file da una parte all'altra del dispositivo.

Ho avuto non poche difficoltà nel copiare un file da una parte all'altra della memoria del cellulare.
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/0
Ora 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/.SPenSDK30
Okay...

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