2016-03-23 3 views
0

Hier ist mein Code-Schnipsel:Guava-Funktion toByteArray() gibt null zurück?

File file = new File("encryptedImageFileName"); 
byte[] encryptedBytes = null; 
try 
{ 
    encryptedBytes = Files.toByteArray(file); 
} 
catch (Exception e) 
{} 

Hier ist ein Bild der beiden Variablen encryptedBytes und Datei, nachdem ich mit dem Debugger,

http://i.stack.imgur.com/5nJgs.png

Ich bin fast sicher, trat durch dass alle Sachen unter Datei bedeutet, dass es tatsächlich die Datei gefunden, aber wie Sie sehen können encryptedByt es ist null, also Files.toByteArray (Datei) hat nicht funktioniert ... Warum ist das passiert?

********************************** EDIT *********** *********************

Hier ist mein Code, wo ich versuche, die Byte-Array zu schreiben, ist da etwas nicht in Ordnung?

FileOutputStream outputStream; 
try 
{ 
    outputStream = openFileOutput("encryptedImageFileName", Context.MODE_PRIVATE); 
    outputStream.write(encodedByteArrayImage); 
    outputStream.close(); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

Dies wirft

java.io.FileNotFoundException: encryptedImageFileName: open failed: ENOENT (No such file or directory) 

Der Debugger sagt, dass encodedByteArrayImage eine (nicht-null) Wert hat.

+2

Louis liefert Details in seiner Antwort, aber es ist erwähnenswert: * Ausnahmen nicht ignorieren *. Der Compiler hat Ihnen im Wesentlichen gesagt, dass die I/O-Operation fehlschlagen kann und Sie in einen try/catch setzen, damit Sie diese Möglichkeit nutzen können. Wenn der Code nicht funktioniert hat, sollte eine Ausnahme einer Ihrer ersten Debugging-Gedanken sein. (In der Tat, mit einigem Einloggen des Ausnahmeblocks, hätte es überhaupt kein Geheimnis gegeben). Nur ein freundlicher Tipp für die Zukunft ... –

+0

Welche Ausnahme wird geworfen? – EJP

+0

java.io.FileNotFoundException: encryptedImageFileName: Öffnen fehlgeschlagen: ENOENT (Keine solche Datei oder Verzeichnis) –

Antwort

0

ich es gelöst,

Hier ist der Code zu schreiben:

try 
    { 
     File file = new File(this.getFilesDir().getPath() + "encryptedImageFileName.txt"); 
     ByteSink sink = Files.asByteSink(file); 
     sink.write(encryptedBytes); 
    } 
catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

hier ist der Code zu lesen:

encryptedBytes = null; 
try 
    { 
     File file = new File(this.getFilesDir().getPath() + "encryptedImageFileName.txt"); 
     ByteSource source = Files.asByteSource(file); 
     encryptedBytes= source.read(); 
    } 
catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

Nach der Verwendung von ByteSink statt, was ich vorher gemacht habe zu schreiben Ich habe einen Nur-Lese-Fehler bekommen, weil ich versucht habe, in das root-Verzeichnis zu schreiben, das fehlte mir:

this.getFilesDir().getPath() + 

vor dem Dateinamen (auch eine .txt am Ende des Namens hinzugefügt).

3

Nein. Sie können eine new File erstellen, die nicht wirklich auf dem Dateisystem existiert und nicht gut geöffnet werden kann, und dann erhalten Sie eine IOException, wenn Sie versuchen, davon zu lesen, die aussieht, was hier passiert.

Versuchen Sie mit e.printStackTrace() herauszufinden, welche Ausnahme geworfen wird und warum.

+0

Danke. Warum, wenn ich die App normal ausführe, bekomme ich nur einen Fehler (und eine Stack-Trace), wenn es versucht, das Null-Byte-Array zu verwenden, nicht innerhalb des Catch-Blocks? Ich musste Schritt für Schritt debuggen, um die ausgelöste Ausnahme zu sehen, funktioniert das so, wie Ausnahmen funktionieren? –

+0

Können Sie mir sagen, ob es hier ein Problem gibt, wo ich versuche, das Byte-Array zu schreiben? Screenshot (Code konnte in einem Kommentar nicht hinzugefügt werden): http://i.imgur.com/B0WjxcJ.png –

+0

Wenn Sie die Ausnahme abfangen, dann wird die Ausnahme behandelt. Ich kann Ihnen jedoch keine Probleme mit Ihrem speziellen Debugger mitteilen. –