2016-05-23 2 views
1

J'ai un tableau d'octets, je veux créer un fichier image (fichier bmp) d'un tableau d'octets. Je crée un dossier images dans src (mon chemin est src/images/test.bmp). mon code est en dessous, enjava.io.FileNotFoundException: (accès refusé) convertir un tableau d'octets en fichier image

OutputStream stream = new FileOutputStream(file);

Je reçois une erreur. quel est mon problème? Comment puis-je resoudre ceci?

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(); 
    } 

} 

Erreur:

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

Je peux résoudre mon problème avec ce http: // stackoverflow.com/questions/6142901/comment-créer-un-fichier-dans-un-répertoire-dans-java lien. mais maintenant je veux savoir comment résoudre mon code avec @EJP réponse. Je veux dire comment créer un fichier et attribuer au paramètre fileoutputStream? – Fahim

Répondre

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

OK.

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

Redondant. Retirer. new FileOutputStream() va créer un nouveau fichier.

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

Redondant. Retirer. C'est déjà un File avec ce nom.

file.mkdirs(); 

Le problème est ici. Changer pour

file.getParentFile().mkdirs(); 

Vous créez un appelé "/images/test.bmp" plutôt répertoire que simplement veiller à ce que "/images" existe. Cela entraînera l'échec de new FileOutputStream() avec une autorisation d'accès, car vous ne pouvez pas écraser un répertoire avec un fichier.

try { 
    OutputStream stream = new FileOutputStream(file); 

Continuez maintenant. Notez que vous devrez d'abord supprimer manuellement le répertoire "/images/test.bmp".

+0

Merci pour la réponse, mais quand j'ai dossier d'images dans le chemin src, maintenant je veux enregistrer test.bmp dans le dossier images, je devrais créer un fichier avec Fichier fichier = nouveau Fichier ("/ images /"), c'est vrai? si oui, comment pouvez-vous enregistrer dans test.bmp? Comment pouvez-vous définir cela dans le fichier de sortie? Désolé si mon anglais est mauvais – Fahim

+0

s'il vous plaît répondre à mes questions. Merci beaucoup – Fahim

+0

Vous n'avez pas besoin de faire autre chose que ce que j'ai indiqué ci-dessus. Je n'ai rien dit à propos de 'new File ("/images ")'. Je ne sais pas d'où vous venez, ou quelle partie de ma réponse vous ne comprenez pas. – EJP

0

ici quand vous appelez mkdir alors il crée test.bmp comme un répertoire non comme un fichier, vous devez d'abord créer un répertoire et vous pouvez créer un fichier . voir le code ci-dessous.

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

L'appel 'createNewFile()' est redondant. 'new FileOutputStream()' le fera. – EJP

+0

@EJP .. Oui .. Vous avez raison. –

-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

Merci, mais j'ai toujours la même erreur :( – Fahim

+0

@Fahim, j'ai modifié le code ci-dessus et l'a testé.Il fonctionne dans mon ordinateur.proposer d'utiliser File.separator au lieu de "/" et "\". – kgym

+0

Le 'existe()/createNewFile() 'est une perte de temps complète et totale, le système d'exploitation doit faire exactement cela quand' new FileOutputStream() 'est appelé, vous le forcez à le faire deux fois. le répertoire parent est inutile et inutile, comme 'mkdirs()' le fait déjà dans le système d'exploitation – EJP

0

La raison de l'exception est que vous créez en fait un répertoire avec le chemin /images/test.bmp

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

et plus tard vous voulez ouvrir un fichier

OutputStream stream = new FileOutputStream(file); 

Si vous voulez vous assurer que le répertoire /images existe avant de créer le fichier vous devez utiliser

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

explicite supprimer avant d'écrire sur le fichier n'est pas nécessaire, que le fichier sera écrasé par défaut.

Trouvez ci-dessous un petit extrait de travail.

// 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()); 
}