Câu hỏi Làm cách nào để tạo một tệp và viết nó trong Java?


Cách đơn giản nhất để tạo và ghi vào một tệp (văn bản) trong Java là gì?


1134
2018-05-21 19:58


gốc




Các câu trả lời:


Lưu ý rằng mỗi mẫu mã bên dưới có thể ném IOException. Cố gắng / bắt / cuối cùng khối đã được bỏ qua cho ngắn gọn. Xem hướng dẫn này để biết thông tin về xử lý ngoại lệ.

Tạo một tệp văn bản (lưu ý rằng điều này sẽ ghi đè tệp nếu nó đã tồn tại):

PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();

Tạo một tệp nhị phân (điều này cũng sẽ ghi đè lên tệp):

byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();

Java 7+ người dùng có thể sử dụng Files lớp để ghi vào tệp:

Tạo tệp văn bản:

List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, Charset.forName("UTF-8"));
//Files.write(file, lines, Charset.forName("UTF-8"), StandardOpenOption.APPEND);

Tạo tệp nhị phân:

byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);

1457
2018-05-21 20:06



Đáng chú ý PrintWriter sẽ cắt bớt các filesize thành 0 nếu tập tin đã tồn tại - Covar
PrintWriter có thể được (và thường là) được sử dụng, nhưng không phải là (khái niệm) lớp thích hợp cho công việc. Từ tài liệu: "PrintWriter prints formatted representations of objects to a text-output stream. " Câu trả lời của Bozho là chính xác hơn, mặc dù nó trông cồng kềnh (bạn luôn có thể bọc nó trong một số phương pháp tiện ích). - leonbloy
Vậy thì textfile sẽ được tạo sau khi ứng dụng được xây dựng và sử dụng ở một máy tính khác từ khi chúng ta chưa đưa ra đường dẫn ở đâu? - Marlon Abeykoon
@MarlonAbeykoon Câu hỏi hay. Câu trả lời là nó sẽ tạo ra các tập tin văn bản trong thư mục làm việc. Thư mục làm việc là bất kỳ thư mục nào bạn thực thi chương trình của mình. Ví dụ, nếu bạn thực thi chương trình của bạn từ dòng lệnh, thì thư mục làm việc sẽ là bất kỳ thư mục nào bạn đang "in" tại thời điểm đó (trên Linux, gõ "pwd" để xem thư mục làm việc hiện tại). Hoặc, nếu tôi bấm đúp vào một tệp JAR trên máy tính để bàn của tôi để chạy nó, thì thư mục làm việc sẽ là màn hình nền. - Michael
writer.close() nên ở trong một khối cuối cùng - Thierry


Trong Java 7 trở lên:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(
              new FileOutputStream("filename.txt"), "utf-8"))) {
   writer.write("something");
}

Có những tiện ích hữu ích cho rằng mặc dù:

Cũng lưu ý rằng bạn có thể sử dụng một FileWriter, nhưng nó sử dụng mã hóa mặc định, thường là một ý tưởng tồi - tốt nhất là chỉ định mã hóa một cách rõ ràng.

Dưới đây là câu trả lời ban đầu, trước khi Java 7


Writer writer = null;

try {
    writer = new BufferedWriter(new OutputStreamWriter(
          new FileOutputStream("filename.txt"), "utf-8"));
    writer.write("Something");
} catch (IOException ex) {
    // Report
} finally {
   try {writer.close();} catch (Exception ex) {/*ignore*/}
}

Xem thêm: Đọc, Viết và Tạo Tệp (bao gồm NIO2).


355
2018-05-21 20:09



@leonbloy Tôi biết đây là một bình luận cũ, nhưng nếu có ai thấy điều này bạn sẽ giải thích tại sao không phải là "luôn luôn có lợi"? Ít nhất ở đây nó nói "hiệu quả cao nhất" docs.oracle.com/javase/1.5.0/docs/api/java/io/… - Juan
Có vẻ như nhà văn không có phương thức writeln (). Nó chỉ có viết () - YankeeWhiskey
Nếu bạn thay đổi kiểu writer thành BufferedWriter (nó thực sự là), bạn có thể sử dụng writer.newLine () - Niek
Nó dường như không có một thử / bắt bên trong một cuối cùng. Tôi biết lý do tại sao, nhưng nó có vẻ như một mùi mã. - ashes999
@Trengot Nó có. Đang gọi close() trên bất kỳ luồng nào được bao quanh bất kỳ luồng nào khác cũng sẽ đóng tất cả các luồng bên trong. - Nic Hartley


