2010-05-14 51 views
46

Tôi đã tạo một tệp văn bản trong môi trường Unix bằng cách sử dụng mã Java.Vận chuyển trở lại Cấp nguồn cấp dữ liệu trong Java

Để ghi tệp văn bản tôi đang sử dụng java.io.FileWriterBufferedWriter. Và đối với dòng mới sau mỗi hàng tôi đang sử dụng phương pháp bw.newLine() (trong đó bw là đối tượng của BufferedWriter).

Và tôi đang gửi tệp văn bản đó bằng cách đính kèm trong thư từ môi trường Unix (tự động sử dụng các lệnh Unix).

Vấn đề của tôi là sau khi tải xuống tệp văn bản từ thư trong hệ thống Windows, nếu tôi mở tệp văn bản đó thì dữ liệu không được căn chỉnh đúng cách. newline() ký tự là không hoạt động, tôi nghĩ vậy.

Tôi muốn căn chỉnh tệp văn bản giống như trong môi trường Unix, nếu tôi mở tệp văn bản trong môi trường Windows.

Làm cách nào để giải quyết sự cố?

mã Java dưới đây để bạn tham khảo (chạy trong môi trường Unix):

File f = new File(strFileGenLoc); 
BufferedWriter bw = new BufferedWriter(new FileWriter(f, false)); 
rs = stmt.executeQuery("select * from jpdata"); 
while (rs.next()) { 
    bw.write(rs.getString(1)==null? "":rs.getString(1)); 
    bw.newLine(); 
} 
+0

Bạn sử dụng một khối mã cho văn bản? –

+0

Hệ thống đích để mở tệp luôn là cửa sổ hay nó sẽ thay đổi? –

Trả lời

56

Java chỉ biết về nền tảng hiện đang chạy, do đó, nó chỉ có thể cung cấp cho bạn đầu ra dựa trên nền tảng trên nền tảng đó (sử dụng bw.newLine()). Thực tế là bạn mở nó trên một hệ thống cửa sổ có nghĩa là bạn phải chuyển đổi tập tin trước khi sử dụng nó (sử dụng một cái gì đó bạn đã viết, hoặc sử dụng một chương trình như unix2dos), hoặc bạn phải xuất tập tin với các định dạng cửa sổ trả về vận chuyển trong nó ban đầu trong chương trình Java của bạn. Vì vậy, nếu bạn biết tập tin sẽ luôn luôn được mở trên một máy Windows, bạn sẽ phải đầu ra

bw.write(rs.getString(1)==null? "":rs.getString(1)); 
bw.write("\r\n"); 

Nó đáng chú ý là bạn sẽ không thể ra một tập tin đó sẽ xem xét chính xác về cả hai nền tảng nếu nó chỉ là văn bản thuần túy bạn đang sử dụng, bạn có thể muốn xem xét sử dụng html nếu nó là một email, hoặc xml nếu nó là dữ liệu. Ngoài ra, bạn có thể cần một số loại ứng dụng khách đọc dữ liệu và sau đó định dạng cho nền tảng mà người xem đang sử dụng.

+6

Trình tự kết thúc trên Windows là CR LF, không phải LF CR, vì vậy tôi sẽ thay đổi thành 'br.write ("\ r \ n"); '(thay vì' \ n \ r'). – Jesper

+0

@ Jesper - cảm ơn, tôi đã cập nhật nó cho phù hợp, tôi biết nó đã có hoặc thereabouts –

+1

Nếu tôi chạy cùng một mã trong một hệ thống Windows, tôi sẽ nhận được cùng một tập tin văn bản? Hoặc tập tin văn bản bây giờ có '\ r \ r \ n' (' \ r' thứ hai kết quả từ Windows Java mở rộng '\ n' thành' \ r \ n')? – ADTC

6

Phương pháp newLine() đảm bảo một dòng nền tảng tương thích mới được thêm vào (0Dh 0Ah cho hệ điều hành DOS, 0Dh cho máy Mac cũ, 0Ah cho Unix/Linux). Java không có cách nào để biết bạn sẽ gửi văn bản trên nền tảng nào. Chuyển đổi này nên được thực hiện bởi các thực thể gửi thư.

+0

tôi không nhận được bạn. bạn có thể vui lòng giải thích nó. – Manu

