2013-04-02 39 views
49

Đoạn mã sau không tạo tệp (tôi không thể xem tệp ở bất kỳ đâu). Điều gì bị thiếu?Cách viết tệp văn bản Java

try { 
    //create a temporary file 
    String timeLog = new SimpleDateFormat("yyyyMMdd_HHmmss").format(
     Calendar.getInstance().getTime()); 
    File logFile=new File(timeLog); 

    BufferedWriter writer = new BufferedWriter(new FileWriter(logFile)); 
    writer.write (string); 

    //Close writer 
    writer.close(); 
} catch(Exception e) { 
    e.printStackTrace(); 
} 
+1

1- Thử gọi 'writer.flush()' trước khi đóng. 2 - Bạn nên sử dụng khối 'finally' để đảm bảo rằng' Writer' được đóng ngay cả khi có ngoại lệ – MadProgrammer

+0

bạn đang cố ghi tệp vào đâu? bạn cần phải xác định đường dẫn đầy đủ cho timeLog.ví dụ là nó dưới C: \? –

+1

@ user717630 Không thực sự. Nếu không có đường dẫn, tệp sẽ được ghi vào thư mục "đang hoạt động" hiện tại, thường là thư mục chương trình đã được thực hiện trong ... – MadProgrammer

Trả lời

102

Tôi nghĩ rằng kỳ vọng và thực tế của bạn không phù hợp (nhưng khi làm họ bao giờ hết;))

Về cơ bản, nơi bạn nghĩ rằng các tập tin được viết và nơi mà các tập tin thực sự được viết không bằng nhau (hmmm, có lẽ tôi nên viết một tuyên bố if;))

public class TestWriteFile { 

    public static void main(String[] args) { 
     BufferedWriter writer = null; 
     try { 
      //create a temporary file 
      String timeLog = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()); 
      File logFile = new File(timeLog); 

      // This will output the full path where the file will be written to... 
      System.out.println(logFile.getCanonicalPath()); 

      writer = new BufferedWriter(new FileWriter(logFile)); 
      writer.write("Hello world!"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       // Close the writer regardless of what happens... 
       writer.close(); 
      } catch (Exception e) { 
      } 
     } 
    } 
} 

Cũng lưu ý rằng ví dụ của bạn sẽ ghi đè lên bất kỳ tệp hiện có nào. Nếu bạn muốn chắp thêm văn bản vào tệp, bạn nên làm như sau:

writer = new BufferedWriter(new FileWriter(logFile, true)); 
+1

Không nên là phần cuối cùng: 'writer = new BufferedWriter (new FileWriter (logFile, true));' ?? Vì tham số chắp thêm dành cho FileWriter không phải BufferedWriter. –

+0

@third_eye Bạn đang làm hỏng niềm vui của tôi;) Rất hay, tôi đã cập nhật câu trả lời – MadProgrammer

+0

Đó là an toàn hơn và được khuyến nghị để chỉ định mã hóa: 'new FileWriterWithEncoding (logFile," UTF-8 ", true)' hoặc hơn. –

14

Tôi muốn thêm một chút nữa vào câu trả lời của MadProgrammer.

Trong trường hợp của nhiều dòng văn bản, khi thực hiện lệnh

writer.write(string); 

người ta có thể nhận thấy rằng các ký tự xuống dòng bị bỏ qua hoặc bỏ qua trong các tập tin văn bản mặc dù họ xuất hiện trong gỡ lỗi hoặc nếu cùng một văn bản được in vào nhà ga với,

System.out.println("\n"); 

Vì vậy, toàn bộ văn bản là một đoạn văn bản lớn không mong muốn trong hầu hết các trường hợp. Nhân vật xuống dòng có thể phụ thuộc vào nền tảng này, vì vậy nó là tốt hơn để có được nhân vật này từ các thuộc tính hệ thống java sử dụng

String newline = System.getProperty("line.separator"); 

và sau đó sử dụng các biến xuống dòng thay vì "\ n". Điều này sẽ có được đầu ra theo cách bạn muốn.

+1

writer.newLine() trực tiếp viết một dấu tách dòng, lấy từ System.getProperty ("line.separator") – Mike

13

Trong java 7 bây giờ có thể làm

try(BufferedWriter w = ....) 
{ 
    w.write(...); 
} 
catch(IOException) 
{ 
} 

và w.close sẽ được thực hiện tự động

0

Bạn có thể thử một thư viện Java. FileUtils, Nó có nhiều chức năng ghi vào tệp.

3

Nó không tạo tệp vì bạn chưa bao giờ thực sự tạo tệp. Bạn đã tạo ra một đối tượng cho nó. Tạo một cá thể không tạo tệp.

File newFile = new File("directory", "fileName.txt"); 

Bạn có thể làm điều này để tạo ra một tập tin:

newFile.createNewFile(); 

Bạn có thể làm điều này để tạo ra một thư mục:

newFile.mkdir(); 
0

Nó không làm việc với tôi. Hãy chắc chắn rằng bạn nối thêm ".txt" bên cạnh timeLog. Tôi đã sử dụng nó trong một chương trình đơn giản được mở bằng Netbeans và nó viết chương trình trong thư mục chính (nơi các thư mục builder và src).

Các vấn đề liên quan