Nếu bạn đã có nội dung bạn muốn ghi vào tệp (và không được tạo khi đang di chuyển), java.nio.file.Files Ngoài ra trong Java 7 như một phần của bản địa I / O cung cấp cách đơn giản và hiệu quả nhất để đạt được mục tiêu của bạn.

Về cơ bản việc tạo và ghi vào một tệp chỉ là một dòng, hơn thế nữa một cuộc gọi phương thức đơn giản!

Ví dụ sau tạo và ghi vào 6 tệp khác nhau để hiển thị cách tệp có thể được sử dụng:

Charset utf8 = StandardCharsets.UTF_8;
List<String> lines = Arrays.asList("1st line", "2nd line");
byte[] data = {1, 2, 3, 4, 5};

try {
    Files.write(Paths.get("file1.bin"), data);
    Files.write(Paths.get("file2.bin"), data,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    Files.write(Paths.get("file3.txt"), "content".getBytes());
    Files.write(Paths.get("file4.txt"), "content".getBytes(utf8));
    Files.write(Paths.get("file5.txt"), lines, utf8);
    Files.write(Paths.get("file6.txt"), lines, utf8,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
    e.printStackTrace();
}

118
2018-04-22 14:01



Thực hiện tốt. Tôi thích ví dụ file5 và file6. Để kiểm tra file6, hãy chắc chắn rằng bạn chạy chương trình hai lần, sau đó bạn sẽ thấy nó nối thêm các dòng một lần nữa. - tazboy


public class Program {
    public static void main(String[] args) {
        String text = "Hello world";
        BufferedWriter output = null;
        try {
            File file = new File("example.txt");
            output = new BufferedWriter(new FileWriter(file));
            output.write(text);
        } catch ( IOException e ) {
            e.printStackTrace();
        } finally {
          if ( output != null ) {
            output.close();
          }
        }
    }
}

69
2018-05-21 20:09



Nó sẽ không được tốt hơn để đặt output.close () trong một khối cuối cùng? - qed
Mã chỉ có thể không bao giờ cấu thành câu trả lời ở đây. Bạn phải giải thích. - user207421
thực sự điều này sẽ không biên dịch, output.close() ném IOException - Bob Yoplait


Đây là một chương trình ví dụ nhỏ để tạo hoặc ghi đè lên một tệp. Đó là phiên bản dài để nó có thể được hiểu dễ dàng hơn.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class writer {
    public void writing() {
        try {
            //Whatever the file path is.
            File statText = new File("E:/Java/Reference/bin/images/statsTest.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);    
            Writer w = new BufferedWriter(osw);
            w.write("POTATO!!!");
            w.close();
        } catch (IOException e) {
            System.err.println("Problem writing to the file statsTest.txt");
        }
    }

    public static void main(String[]args) {
        writer write = new writer();
        write.writing();
    }
}

39
2018-04-09 18:05





Sử dụng:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8))) {
    writer.write("text to write");
} 
catch (IOException ex) {
    // Handle me
}  

Sử dụng try() sẽ tự động đóng luồng. Phiên bản này ngắn, nhanh (được đệm) và cho phép chọn mã hóa.

Tính năng này đã được giới thiệu trong Java 7.


30
2018-04-19 14:35



Cần lưu ý đây là một tính năng Java 7, vì vậy sẽ không hoạt động trong các phiên bản Java trước. - Dan Temple
Người ta có thể sử dụng "hằng số" StandardCharsets.UTF_8 thay vì chuỗi "utf-8" (Điều này ngăn chặn lỗi lỗi chính tả) ...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)... - - java.nio.charset.StandardCharsets được giới thiệu trong java 7 - Ralph


