2016-05-23 11 views
1

Ich habe ein Byte-Array, ich möchte eine Bilddatei (BMP-Datei) von Byte-Array erstellen. Ich erstelle einen Bilderordner in src (mein Pfad ist src/images/test.bmp). Mein Code ist unten, injava.io.FileNotFoundException: (Zugriff verweigert) konvertieren Byte-Array in Bilddatei

OutputStream stream = new FileOutputStream(file);

ich bekomme Fehler. Was ist mein Problem? Wie kann ich das lösen?

public static void saveImage() { 
    String s="........................"; 
    byte[] dataCustImg = Base64.decode(s.getBytes()); 

    File file = new File("/images/test.bmp"); 
    if (file.exists()) { 
     file.delete(); 
    } 
    file = new File("/images/test.bmp"); 
    file.mkdirs(); 
    try { 
     OutputStream stream = new FileOutputStream(file); 

     stream.write(dataCustImg); 
     stream.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

Fehler:

java.io.FileNotFoundException: \images\test.bmp (Access is denied) 
at java.io.FileOutputStream.open(Native Method) 
at java.io.FileOutputStream.<init>(Unknown Source) 
at java.io.FileOutputStream.<init>(Unknown Source) 
+0

Ich kann mein Problem mit diesem http: // stackoverflow lösen.com/questions/6142901/how-to-erstellen-eine-Datei-in-einem-Verzeichnis-in-Java-Link. aber jetzt möchte ich wissen wie ich meinen Code mit @EJP beantworten kann. Ich meine, wie Datei erstellen und FileoutputStream Parameter zuweisen? – Fahim

Antwort

2
File file = new File("/images/test.bmp"); 

OK.

if (file.exists()) { 
    file.delete(); 
} 

Redundant. Löschen. new FileOutputStream() erstellt eine neue Datei.

file = new File("/images/test.bmp"); 

Redundant. Löschen. Es ist bereits ein File mit diesem Namen.

file.mkdirs(); 

Das Problem ist hier. Wechseln Sie in

file.getParentFile().mkdirs(); 

Sie erstellen ein Verzeichnis genannt "/images/test.bmp", und nicht nur dafür, dass "/images" existiert. Dies führt dazu, dass new FileOutputStream() mit einer Zugriffsberechtigung fehlschlägt, da Sie ein Verzeichnis nicht mit einer Datei überschreiben können.

try { 
    OutputStream stream = new FileOutputStream(file); 

Jetzt weitermachen. Beachten Sie, dass Sie zuerst manuell das Verzeichnis "/images/test.bmp" löschen müssen.

+0

Danke für die Antwort, aber wenn ich Bilder Ordner in src Pfad habe, jetzt möchte ich test.bmp im Bilderordner speichern, ich sollte Datei mit Datei Datei = neue Datei ("/ images /") erstellen, das ist wahr? Wenn ja, wie kann in test.bmp gespeichert werden? Wie kann dies in Fileoutputstream eingestellt werden? Entschuldigung wenn mein Englisch schlecht ist – Fahim

+0

Bitte beantworten Sie meine Fragen. Vielen Dank – Fahim

+0

Sie müssen nichts anderes tun, was ich oben angegeben habe. Ich habe nichts über 'neue Datei ("/images ") gesagt. Ich weiß nicht, woher du das hast oder welchen Teil meiner Antwort du nicht verstehst. – EJP

0

Hier, wenn Sie mkdir rufen dann test.bmp als Verzeichnis nicht als Datei erstellen, so müssen Sie zuerst Verzeichnis erstellen und dann können Sie Datei erstellen . Siehe den folgenden Code.

 File dir = new File("/images/"); 
     dir.mkdirs(); 
     file = new File("/images/test.bmp"); 
     file.createNewFile(); 
+0

Der Aufruf 'createNewFile()' ist redundant. 'new FileOutputStream()' wird das tun. – EJP

+0

@EJP .. Ja .. Sie haben Recht. –

-1
public static void saveImage() { 
    String s="........................"; 
    byte[] dataCustImg = Base64.decode(s.getBytes()); 

    File file = new File("/images/test.bmp"); 
    if(!file.getParentFile().exists()) { 
     file.getParentFile().mkdirs(); 
    } 
    if(!file.exists()) { 
     try { 
     file.createNewFile(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 
    // because stream.write(dataCustImg) will overwrite the file if the file has already existed. 
    try { 
     OutputStream stream = new FileOutputStream(file); 

     stream.write(dataCustImg); 
     stream.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
+0

Danke, aber immer noch habe ich denselben Fehler :( – Fahim

+0

@Fahim, ich habe den Code oben bearbeiten und getestet. Es funktioniert in meinem Computer. Vorschlagen, File.separator anstelle von "/" und "\" zu verwenden. – kgym

+0

Die 'existiert()/createNewFile() 'Block ist eine komplette und völlige Zeitverschwendung. Das Betriebssystem muss genau das tun, wenn' new FileOutputStream() 'aufgerufen wird. Du zwingst es, alles zweimal zu tun Das Elternverzeichnis ist auch sinnlos und verschwenderisch, da 'mkdirs()' das bereits innerhalb des Betriebssystems macht. – EJP

0

Der Grund für die Ausnahme ist, dass Sie tatsächlich ein Verzeichnis mit dem Pfad /images/test.bmp

file = new File("/images/test.bmp"); 
file.mkdirs(); 

und später erstellen Sie eine Datei

OutputStream stream = new FileOutputStream(file); 

öffnen mögen Wenn Sie möchten sicherstellen, dass das Verzeichnis /images vorhanden ist, bevor Sie die Datei erstellen Sie sollten

File dir = new File("/images/"); 
dir.mkdirs(); 

Die explizite löschen, bevor Schreiben in die Datei nicht notwendig ist, da die Datei standardmäßig verwenden überschrieben würde.

Hier finden Sie ein kleines Arbeits-Snippet.

// create the directory if not exist 
File dir = new File("/images/"); 
dir.mkdirs(); 
// create a new file or overwrite an existing one 
File file = new File("/images/test.bmp"); 
try (OutputStream os = new FileOutputStream(file)) { 
    os.write((int) System.currentTimeMillis()); 
} 
Verwandte Themen