簡體   English   中英

如何修復Android-Studio中Uri-Path的“FileNotFoundException”(沒有這樣的文件或目錄)錯誤?

[英]How to fix my “FileNotFoundException”(No such file or directory) error with Uri-Path in Android-Studio?

我正在編寫一個應用程序來保存文件(圖片)作為csv文件中的列給出的特定名稱。 用戶必須首先使用filebrowser選擇csv,然后將文件復制到我的Dir-Data目錄。

一切都很好,但似乎我得到的路徑File src Object不適用於操作。 我希望這里的錯誤顯而易見(第2個Code-Box)並且如果它顯而易見或者容易避免,請提前預訂,這是我的第一個Android項目。

我已經嘗試使用不同的復制函數和不同的參數類型,並嘗試其他格式,如uri.toString()給出的字符串。

// CSV打開程序

    public void performFileSearch() {

        // ACTION_OPEN_DOCUMENT is the intent to choose a file via the system's file
        // browser.
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);

        // Filter to only show results that can be "opened"
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // Filter to show only  .csv  using the image MIME data type.
        // For all it would be "*/*".
        intent.setType("text/comma-separated-values");

        startActivityForResult(intent, READ_REQUEST_CODE);

    }

//創建路徑

@Override

public void onActivityResult(int requestCode, int resultCode,
                                 Intent resultData) {

        if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK)
        {

            if (resultData != null) {
                Uri path = resultData.getData();
                stringUri = path.getPath();
                File src = new File(stringUri);
                File destination = new File(getFilesDir().getPath());

                try {
                    copyDirectoryOneLocationToAnotherLocation(src,destination);
                }
                catch(IOException e) {
                    e.printStackTrace();
                    System.out.print("error in upload");
                }

                Toast.makeText(MainActivity.this, "Path: "+stringUri , Toast.LENGTH_SHORT).show();

            }


        }
    }

//來自StackOverflow的復制操作

    public static void copyDirectoryOneLocationToAnotherLocation(File sourceLocation, File targetLocation)
            throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i = 0; i < sourceLocation.listFiles().length; i++) {

                copyDirectoryOneLocationToAnotherLocation(new File(sourceLocation, children[i]),
                        new File(targetLocation, children[i]));
            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);

            OutputStream out = new FileOutputStream(targetLocation);

            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        }

    }

我希望將選擇的文件復制到我的data / data / ...目錄中,以便稍后在App中使用。

但是:我從objets獲得的路徑對我不起作用

Thx @Mike M.,使用getContentResolver()的提示在嘗試之后讓我感受到了anwser。

最后使用其他復制功能並重新編寫onActivityResult();

public void onActivityResult(int requestCode, int resultCode,
                             Intent resultData) {

    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK)
    {

        if (resultData != null) {
            try {
                String destination = getFilesDir().getPath();
                InputStream src = getContentResolver().openInputStream(resultData.getData()); // use the uri to create an inputStream
                try {

                    convertInputStreamToFile(src, destination);
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.print("error in upload");
                }
            } catch (FileNotFoundException ex) {
                }
            String destination = getFilesDir().getPath();
            Toast.makeText(MainActivity.this, "Success!: CSV-File copyed to : " +destination  , Toast.LENGTH_SHORT).show();
        }
    }


}
public static void convertInputStreamToFile(InputStream is, String destination) throws IOException
{
    OutputStream outputStream = null;
    try
    {
        File file = new File(destination + "/Student.csv");
        outputStream = new FileOutputStream(file);

        int read = 0;
        byte[] bytes = new byte[1024];
        while ((read = is.read(bytes)) != -1) {
            outputStream.write(bytes, 0, read);
        }
    }
    finally
    {
        if(outputStream != null)
        {
            outputStream.close();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM