Làm cách nào để tạo một tệp và ghi vào tệp đó bằng Java?


1383

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

Câu trả lời:


1735

Lưu ý rằng mỗi mẫu mã dưới đây có thể ném IOException. Các khối thử / bắt / cuối cùng đã bị 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ệ.

Lưu ý rằng mỗi mẫu mã dưới đây sẽ ghi đè lên tệp nếu nó đã tồn tại

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

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:

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

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

Tạo một 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, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);

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

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

58
Đáng chú ý PrintWriter sẽ cắt ngắn kích thước tệp thành 0 nếu tệp đã tồn tại
Covar

34
PrintWriter có thể (và thường là) được sử dụng, nhưng không (về mặt khái niệm) là lớp phù hợp cho công việc. Từ các tài liệu: "PrintWriter prints formatted representations of objects to a text-output stream. "Câu trả lời của Bozho thì đúng hơn, mặc dù nó có vẻ rườm rà (bạn luôn có thể gói nó trong một số phương pháp tiện ích).
leonbloy

14
Vì vậy, textfile sẽ được tạo ở đâu sau khi ứng dụng được xây dựng và sử dụng trong một PC khác vì chúng tôi chưa đưa ra đường dẫn?
Marlon Abeykoon

13
@MarlonAbeykoon Câu hỏi hay. Câu trả lời là nó sẽ tạo tệp văn bản trong thư mục làm việc . Thư mục làm việc là bất cứ thư mục nào bạn thực hiện chương trình của mình. Ví dụ: nếu bạn thực thi chương trình của mình 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 "ở" tại thời điểm đó (trên Linux, nhập "pwd" để xem thư mục làm việc hiện tại). Hoặc, nếu tôi bấm đúp vào tệp JAR trên màn hình của mình để chạy nó, thì thư mục làm việc sẽ là màn hình nền.
Michael

8
writer.close()nên ở trong một khối cuối cùng
Thierry

416

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 điều đó:

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 rõ ràng mã hóa.

Dưới đây là câu trả lời gốc, trước 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).


5
@leonbloy Tôi biết đây là một nhận xét cũ, nhưng nếu có ai nhìn thấy điều này bạn sẽ phiền khi giải thích tại sao "không phải lúc nào cũng có lợi"? Ít nhất ở đây nó nói "hiệu quả hàng đầu" docs docs.oracle.com/javase/1.5.0/docs/api/java/io/ trộm
Juan

14
Có vẻ như nhà văn không có phương thức writeln (). Nó chỉ có ghi ()
YankeeWhiskey

10
Nếu bạn thay đổi kiểu nhà văn thành BufferedWriter (thực tế là như vậy), bạn có thể sử dụng wr.newLine ()
Niek

4
Cuối cùng có vẻ không đúng khi thử / bắt bên trong. Tôi biết lý do tại sao, nhưng nó có vẻ như một mùi mã.
tro999

4
@Trengot Nó không. Gọi close()bất kỳ luồng nào được quấn quanh bất kỳ luồng nào khác cũng sẽ đóng tất cả các luồng bên trong.
Vụ kiện của Quỹ Monica

132

Nếu bạn đã có nội dung bạn muốn ghi vào tệp (và không được tạo nhanh chóng), việc java.nio.file.Filesbổ sung trong Java 7 như một phần của I / O gốc 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 nữa chỉ là một cuộc gọi phương thức đơn giản !

Ví dụ sau đây tạo và ghi vào 6 tệp khác nhau để giới thiệu cách sử dụng tệp này:

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();
}

Làm rất tốt Tôi thích ví dụ file5 và file6. Để kiểm tra tệp6, hãy đảm bảo bạn chạy chương trình hai lần, sau đó bạn sẽ thấy nó nối lại các dòng.
tazboy

76
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();
          }
        }
    }
}

18
Sẽ không tốt hơn nếu đặt output.close () trong một khối cuối cùng?
qed

7
Mã đơn thuần không bao giờ có thể tạo thành một câu trả lời ở đây. Bạn phải giải thích.
Hầu tước Lorne

7
Trên thực tế, điều này sẽ không được biên dịch, output.close()ném IOException
Bob Yoplait

43

Đây là một chương trình ví dụ nhỏ để tạo hoặc ghi đè lên một tệp. Đây là phiên bản dài để có thể 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

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);
        }
    }
}

7
Các File.exists()/createNewFile()mã ở đây là cả hai vô nghĩa và lãng phí. Hệ điều hành đã phải thực hiện chính xác điều tương tự khi new FileWriter()được tạo. Bạn đang buộc tất cả xảy ra hai lần.
Hầu tước Lorne

1
File.exists () / createNewFile () không vô nghĩa và lãng phí. Tôi đang tìm cách để thực thi các 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

2
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 tệp mỗi lần. Nếu bạn muốn nó xuất hiện trong trường hợp tệp tồn tại, bạn phải khởi tạo FileWriternhư sau:new FileWriter(file.getAbsoluteFile(),true)
Adelin

2
Nó là cả hai vô nghĩa lãng phí, vì lý do tôi đã nêu. Bạn đang gây ra hai thử nghiệm tồn tại, hai sáng tạo xóa: và bạn không thực thi mã khác nhau ở đây tùy thuộc vào việc tệp có hiện diện hay không.
Hầu tước Lorne

34

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ẽ đóng luồng tự độ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.


5
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.
Đền Dan

3
Người ta có thể sử dụng "hằng số" StandardCharsets.UTF_8thay vì Chuỗi "utf-8" (Điều này ngăn ngừa 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

20

Ở đây chúng tôi đ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 mới và thêm nội dung vào đó.


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

17

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


Trước hết, Java 6 nói chung đã hết tuổi thọ và do tác giả không chỉ định anh ta cần khả năng tương thích kế thừa, 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 tệp hướng dẫn I / O: 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 đưa ra ngoại lệ khi chúng thất bại, vì vậy không thể có đượ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 thất bại" nhưng sẽ không biết có phải do tệp không tồn tại hay không, 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 nhất quán 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ần hỗ trợ thêm cho siêu dữ liệu, 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 tin là không hiệu quả.
  • Nhiều phương thức File không mở rộng được. Yêu cầu một danh sách thư mục lớn trên một máy chủ có thể dẫn đến treo. Các thư mục lớn cũng có thể gây ra sự cố tài nguyên bộ nhớ, dẫn đến việc từ chối dịch vụ.
  • Không thể viết mã đáng tin cậy có thể đệ quy một cây tập tin và trả lời thích hợp nếu có các liên kết tượng trưng tròn.

Oh tốt, đó là quy tắc ra java.io.File. Nếu một tập tin không thể được viết / nối thêm, 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 , cách tiếp cận đượ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 hóa):

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

