2014-01-13 79 views
0

尝试将图像保存到外部存储并获取上述例外。读过周围,尝试了不同的方法(在代码中注释掉),但一无所获工作:未找到文件例外将图像保存到外部存储

java.io.FileNotFoundException: /storage/emulated/0/Pictures/saved_images/image0.jpg: open failed: ENOENT (No such file or directory) 

,代码:, 咨询

// check if ext storage is available to write 
     String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      // media available 
      canSaveToExternalSD = true; 
      // String root = 
      // Environment.getExternalStorageDirectory().toString(); 
      /* 
      * String root = Environment.getExternalStoragePublicDirectory 
      * (Environment.DIRECTORY_PICTURES).toString() ; 
      */ 
      // String root = 
      // Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 
      // + File.separator + diveAlbum; 

      String root = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES).toString() 
        + "/saved_images"; 
      File myDir = new File(root); 
      myDir.mkdirs(); 
      if (!myDir.exists()) { 
       makeToast("Directory does not exists: " + myDir); 
       Log.d(TAG, "Dir does not exist!"); 
      } 
      String photoName = "image" + diveNum + ".jpg"; 
      File file = new File(root + "/" + photoName); 
      // File file = new File(myDir,photoName); 
      if (file.exists()) { 
       file.delete(); 
       makeToast("Name already exists!"); 
      } 

      try { 
       FileOutputStream out = new FileOutputStream(file); 
       image.compress(Bitmap.CompressFormat.JPEG, 90, out);// compress 
                    // image fro 
                    // output 
       out.flush(); 
       out.close(); 

创建FileOutputStream中时引发的异常OS赞赏。 夏兰

回答

0

您可以修改这个代码,以您的需求:

final public class FileHandler { 
    final private File folderCreatedDir; 
    final private String folderToCreate; 
    final private Map<String, String> mapNameToContents; 

    public FileHandler(File baseDirectory, String folderToCreate, 
      Map<String, String> mapNameToContents) { 
     this.folderCreatedDir = new File(baseDirectory + File.separator 
       + folderToCreate); 
     this.folderToCreate = folderToCreate; 
     this.mapNameToContents = mapNameToContents; 
    } 

    private final void createFolder() { 
     folderCreatedDir.mkdir(); 

    } 

    private final void writeMapContents() throws IOException { 
     Set<String> keySet = mapNameToContents.keySet(); 
     for (String key : keySet) { 
      writeContents(key, mapNameToContents.get(key)); 
     } 

    } 

    private final void writeContents(String key, String contents) 
      throws IOException { 
     File file = new File(folderCreatedDir + File.separator + key); 
     FileOutputStream fileOutput = new FileOutputStream(file); 
     if (file.canWrite()) { 
      fileOutput.write(contents.getBytes()); 
      fileOutput.close(); 
     } 
    } 

    public void writeAllContents() throws IOException { 
     createFolder(); 
     writeMapContents(); 
    } 

    public StringBuilder getContents(String key) throws IOException { 
     BufferedReader rd = new BufferedReader(new FileReader(folderCreatedDir 
       + File.separator + key)); 
     String line = ""; 
     StringBuilder htmlBuilder = new StringBuilder(); 
     long bytesRead = 0; 
     while ((line = rd.readLine()) != null) { 
      htmlBuilder.append(line); 
      bytesRead = bytesRead + line.getBytes().length + 2; 
     } 
     return htmlBuilder; 
    } 
} 

如果你使用的方法,它可以帮助你的代码分解成更小的碎片。另外我建议让它更面向对象,它会帮助你更好地形象化代码。

+0

谢谢,但你能看到我的代码有什么问题吗?我遵循devolper安卓网站的指南 – dancingbush

1

明白了。 已将READ_EXTERNAL_STORAGE添加到清单而不是WRITE_EXTERNAL_STORAGE权限,但无法修复2天的头部划痕。