2017-03-22 37 views
0

我正试图加载文件,即使该文件存在,我也会收到FileNotFoundException。我尝试过在绝对路径(C:/Users/cdeck_000/AndroidStudioProjects/ProjectCaligula_Final/cert/cert.crt)和相对路径(cert/cert.crt),假设Android在项目级启动。当我运行它使用相对路径和要求的文件绝对路径我得到这个:.crt文件中的FileNotFoundException

路径:/cert/cert.crt

的代码下面的项目结构一起。

File file = new File("cert/cert.crt"); 
boolean i = file.exists(); //false 
boolean r = file.canRead(); //false 
String path = file.getAbsolutePath(); //cert/cert.crt 
String pathForApp = new File(".").getAbsolutePath(); //returns "/." 
InputStream caInput = new BufferedInputStream(new FileInputStream(file)); //error 

File Structure

任何人都可以附和,让我知道,如果我与Android的绝对/相对路径的知识是错误的或给我如何解决这个建议吗?我已经认为权限是问题,但我提出了文件权限(相当于chmod 777),并没有改变任何东西。

+0

您的IDE通常会从'build'或'build/classes'目录执行您的应用程序。因此,您的证书文件应放在'src'目录中,以便复制到类目录中。 – EJP

+0

@EJP谢谢..我把文件移动到src中,所以现在路径是../src/cert.crt ..我现在改变了从“cert.crt”加载的文件,但它仍然没有找到它。 – Chris

+0

也许我错了,您的文件驻留在您计算机的硬盘上,当您运行应用程序时,您的应用程序无法访问您计算机的硬盘。也许是因为'File file = new File(“cert/cert.crt”);'你将路径作为字符串获取,但在仿真器/设备上运行应用程序时无法访问。尝试通过将其放置在res/raw或assets文件夹中来读取该文件。 – knownUnknown

回答

2

你应该把它放到src/cert/cert.crt,这使它成为一个资源,而不是文件,所以你应该使用Class.getResourceAsStream("/cert/cert.crt")而不是new FileInputStream()

0

我有同样的问题,比我用下面的方式

  1. 解决我的问题创建assets文件夹
  2. 将文件复制到assets
  3. 阅读从assets
文件

使用以下代码从assets文件夹中读取

BufferedReader reader = null; 
     try { 
      reader = new BufferedReader(
        new InputStreamReader(getAssets().open("cert.crt"))); 

      // do reading, usually loop until end of file reading 
      String mLine; 
      while ((mLine = reader.readLine()) != null) { 
       //process line 

      } 
     } catch (IOException e) { 
      //log the exception 
     } finally { 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        //log the exception 
       } 
      } 
     }