Có cách nào để sử dụng FileOutputStream theo cách mà nếu một tệp (Tên tệp chuỗi) không tồn tại, thì nó sẽ tạo ra nó?
FileOutputStream oFile = new FileOutputStream("score.txt", false);
Có cách nào để sử dụng FileOutputStream theo cách mà nếu một tệp (Tên tệp chuỗi) không tồn tại, thì nó sẽ tạo ra nó?
FileOutputStream oFile = new FileOutputStream("score.txt", false);
Câu trả lời:
Nó sẽ ném FileNotFoundException
nếu tập tin không tồn tại và không thể được tạo ( doc ), nhưng nó sẽ tạo nó nếu có thể. Để chắc chắn, trước tiên bạn có thể nên kiểm tra xem tệp có tồn tại trước khi bạn tạo FileOutputStream
(và tạo với createNewFile()
nếu không):
File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing
FileOutputStream oFile = new FileOutputStream(yourFile, false);
createNewFile()
phương thức, như trong ví dụ của tôi.
createNewFile()
là một sự lãng phí hoàn toàn thời gian ở đây. Hệ thống sẽ làm điều đó. Bạn chỉ đang buộc nó phải nhìn hai lần.
Bạn có thể tạo một tệp trống cho dù nó tồn tại hay không ...
new FileOutputStream("score.txt", false).close();
nếu bạn muốn để lại tập tin nếu nó tồn tại ...
new FileOutputStream("score.txt", true).close();
Bạn sẽ chỉ nhận được FileNotFoundException nếu bạn cố gắng tạo tệp trong thư mục không tồn tại.
FileNotFoundException
trong cả hai trường hợp.
File f = new File("Test.txt");
if(!f.exists()){
f.createNewFile();
}else{
System.out.println("File already exists");
}
Truyền cái này f
cho FileOutputStream
constructor của bạn
FileUtils từ apache commons là một cách khá tốt để đạt được điều này trong một dòng duy nhất.
FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))
Điều này sẽ tạo các thư mục mẹ nếu không tồn tại và tạo một tệp nếu không tồn tại và ném ngoại lệ nếu đối tượng tệp là một thư mục hoặc không thể được ghi vào. Điều này tương đương với :
File file = new File("/home/nikhil/somedir/file.txt");
file.getParentFile().mkdirs(); // Will create parent directories if not exists
file.createNewFile();
FileOutputStream s = new FileOutputStream(file,false);
Tất cả các hoạt động trên sẽ đưa ra một ngoại lệ nếu người dùng hiện tại không được phép thực hiện thao tác.
Tạo tập tin nếu không tồn tại. Nếu thoát tệp, xóa nội dung của nó:
/**
* Create file if not exist.
*
* @param path For example: "D:\foo.xml"
*/
public static void createFile(String path) {
try {
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
} else {
FileOutputStream writer = new FileOutputStream(path);
writer.write(("").getBytes());
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Chỉ đưa ra một cách khác để tạo tệp chỉ khi không tồn tại bằng Đường dẫn và Tệp.
Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
Files.createFile(path);
Files.write(path, ("").getBytes());
Bạn có khả năng có thể nhận được FileNotFoundException
nếu tập tin không tồn tại.
Tài liệu Java nói:
Một tập tin có sẵn hay không hoặc có thể được tạo hay không phụ thuộc vào nền tảng cơ bản http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html
Nếu bạn đang sử dụng Java 7, bạn có thể sử dụng gói java.nio:
Tham số tùy chọn chỉ định cách tệp được tạo hoặc mở ... nó sẽ mở tệp để ghi, tạo tệp nếu nó không tồn tại ...
http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html
new FileOutputStream(f)
sẽ tạo một tệp trong hầu hết các trường hợp, nhưng thật không may, bạn sẽ nhận được FileNotFoundException
nếu tệp tồn tại nhưng là một thư mục chứ không phải là tệp thông thường, không tồn tại nhưng không thể được tạo hoặc không thể mở vì bất kỳ lý do nào khác
Tôi có một từ khác có thể có nhiều trường hợp bạn sẽ nhận được FileNotFoundException có nghĩa là "Không thể tạo tệp của bạn", nhưng bạn sẽ không thể tìm thấy lý do tại sao việc tạo tệp thất bại.
Một giải pháp là loại bỏ bất kỳ cuộc gọi nào đến API tệp và sử dụng API tệp thay vì nó cung cấp xử lý lỗi tốt hơn nhiều. Thường thay thế bất kỳ new FileOutputStream(f)
bằng Files.newOutputStream(p)
.
Trong trường hợp bạn cần sử dụng API tệp (vì bạn sử dụng giao diện bên ngoài bằng Tệp chẳng hạn), sử dụng Files.createFile(p)
là một cách tốt để đảm bảo tệp của bạn được tạo đúng và nếu không bạn sẽ biết tại sao nó không hoạt động. Một số người nhận xét ở trên rằng điều này là dư thừa. Đó là sự thật, nhưng bạn có thể xử lý lỗi tốt hơn có thể cần thiết trong một số trường hợp.