Một ví dụ khác (nối thêm):

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 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 hóa (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 (nối thêm):

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

Các phương pháp này đòi hỏi nỗ lực tối thiểu từ phía tác giả và nên được ưu tiên cho tất cả các phương pháp khác khi ghi vào tệp [văn bản].


'Nếu một tập tin không thể được viết / nối thêm, bạn thậm chí không thể biết tại sao' không chính xác. Bạn sẽ biết chính xác tại sao, từ văn bản của FileNotFoundExceptionđó được ném khi hoạt động không thành công.
Hầu tước Lorne

"Nhiều phương pháp đã không đưa ra ngoại lệ khi chúng thất bại, vì vậy không thể có đượ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 thất bại "nhưng không biết có phải vì đó là vì tập tin 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 thêm, bạn thậm chí có thể không nhận được thông báo lỗi hữu ích' là không chính xác, vì lý do tôi đã nêu, và vẫn như vậy. Bạn đang thay đổi chủ đề. Chủ đề của riêng bạn
Hầu tước Lorne

Tôi sẽ kiểm tra các triển khai tích hợp cho các hệ thống tệp điển hình (có trong OpenJDK, nhưng tôi không có lý do gì để nghĩ phần này sẽ khác với Oracle JDK độc quyền, hoặc khác biệt đáng kể trong JDK độc quyền của IBM, và các bản cập nhật khác 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 thực sự 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 đó chỉ là thao tác ghi / nối vào tệp mà họ quan tâm.
afk5min

Lý do là vì không có phương thức nào bạn gọi không thể đưa ra các ngoại lệ phù hợp có chứa thông báo lỗi thích hợp. Nếu bạn có một ví dụ mẫu hỗ trợ khẳng định của bạn, thì bạn phải cung cấp nó.
Hầu tước Lorne

16

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

Không bao giờ quên kiểm tra thư viện của bên thứ ba. Joda - Thời gian để thao tác ngày, Apache Commons LangStringUtils 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 tiêu chuẩn đôi khi hơi thấp. Mạnh mẽ, nhưng dù sao cũng ở cấp độ thấp.


1
Phương pháp viết tập tin đơn giản nhất FileUtilsstatic void write(File file, CharSequence data). Ví dụ sử dụng : import org.apache.commons.io.FileUtils; FileUtils.write(new File("example.txt"), "string with data");. FileUtilscũng có writeLines, trong đó có một Collectiondòng.
Rory O'Kane

12

Nếu bạn vì một lý do nào đó muốn tách biệt hành động tạo và viết, thì tương đương với Java touch

try {
   //create a file named "testfile.txt" in the current working directory
   File myFile = new File("testfile.txt");
   if ( myFile.createNewFile() ) {
      System.out.println("Success!");
   } else {
      System.out.println("Failure!");
   }
} catch ( IOException ioe ) { ioe.printStackTrace(); }

createNewFile()không kiểm tra sự tồn tại và tập tin tạo ra nguyên tử. Điều này có thể hữu ích nếu bạn muốn đảm bảo bạn là người tạo tệp trước khi ghi vào nó.


1
[touch] cũng cập nhật dấu thời gian của tệp dưới dạng tác dụng phụ (nếu nó đã tồn tại). Điều này cũng có tác dụng phụ?
Ape-inago

@ Ape-inago: Trên hệ thống của tôi chắc chắn là không (nó chỉ trả về sai và không có tác dụng đối với tệp). Tôi không có ý nghĩa touchchung mà là sử dụng thứ cấp phổ biến để tạo một tệp mà không ghi dữ liệu vào đó. Mục đích của tài liệu cảm ứng là cập nhật dấu thời gian trên tệp. Tạo tập tin nếu nó không tồn tại thực sự là tác dụng phụ và có thể bị vô hiệu hóa bằng một công tắc.
Mark Peters

Vì một số lý do như vậy là gì? Các exists()/createNewFile()trình tự này thực sự là một sự lãng phí thời gian và không gian.
Hầu tước Lorne

12

Dưới đây là một số cách có thể để tạo và viết một tệp trong Java:

Sử dụng FileOutputStream

try {
  File fout = new File("myOutFile.txt");
  FileOutputStream fos = new FileOutputStream(fout);
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
  bw.write("Write somthing to the file ...");
  bw.newLine();
  bw.close();
} catch (FileNotFoundException e){
  // File was not found
  e.printStackTrace();
} catch (IOException e) {
  // Problem when writing to the file
  e.printStackTrace();
}

Sử dụng FileWriter

try {
  FileWriter fw = new FileWriter("myOutFile.txt");
  fw.write("Example of content");
  fw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

Sử dụng PrintWriter

try {
  PrintWriter pw = new PrintWriter("myOutFile.txt");
  pw.write("Example of content");
  pw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

Sử dụng OutputStreamWriter

try {
  File fout = new File("myOutFile.txt");
  FileOutputStream fos = new FileOutputStream(fout);
  OutputStreamWriter osw = new OutputStreamWriter(fos);
  osw.write("Soe content ...");
  osw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

Để biết thêm kiểm tra hướng dẫn này về Cách đọc và ghi tệp trong Java .


Chỉ cần tự hỏi không nên FileWriterhoặc OutputStreamWriterđóng cửa trong một khối cuối cùng?
Wolfgang Schreurs

@WolfgangSchreurs, Vâng, thậm chí còn tốt hơn, tôi phải di chuyển khai báo biến ra ngoài khối thử để có thể làm điều đó.
Mehdi

Tôi chỉ tìm ra rằng việc sử dụng tự động đóng nếu thậm chí còn sạch hơn, không cần khai báo biến ngoài khối và tài nguyên sẽ tự động bị đóng ngay cả khi có ngoại lệ xảy ra (cần phải thêm một khối cuối cùng). Xem: docs.oracle.com/javase/tutorial/essential/exceptions/ Kẻ
Wolfgang Schreurs

Tôi sẽ thêm các tài nguyên thử với một ví dụ riêng biệt (để tách các khả năng khác nhau). Bạn biết SOF là một trang web hợp tác, hãy tiếp tục và sửa đổi câu trả lời nếu bạn muốn bạn có quyền.
Mehdi

10

Sử dụng:

JFileChooser c = new JFileChooser();
c.showOpenDialog(c);
File writeFile = c.getSelectedFile();
String content = "Input the data here to be written to your file";

try {
    FileWriter fw = new FileWriter(writeFile);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.append(content);
    bw.append("hiiiii");
    bw.close();
    fw.close();
}
catch (Exception exc) {
   System.out.println(exc);
}

đây là cách dễ nhất tôi tìm thấy ... tất cả các vấn đề đều được giải quyết ở đây và chỉ cần chèn văn bản
Rohit ZP

10

Cách tốt nhất là sử dụng Java7: Java 7 giới thiệu một cách làm việc mới với hệ thống tệp, cùng với một lớp tiện ích mới - Tệp. Sử dụng lớp Tệp, chúng ta cũng có thể tạo, di chuyển, sao chép, xóa các tệp và thư mục; nó cũng có thể được sử dụng để đọc và ghi vào một tập tin.

public void saveDataInFile(String data) throws IOException {
    Path path = Paths.get(fileName);
    byte[] strToBytes = data.getBytes();

    Files.write(path, strToBytes);
}

Viết bằng FileChannel Nếu bạn đang xử lý các tệp lớn, FileChannel có thể nhanh hơn IO tiêu chuẩn. Đoạn mã sau ghi String vào một tệp bằng FileChannel:

public void saveDataInFile(String data) 
  throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();
    byte[] strBytes = data.getBytes();
    ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
    buffer.put(strBytes);
    buffer.flip();
    channel.write(buffer);
    stream.close();
    channel.close();
}

Viết bằng DataOutputStream

public void saveDataInFile(String data) throws IOException {
    FileOutputStream fos = new FileOutputStream(fileName);
    DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
    outStream.writeUTF(data);
    outStream.close();
}

Viết bằng FileOutputStream

Bây giờ chúng ta hãy xem làm thế nào chúng ta có thể sử dụng FileOutputStream để ghi dữ liệu nhị phân vào một tệp. Đoạn mã sau chuyển đổi một chuỗi int byte và ghi các byte vào tệp bằng FileOutputStream:

public void saveDataInFile(String data) throws IOException {
    FileOutputStream outputStream = new FileOutputStream(fileName);
    byte[] strToBytes = data.getBytes();
    outputStream.write(strToBytes);

    outputStream.close();
}

Viết bằng PrintWriter chúng ta có thể sử dụng PrintWriter để viết văn bản có định dạng vào một tệp:

public void saveDataInFile() throws IOException {
    FileWriter fileWriter = new FileWriter(fileName);
    PrintWriter printWriter = new PrintWriter(fileWriter);
    printWriter.print("Some String");
    printWriter.printf("Product name is %s and its price is %d $", "iPhone", 1000);
    printWriter.close();
}

Viết bằng BufferedWriter: sử dụng BufferedWriter để viết Chuỗi vào tệp mới:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
    writer.write(data);

    writer.close();
}

nối một chuỗi vào tệp hiện có:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
    writer.append(' ');
    writer.append(data);

    writer.close();
}

9

Tôi nghĩ rằng đây là cách ngắn nhất:

FileWriter fr = new FileWriter("your_file_name.txt"); // After '.' write
// your file extention (".txt" in this case)
fr.write("Things you want to write into the file"); // Warning: this will REPLACE your old file content!
fr.close();

8

Để tạo tập tin mà không ghi đè tập tin hiện có:

System.out.println("Choose folder to create file");
JFileChooser c = new JFileChooser();
c.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
c.showOpenDialog(c);
c.getSelectedFile();
f = c.getSelectedFile(); // File f - global variable
String newfile = f + "\\hi.doc";//.txt or .doc or .html
File file = new File(newfile);

try {
    //System.out.println(f);
    boolean flag = file.createNewFile();

    if(flag == true) {
        JOptionPane.showMessageDialog(rootPane, "File created successfully");
    }
    else {
        JOptionPane.showMessageDialog(rootPane, "File already exists");
    }
    /* Or use exists() function as follows:
        if(file.exists() == true) {
            JOptionPane.showMessageDialog(rootPane, "File already exists");
        }
        else {
            JOptionPane.showMessageDialog(rootPane, "File created successfully");
        }
    */
}
catch(Exception e) {
    // Any exception handling method of your choice
}

7
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String [] args) {
        FileWriter fw= null;
        File file =null;
        try {
            file=new File("WriteFile.txt");
            if(!file.exists()) {
                file.createNewFile();
            }
            fw = new FileWriter(file);
            fw.write("This is an string written to a file");
            fw.flush();
            fw.close();
            System.out.println("File written Succesfully");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Các exists()/createNewFile()trình tự này thực sự là một sự lãng phí thời gian và không gian.
Hầu tước Lorne

6
package fileoperations;
import java.io.File;
import java.io.IOException;

public class SimpleFile {
    public static void main(String[] args) throws IOException {
        File file =new File("text.txt");
        file.createNewFile();
        System.out.println("File is created");
        FileWriter writer = new FileWriter(file);

        // Writes the content to the file
        writer.write("Enter the text that you want to write"); 
        writer.flush();
        writer.close();
        System.out.println("Data is entered into file");
    }
}

Các exists()/createNewFile()trình tự này thực sự là một sự lãng phí thời gian và không gian.
Hầu tước Lorne

5

Chỉ một dòng thôi! pathlinelà chuỗi

import java.nio.file.Files;
import java.nio.file.Paths;

Files.write(Paths.get(path), lines.getBytes());

Ahem, tác giả đã chỉ định rõ ràng các tập tin "văn bản". Và các tập tin văn bản bao gồm các ký tự. Các tệp nhị phân bao gồm các byte. Bên cạnh đó, không rõ là gì lines. Nếu nó là một java.lang.String, thì việc gọi getBytes()sẽ tạo ra các byte bằng cách sử dụng mã hóa mặc định của nền tảng , điều này không tốt lắm trong trường hợp chung.
afk5min

5

Cách đơn giản nhất tôi có thể tìm thấy:

Path sampleOutputPath = Paths.get("/tmp/testfile")
try (BufferedWriter writer = Files.newBufferedWriter(sampleOutputPath)) {
    writer.write("Hello, world!");
}

Nó có thể sẽ chỉ hoạt động cho 1.7+.


5

Rất đáng để thử với Java 7+:

 Files.write(Paths.get("./output.txt"), "Information string herer".getBytes());

Có vẻ đầy hứa hẹn ...


4

Nếu chúng tôi đang sử dụng Java 7 trở lên và cũng biết nội dung sẽ được thêm (nối thêm) vào tệp, chúng tôi có thể sử dụng phương thức newBufferedWriter trong gói NIO.

public static void main(String[] args) {
    Path FILE_PATH = Paths.get("C:/temp", "temp.txt");
    String text = "\n Welcome to Java 8";

    //Writing to the file temp.txt
    try (BufferedWriter writer = Files.newBufferedWriter(FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
        writer.write(text);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Có một vài điểm cần lưu ý:

  1. Luôn luôn là một thói quen tốt để chỉ định mã hóa bộ ký tự và chúng ta có hằng số trong lớp StandardCharsets.
  2. Mã sử ​​dụng try-with-resourcecâu lệnh trong đó tài nguyên được tự động đóng sau khi thử.

Mặc dù OP chưa hỏi nhưng chỉ trong trường hợp chúng tôi muốn tìm kiếm các dòng có một số từ khóa cụ thể, ví dụ: confidentialchúng tôi có thể sử dụng API luồng trong Java:

//Reading from the file the first line which contains word "confidential"
try {
    Stream<String> lines = Files.lines(FILE_PATH);
    Optional<String> containsJava = lines.filter(l->l.contains("confidential")).findFirst();
    if(containsJava.isPresent()){
        System.out.println(containsJava.get());
    }
} catch (IOException e) {
    e.printStackTrace();
}

4

Đọc và ghi tệp bằng cách sử dụng đầu vào và đầu ra:

//Coded By Anurag Goel
//Reading And Writing Files
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class WriteAFile {
    public static void main(String args[]) {
        try {
            byte array [] = {'1','a','2','b','5'};
            OutputStream os = new FileOutputStream("test.txt");
            for(int x=0; x < array.length ; x++) {
                os.write( array[x] ); // Writes the bytes
            }
            os.close();

            InputStream is = new FileInputStream("test.txt");
            int size = is.available();

            for(int i=0; i< size; i++) {
                System.out.print((char)is.read() + " ");
            }
            is.close();
        } catch(IOException e) {
            System.out.print("Exception");
        }
    }
}

4

Chỉ cần bao gồm gói này:

java.nio.file

Và sau đó bạn có thể sử dụng mã này để viết tệp:

Path file = ...;
byte[] buf = ...;
Files.write(file, buf);

4

Trong Java 8, sử dụng Tệp và Đường dẫn và sử dụng cấu trúc try-with-resource.

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class WriteFile{
    public static void main(String[] args) throws IOException {
        String file = "text.txt";
        System.out.println("Writing to file: " + file);
        // Files.newBufferedWriter() uses UTF-8 encoding by default
        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(file))) {
            writer.write("Java\n");
            writer.write("Python\n");
            writer.write("Clojure\n");
            writer.write("Scala\n");
            writer.write("JavaScript\n");
        } // the file will be automatically closed
    }
}

3

Có một số cách đơn giản, như:

File file = new File("filename.txt");
PrintWriter pw = new PrintWriter(file);

pw.write("The world I'm coming");
pw.close();

String write = "Hello World!";

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

fw.write(write);

fw.close();

bwkhông được sử dụng.
Hầu tước Lorne

Và điểm ghi đè tập tin với nội dung mới không được nêu.
Hầu tước Lorne

3

Bạn thậm chí có thể tạo một tệp tạm thời bằng cách sử dụng thuộc tính hệ thống , nó sẽ độc lập với hệ điều hành bạn đang sử dụng.

File file = new File(System.*getProperty*("java.io.tmpdir") +
                     System.*getProperty*("file.separator") +
                     "YourFileName.txt");

2

Sử dụng thư viện Guava của Google, chúng tôi có thể tạo và ghi vào tệp rất dễ dàng.

package com.zetcode.writetofileex;

import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;

public class WriteToFileEx {

    public static void main(String[] args) throws IOException {

        String fileName = "fruits.txt";
        File file = new File(fileName);

        String content = "banana, orange, lemon, apple, plum";

        Files.write(content.getBytes(), file);
    }
}

Ví dụ tạo một fruits.txttệp mới trong thư mục gốc của dự án.


2

Đọc bộ sưu tập với khách hàng và lưu vào tập tin, với JFilechooser.

private void writeFile(){

    JFileChooser fileChooser = new JFileChooser(this.PATH);
    int retValue = fileChooser.showDialog(this, "Save File");

    if (retValue == JFileChooser.APPROVE_OPTION){

        try (Writer fileWrite = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileChooser.getSelectedFile())))){

            this.customers.forEach((c) ->{
                try{
                    fileWrite.append(c.toString()).append("\n");
                }
                catch (IOException ex){
                    ex.printStackTrace();
                }
            });
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

2

Có ít nhất một số cách tạo tệp và ghi vào tệp:

Các tệp nhỏ (1.7)

Bạn có thể sử dụng một trong các phương thức ghi để ghi byte hoặc dòng vào tệp.

Path file = Paths.get("path-to-file");
byte[] buf = "text-to-write-to-file".;
Files.write(file, buf);

Các phương pháp này đảm nhiệm hầu hết các công việc cho bạn, chẳng hạn như mở và đóng luồng, nhưng không nhằm xử lý các tệp lớn.

Viết tệp lớn hơn bằng cách sử dụng I / O bộ đệm (1.7)

Các java.nio.filehỗ trợ gói kênh I / O, mà di chuyển dữ liệu trong bộ đệm, bỏ qua một số lớp có thể nút cổ chai dòng I / O.

String s = "much-larger-text-to-write-to-file";
try (BufferedWriter writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
    writer.write(s, 0, s.length());
}

Cách tiếp cận này được ưu tiên do hiệu suất hiệu quả của nó đặc biệt là khi hoàn thành một lượng lớn thao tác ghi. Các hoạt động được đệm có tác dụng này vì chúng không bắt buộc phải gọi phương thức ghi của hệ điều hành cho mỗi byte đơn, giảm các hoạt động I / O tốn kém.

Sử dụng API NIO để sao chép (và tạo tệp mới) một tệp có Đầu ra (1.7)

Path oldFile = Paths.get("existing-file-path");
Path newFile = Paths.get("new-file-path");
try (OutputStream os = new FileOutputStream(newFile.toFile())) {
    Files.copy(oldFile, os);
}

Ngoài ra còn có các phương thức bổ sung cho phép sao chép tất cả các byte từ luồng đầu vào sang tệp.

FileWriter (văn bản) (<1.7)

Viết trực tiếp vào tập tin (hiệu suất thấp hơn) và chỉ nên được sử dụng khi số lần ghi ít hơn. Được sử dụng để ghi dữ liệu hướng nhân vật vào một tập tin.

String s= "some-text";
FileWriter fileWriter = new FileWriter("C:\\path\\to\\file\\file.txt");
fileWriter.write(fileContent);
fileWriter.close();

FileOutputStream (nhị phân) (<1.7)

FileOutputStream có nghĩa là để ghi các luồng byte thô như dữ liệu hình ảnh.

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

Với cách tiếp cận này, ta nên xem xét luôn luôn viết một mảng byte thay vì viết một byte mỗi lần. Việc tăng tốc có thể khá đáng kể - cao hơn tới 10 lần hoặc hơn. Do đó, nên sử dụng các write(byte[])phương pháp bất cứ khi nào có thể.

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.