Một cách rất đơn giản để tạo và ghi vào một tệp trong Java:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class CreateFiles {

    public static void main(String[] args) {
        try{
            // Create new file
            String content = "This is the content to write into create file";
            String path="D:\\a\\hi.txt";
            File file = new File(path);

            // If file doesn't exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);

            // Write in file
            bw.write(content);

            // Close connection
            bw.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
}

Tài liệu tham khảo: Tạo tệp Ví dụ trong java


30
2017-11-19 16:07



Các File.exists()/createNewFile() mã ở đây là cả vô nghĩa và lãng phí. Hệ điều hành đã phải làm chính xác điều tương tự khi new FileWriter() được tạo ra. Bạn buộc tất cả phải xảy ra hai lần. - user207421
File.exists () / createNewFile () không phải là vô nghĩa và lãng phí. Tôi đã tìm kiếm một cách để thực thi mã khác nhau dựa trên việc tập tin đã có hay chưa. Điều này rất hữu ích. - KirstieBallance
Tôi đã sử dụng phương pháp này nhưng bạn phải biết rằng nó ghi đè lên các tập tin mỗi lần. Nếu bạn muốn nó thêm vào trong trường hợp tệp tồn tại, bạn phải khởi tạo FileWriter như sau: new FileWriter(file.getAbsoluteFile(),true) - Adelin
Nó là cả hai vô nghĩa và lãng phí, vì lý do tôi đã nói. Bạn đang gây ra hai kiểm tra sự tồn tại, hai sáng tạo, và xóa: và bạn là không phải thực thi mã khác ở đây tùy thuộc vào việc tệp đã có sẵn hay chưa. - user207421


Ở đây chúng ta đang nhập một chuỗi vào một tệp văn bản:

String content = "This is the content to write into a file";
File file = new File("filename.txt");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close(); // Be sure to close BufferedWriter

Chúng ta có thể dễ dàng tạo một tập tin mới và thêm nội dung vào nó.


17
2018-06-10 11:55



Lưu ý rằng việc đóng BufferedWriter là đủ vì nó cũng đảm nhiệm việc đóng FileWriter. - rbaleksandar


Nếu bạn muốn có trải nghiệm không đau đớn, bạn cũng có thể xem Gói Apache Commons IO, cụ thể hơn là FileUtils lớp học.

Không bao giờ quên kiểm tra thư viện của bên thứ ba. Joda-Time để thao tác ngày, Apache Commons Lang StringUtils cho các hoạt động chuỗi phổ biến và như vậy có thể làm cho mã của bạn dễ đọc hơn.

Java là một ngôn ngữ tuyệt vời, nhưng thư viện chuẩn đôi khi hơi thấp. Tuy nhiên, mức độ mạnh mẽ nhưng thấp.


15
2018-05-21 20:10



Phương pháp ghi tệp đơn giản nhất trong FileUtils Là static void write(File file, CharSequence data). Sử dụng ví dụ: import org.apache.commons.io.FileUtils;  FileUtils.write(new File("example.txt"), "string with data");. FileUtils cũng có writeLines, có một Collectioncác dòng. - Rory O'Kane


Vì tác giả không chỉ định liệu họ có cần một giải pháp cho các phiên bản Java đã được EoL'd (bởi cả Sun và IBM, và đây là những JVM phổ biến nhất về mặt kỹ thuật), và do thực tế là hầu hết mọi người dường như đã trả lời câu hỏi của tác giả trước khi nó được xác định rằng nó là văn bản (không phải nhị phân)tập tin, tôi đã quyết định cung cấp câu trả lời của tôi.


Trước hết, Java 6 nói chung đã kết thúc cuộc đời, và vì tác giả không chỉ rõ anh ta cần khả năng tương thích cũ, tôi đoán nó tự động có nghĩa là Java 7 trở lên (Java 7 chưa phải là EoL'd của IBM). Vì vậy, chúng ta có thể xem ngay hướng dẫn I / O của tệp: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html

Trước khi phát hành Java SE 7, lớp java.io.File là   cơ chế được sử dụng cho tệp I / O, nhưng nó có một số nhược điểm.

  • Nhiều phương pháp không ném ngoại lệ khi chúng không thành công, vì vậy   không thể có được một thông báo lỗi hữu ích. Ví dụ: nếu một tệp   xóa không thành công, chương trình sẽ nhận được "xóa không thành công" nhưng   sẽ không biết nếu đó là do tệp không tồn tại, người dùng không   có quyền hoặc có một số vấn đề khác.
  • Phương thức đổi tên   đã không hoạt động liên tục trên các nền tảng.
  • Không có hỗ trợ thực sự   cho các liên kết tượng trưng.
  • Đã có thêm hỗ trợ cho siêu dữ liệu, chẳng hạn như   quyền tệp, chủ sở hữu tệp và các thuộc tính bảo mật khác. Truy cập   siêu dữ liệu tệp không hiệu quả.
  • Nhiều phương thức tệp không được chia tỷ lệ.   Yêu cầu danh sách thư mục lớn trên máy chủ có thể dẫn đến   treo. Các thư mục lớn cũng có thể gây ra các vấn đề về bộ nhớ,   dẫn đến việc từ chối dịch vụ.
  • Không thể viết được   mã đáng tin cậy có thể đệ quy đi bộ cây tập tin và trả lời   một cách thích hợp nếu có các liên kết tượng trưng hình tròn.

Ồ, đó là quy tắc ra java.io.File. Nếu một tập tin không thể được viết / nối, bạn thậm chí không thể biết tại sao.


Chúng ta có thể tiếp tục xem hướng dẫn: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common

Nếu bạn có tất cả các dòng bạn sẽ viết (chắp thêm) vào tệp văn bản trước, phương pháp được đề xuất là https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#write-java.nio.file.Path-java.lang.Iterable-java.nio.charset. Charset-java.nio.file.OpenOption ...-

Dưới đây là một ví dụ (đơn giản):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, StandardCharsets.UTF_8);

Một ví dụ khác (phụ lục):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE);

Nếu bạn muốn viết nội dung tập tin khi bạn đi: https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java.nio.charset.Charset-java.nio. file.OpenOption ...-

Ví dụ đơn giản (Java 8 trở lên):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file)) {
    writer.append("Zero header: ").append('0').write("\r\n");
    [...]
}

