最近項目中需要導出文件,其實導出文件是一個挺簡單的事情。但是卻遇到了很奇怪的問題。
首先導出到文件需要用到 BufferedWriter。而換行則是通過 bw.newline() 方法,問題將出在 newline() 方法上面。
我們看一下 newline() api:
1 /** 2 * Writes a line separator. The line separator string is defined by the 3 * system property <tt>line.separator</tt>, and is not necessarily a single 4 * newline ('\n') character. 5 * 6 * @exception IOException If an I/O error occurs 7 */ 8 public void newLine() throws IOException { 9 write(lineSeparator); 10 }
不同系統的換行符:
windows --> \r\n
linux --> \r
mac --> \n
【\r 是回車,return
\n 是換行,newline】
我們一般開發是在 windows 下開發,而服務器一般情況下都是 linux。
如果我們使用 newline 函數換行,在本機測試的時候,因為是 windows 環境,換行符是 \r\n ,打開文件時候自然文件是換行處理,沒有問題。
當我們部署到服務器時候,服務器是 linux 環境,newline 讀取系統換行符是 \r ,導出到文件,文件的換行符是 \r,當我們把這個文件通過瀏覽器下載到 windows 時候,再打開文件將會出現沒有換行的問題。因為 windows 下對於 \r 的解釋並不是換行符。
所以,我們在不同系統開發時候,如果需要指定文件在某些地方換行,則不能使用 newline 方法。
必須手動指定換行符:\r\n
因為在三個系統中,查看該文件, \r\n 都會解釋為換行。
以上。
