从内部存储复制文件到外部存储

3
我正在尝试使用Adobe Reader阅读从服务器下载的PDF文件,但问题是当我将其存储在内部存储器中时,其他应用程序无法读取该文件。现在我想知道如何将此文件复制到外部存储器(/sdcard/),以便PDF查看器可以查看。由于安全原因,我将文件存储在内部存储器中,并在之后删除外部存储器中的文件。我的问题是,如何复制保存在内部存储器中的文件,而不使用raw或assets将其放入inputstream。
    InputStream myInput = getResources().openRawResource(R.raw.p13);

        FileOutputStream fos = openFileOutput("sample", Context.MODE_PRIVATE);

        // transfer bytes from the input file to the output file
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0)
        {
            fos.write(buffer, 0, length);
        }
        // Close the streams
        fos.flush();
        fos.close();
        myInput.close();

1
请看我的回答。希望能对你有所帮助。如果不行,请告诉我。 - Shreyash Mahajan
2个回答

3

你把PDF文件存储在哪个路径下?

以下是从Android Assets获取文件并将其复制到特定SD卡位置的方法。

我首先会检查PDF文件是否已经存在于所需路径中。

 File file1 = new File("/sdcard/SampleProjectApp/WindsorONE_Mobile_Molding.pdf");
    File file2 = new File("/sdcard/SampleProjectApp/WindsorONE_Mobile_PK.pdf");
    File file3 = new File("/sdcard/SampleProjectApp/Alone.mp4");

    if(!((file1.exists())) || !((file2.exists())) || !((file3.exists()))) {
        ArrayList<String> files = new ArrayList<String>();
        files.add("WindsorONE_Mobile_Molding.pdf");         
        files.add("WindsorONE_Mobile_PK.pdf"); 
        files.add("Alone.mp4");
        new myAsyncTask().execute(files);
    }

现在,如果文件不存在于该位置,则会执行myAsyncTask将文件从资产复制到SdCard。
 // AsyncTass for the Progress Dialog and to do Background Process
private class myAsyncTask extends AsyncTask<ArrayList<String>, Void, Void> {         
    ArrayList<String> files;         
    ProgressDialog dialog;         
    @Override         
    protected void onPreExecute() {             
        dialog = ProgressDialog.show(ListSample.this, "W1 SALES (beta)", "Loading...");         
    }         
    @Override         
    protected Void doInBackground(ArrayList<String>... params) {              
        files = params[0];             
        for (int i = 0; i < files.size(); i++) {                 
            copyFileFromAssetsToSDCard(files.get(i));                
        }             return null;         
    }         
    @Override         
    protected void onPostExecute(Void result) {             
        dialog.dismiss();         
    }      
} 



 // Function to copy file from Assets to the SDCard
public void copyFileFromAssetsToSDCard(String fileFromAssets){
    AssetManager is = this.getAssets();
    InputStream fis;
    try {

        fis = is.open(fileFromAssets);
        FileOutputStream fos;
        if (!APP_FILE_PATH.exists()) {
            APP_FILE_PATH.mkdirs();
        }
        fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/SampleProjectApp", fileFromAssets));
        byte[] b = new byte[8];
        int i;
        while ((i = fis.read(b)) != -1) {
            fos.write(b, 0, i);
        }
        fos.flush();
        fos.close();
        fis.close();
    } 
    catch (IOException e1) {
        e1.printStackTrace();
    }
}

更新

您需要执行以下操作:

SampleProjectApp/WindsorONE_Mobile_Molding.pdf替换为

Android/data/com.project.projectname/cache/YOUR_PDF_FILE.pdf

希望这样说得通。

更新2

下面的代码是从一个路径复制文件到另一个路径。您只需传递文件存在的路径和要复制到的路径即可。

代码:

public static boolean copyFile(String from, String to) {
try {
    int bytesum = 0;
    int byteread = 0;
    File oldfile = new File(from);
    if (oldfile.exists()) {
        InputStream inStream = new FileInputStream(from);
        FileOutputStream fs = new FileOutputStream(to);
        byte[] buffer = new byte[1444];
        while ((byteread = inStream.read(buffer)) != -1) {
            bytesum += byteread;
            fs.write(buffer, 0, byteread);
        }
        inStream.close();
        fs.close();
    }
    return true;
} catch (Exception e) {
    return false;
}

}


我正在尝试将PDF文件存储在sdcard/Android/data/com.project.projectname/cache中,我正在尝试将其存储在缓存中。 - user1802285
我对_copyFileFromAssetsToSDCard_函数有一个问题,因为我是Android新手。AssetManager是否从您的应用程序包res/raw或Android内部存储**data/data/com.myproject.projectname/files/**获取文件? 我在此方法中遇到了_FileNotFoundException:myfile.pdf_问题。 - user1802285
@GerjoBronosa:我的朋友,你必须将文件放在资产文件夹中。AssetManager无法从res/raw获取文件。 - Shreyash Mahajan
好的。但我的问题是复制保存在内部存储(data/data/com.example.project/files/file.pdf)中的文件,而不是从资产或原始文件夹中编写文件。 - user1802285
好的,您只需要编写代码以从所需路径获取文件。请等待我更新答案。 - Shreyash Mahajan
@GerjoBronosa:随时欢迎。享受编程的乐趣... :) - Shreyash Mahajan

1

你可以使用这种方法

boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

if(isSDPresent)
{
    InputStream in = null;
    OutputStream out = null;
      in = //Place your file in the inputstream
      out = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + filename);
      byte[] buffer = new byte[1024];
      int read;
      while((read = in.read(buffer)) != -1){
        out.write(buffer, 0, read);
      }
      in.close();
      in = null;
      out.flush();
      out.close();
      out = null;
}
else
{
Toast.makeText(getApplicationContext(), "SD Card not present", Toast.LENGTH_LONG).show();
}

谢谢您快速的回复。我遇到了FileNotFoundException(只读文件系统)。我会添加我的代码以展示我如何在内部存储中编写文件。 - user1802285
我正在从内部存储 data/data/packagename/files/myfile.pdf 获取文件。 - user1802285
使用以下方式:InputStream in = new FileInputStream("data/data/packagename/files/myfile.pdf")InputStream in = new FileInputStream(Environment.getDataDirectory()+"/files/myfile.pdf") - Girish Nair
我仍然收到FileNotFoundException,但现在它是No such File or directory。我不认为这是访问内部目录Environment.getDataDirectory()的方法。 - user1802285
你是否在Eclipse中使用DDMS透视图来检查该文件是否存在(连接到adb并使用chmod 777查看内部文件)? - Girish Nair
该文件位于目录中,权限为 **-rw-rw-----**。 - user1802285

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接