Một ví dụ khác (phụ lục):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {
    writer.write("----------");
    [...]
}

Những phương pháp này đòi hỏi nỗ lực tối thiểu trên phần của tác giả và nên được ưu tiên hơn cho tất cả những người khác khi ghi vào các tập tin [văn bản].


11
2018-05-13 04:39



'Nếu một tập tin không thể được viết / nối, bạn có thể không biết tại sao' không chính xác. Bạn sẽ biết chính xác lý do tại sao, từ văn bản của FileNotFoundException được ném khi thao tác thất bại. - user207421
"Nhiều phương pháp đã không ném ngoại lệ khi chúng không thành công, vì vậy không thể nhận được thông báo lỗi hữu ích. Ví dụ: nếu xóa tệp không thành công, chương trình sẽ nhận được" xóa không thành công "nhưng sẽ không biết đó là vì tệp không tồn tại, người dùng không có quyền hoặc có một số vấn đề khác. " - afk5min
Đọc những gì tôi đã viết. 'Nếu một tập tin không thể được viết / nối, bạn thậm chí không thể có được một thông báo lỗi hữu ích 'là không chính xác, vì lý do tôi đã nói, và vẫn như vậy. Bạn đang thay đổi chủ đề. Chủ đề của riêng bạn. - user207421
Tôi sẽ kiểm tra việc cài đặt sẵn cho các hệ thống tập tin điển hình (có trong OpenJDK, nhưng tôi không có lý do gì để nghĩ rằng phần này sẽ khác trong Oracle JDK độc quyền, hoặc khác biệt đáng kể trong IBM JDK độc quyền) câu trả lời của tôi dựa trên những phát hiện này. Nhận xét của bạn có ý nghĩa - chỉ vì 'nhiều phương pháp' có thể có vấn đề, tác giả đã tuyên bố rõ ràng rằng đó chỉ là viết / nối thêm vào hoạt động tệp mà họ quan tâm. - afk5min
Lý do nó là như vậy là không ai trong số các phương pháp bạn đang gọi không ném ngoại lệ thích hợp có chứa thông báo lỗi thích hợp. Nếu bạn có một counterexample hỗ trợ xác nhận của bạn, nó là vào bạn để cung cấp nó. - user207421