java.lang.IllegalArgumentException: chứa dấu phân tách đường dẫn


79

Tôi có tên tệp trong mã của mình là:

String NAME_OF_FILE="//sdcard//imageq.png";
FileInputStream fis =this.openFileInput(NAME_OF_FILE); // 2nd line

Tôi gặp lỗi ở dòng thứ 2:

05-11 16: 49: 06.355: ERROR / AndroidRuntime (4570): Gây ra bởi: java.lang.IllegalArgumentException: Tệp //sdcard//imageq.png chứa dấu phân cách đường dẫn

Tôi cũng đã thử định dạng này:

String NAME_OF_FILE="/sdcard/imageq.png";

Câu trả lời:


58

Phương pháp này mở một tệp trong vùng dữ liệu riêng tư của ứng dụng. Bạn không thể mở bất kỳ tệp nào trong các thư mục con trong khu vực này hoặc từ các khu vực hoàn toàn khác bằng phương pháp này. Vì vậy, hãy sử dụng hàm tạo của FileInputStreamtrực tiếp để truyền đường dẫn với một thư mục trong đó.


46
Vui lòng cung cấp một số ví dụ cho điều này
Anand Savjani

11
Câu trả lời của bạn là khó hiểu; OP đang sử dụng một FileInputStream
FracturedRetina

7
cung cấp ví dụ
Lutaaya Huzaifah Idris

2
Vui lòng giải thích câu trả lời.
IgorGanapolsky

1
đây là câu trả lời sai - vui lòng xem câu trả lời bên dưới
bharal

81

Giải pháp là:

FileInputStream fis = new FileInputStream (new File(NAME_OF_FILE));  // 2nd line

Phương thức openFileInput không chấp nhận dấu phân cách đường dẫn.

Đừng quên

fis.close();

cuối cùng.


Cho rằng một người có thể sử dụng FileInputStreamnhư thế này, tại sao lại chọn sử dụng openFileInput?
Al Lelopath

1
Đây phải là câu trả lời được đánh dấu chính xác vì nó cung cấp một ví dụ rõ ràng.
marienke,

Các giải pháp đơn giản là giải pháp tốt nhất. Cảm ơn.
Nguy hiểm

30

openFileInput()không chấp nhận đường dẫn, chỉ một tên tệp nếu bạn muốn truy cập một đường dẫn, sử dụng File file = new File(path)và tương ứngFileInputStream


39
Sẽ thật tuyệt nếu bạn đã cung cấp một số mã mẫu để đạt được điều này!
Muhammad Babar

2
@MuhammadBabar tất nhiên bạn cần mã, bạn không thể luôn viết mã mà không có ai đó cung cấp cho bạn. Kiểm tra các tài liệu có lẽ?
Neon Warge

3

Tôi nhận được thông báo lỗi ở trên khi cố gắng truy cập tệp từ Bộ nhớ trong bằng openFileInput("/Dir/data.txt")phương pháp với thư mục con Dir.

Bạn không thể truy cập các thư mục con bằng phương pháp trên.

Hãy thử một cái gì đó như:

FileInputStream fIS = new FileInputStream (new File("/Dir/data.txt"));

2

Bạn không thể sử dụng trực tiếp đường dẫn với các dấu phân tách thư mục, nhưng bạn sẽ phải tạo một đối tượng tệp cho mọi thư mục.

LƯU Ý: Mã này tạo các thư mục, của bạn có thể không cần ...

File file= context.getFilesDir();
file.mkdir();

String[] array=filePath.split("/");
for(int t=0; t< array.length -1 ;t++)
{
    file=new File(file,array[t]);
    file.mkdir();
}

File f=new File(file,array[array.length-1]);

RandomAccessFileOutputStream rvalue = new RandomAccessFileOutputStream(f,append);

5
Gì ? File f = new File(fileDirPath); f.mkdirs();Vui lòng chỉnh sửa
Mr_and_Mrs_D

1
String all = "";
        try {
            BufferedReader br = new BufferedReader(new FileReader(filePath));
            String strLine;
            while ((strLine = br.readLine()) != null){
                all = all + strLine;
            }
        } catch (IOException e) {
            Log.e("notes_err", e.getLocalizedMessage());
        }

0
File file = context.getFilesDir(); 
file.mkdir();
String[] array = filePath.split("/"); 
for(int t = 0; t < array.length - 1; t++) {
    file = new File(file, array[t]); 
    file.mkdir();
}
File f = new File(file,array[array.length- 1]); 
RandomAccessFileOutputStream rvalue = 
    new RandomAccessFileOutputStream(f, append);

Câu trả lời tương tự như câu trước.
Anis LOUNIS

0

Tôi đã giải quyết loại lỗi này bằng cách tạo một thư mục trong sự kiện onCreate, sau đó truy cập thư mục bằng cách tạo một đối tượng tệp mới trong một phương thức cần thực hiện một số việc như lưu hoặc truy xuất tệp trong thư mục đó, hy vọng điều này sẽ giúp ích!

 public class MyClass {    

 private String state;
 public File myFilename;

 @Override
 protected void onCreate(Bundle savedInstanceState) {//create your directory the user will be able to find
    super.onCreate(savedInstanceState);
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        myFilename = new File(Environment.getExternalStorageDirectory().toString() + "/My Directory");
        if (!myFilename.exists()) {
            myFilename.mkdirs();
        }
    }
 }

 public void myMethod {

 File fileTo = new File(myFilename.toString() + "/myPic.png");  
 // use fileTo object to save your file in your new directory that was created in the onCreate method
 }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.