+1

Giả sử bạn chỉnh sửa văn bản bằng trình chỉnh sửa yêu thích của mình trong Linux. Nó sẽ làm gì khi bạn nhấn enter? Nó sẽ nối thêm một ký tự dòng mới. Trước khi làm như vậy, anh ta sẽ tự hỏi: nhân vật mới của tôi là gì? Là Linux, anh ta sẽ trả lời: '0Ah' tất nhiên. Nếu bạn gửi văn bản này đến một cửa sổ máy tính, cửa sổ máy chịu trách nhiệm chuyển đổi '0Ah' để '0Dh 0Ah' nếu không xem văn bản sẽ không được nhiều niềm vui. – nc3b

+0

@James: hiện đang nhắm mục tiêu hệ thống là Windows. nhưng nó có thể thay đổi sau một thời gian. Mọi trợ giúp sẽ được đánh giá cao. – Manu

2

bw.newLine(); không thể đảm bảo khả năng tương thích với tất cả các hệ thống.

Nếu bạn chắc chắn nó sẽ được mở trong cửa sổ, bạn có thể định dạng nó thành cửa sổ dòng mới.

Nếu bạn đang sử dụng lệnh unix gốc, hãy thử unix2dos và chuyển đổi tệp đã tạo thành định dạng cửa sổ rồi gửi thư.

Nếu bạn không sử dụng lệnh unix và muốn làm điều đó trong java, hãy sử dụng `` bw.write ("\ r \ n") `và nếu nó không làm phức tạp chương trình của bạn, hãy tìm phương pháp hệ điều hành và viết dòng mới thích hợp.

+0

@james: Tôi đang thử với bw.write ("\ r \ n"); Sau khi hoàn tất, hãy để bạn guys ... ngay bây giờ – Manu

+0

Xin chào bạn .. làm việc của nó .. trong thời gian này tôi sẽ sử dụng nó. Nếu có giải pháp nào khác .. vui lòng cho tôi biết .... – Manu

+0

Cảm ơn mọi nỗ lực – Manu

2

Nếu tôi hiểu bạn đúng, chúng tôi sẽ nói về tệp đính kèm tệp văn bản. Thats không may vì nếu đó là nội dung thư của email, bạn luôn có thể sử dụng "\ r \ n", tham chiếu đến http://www.faqs.org/rfcs/rfc822.html

Nhưng vì nó là tệp đính kèm, bạn phải sống với sự khác biệt của hệ thống. Nếu tôi ở trong giày của bạn, tôi sẽ chọn một trong các tùy chọn sau:

a) chỉ hỗ trợ khách hàng sử dụng cửa sổ bằng cách sử dụng "\ r \ n" làm dòng cuối.

b) cung cấp hai tệp đính kèm, một tệp có định dạng linux và một có định dạng cửa sổ.

c) Tôi không biết liệu tệp đính kèm có được đọc bởi người hay máy không, nhưng nếu đó là người tôi sẽ xem xét đính kèm tệp HTML thay vì văn bản thuần túy. di động hơn và đẹp hơn nhiều, quá :)

3

Không biết ai sẽ xem tệp của bạn, nhưng nếu bạn mở tệp đó trong bảng từ thay vì notepad, dấu ngắt dòng sẽ hiển thị chính xác. Trong trường hợp bạn đang sử dụng một phần mở rộng tập tin đặc biệt, hãy liên kết nó với wordpad và bạn đã hoàn thành nó. Hoặc sử dụng bất kỳ trình chỉnh sửa văn bản nâng cao nào khác.

0

Encapsulate nhà văn của bạn để cung cấp thay thế char, như thế này:

public class WindowsFileWriter extends Writer { 

    private Writer writer; 

    public WindowsFileWriter(File file) throws IOException { 
     try { 
      writer = new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-15"); 
     } catch (UnsupportedEncodingException e) { 
      writer = new FileWriter(logfile); 
     } 
    } 

    @Override 
    public void write(char[] cbuf, int off, int len) throws IOException { 
     writer.write(new String(cbuf, off, len).replace("\n", "\r\n")); 
    } 

    @Override 
    public void flush() throws IOException { 
     writer.flush(); 
    } 

    @Override 
    public void close() throws IOException { 
     writer.close(); 
    } 

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