1,問題描述
web應用想通過Java讀取linux系統文件顯示到web頁面上,結果中文文件名出現亂碼?
問題場景描述:當用戶通過瀏覽器訪問tomcat服務器,請求查看某一路徑下文件列表信息,tomcat的web應用調用getFilesByPath(String path)方法讀取文件列表信息響應請求,頁面中文文件名出現亂碼。
推薦教程:《java學習》
立即學習“Java免費學習筆記(深入)”;
代碼如下:
文件類
import?java.io.Serializable; import?java.util.Date; public?class?FileInfo?implements?Serializable{ /** *? */ private?static?final?long?serialVersionUID?=?1L; String?name; long?size; Date?lastModified; boolean?dir; public?String?getName()?{ return?name; } public?void?setName(String?name)?{ this.name?=?name; } public?long?getSize()?{ return?size; } public?void?setSize(long?size)?{ this.size?=?size; } public?Date?getLastModified()?{ return?lastModified; } public?void?setLastModified(Date?lastModified)?{ this.lastModified?=?lastModified; } public?boolean?isDir()?{ return?dir; } public?void?setDir(boolean?dir)?{ this.dir?=?dir; } }
java代碼如下:
/** *?根據path路徑查找出該路徑下可視文件列表 *?@param?path *?@return */ public?List<fileinfo>?getFilesByPath(String?path){ List<fileinfo>?fileList?=?new?ArrayList<fileinfo>(); File?file?=?new?File(path); /** *?查找可視文件列表 */ File[]?files?=?file.listFiles(new?FileFilter()?{ @Override public?boolean?accept(File?f)?{ return?!f.isHidden();//過濾隱藏文件 } }); /** *?java文件類型轉換為web顯示文件類 */ for?(File?f?:?files)?{ FileInfo?fileInfo?=?new?FileInfo(); fileInfo.setName(f.getName()); fileInfo.setSize(f.length()); fileInfo.setLastModified(new?Date(f.lastModified())); ?????????????????????fileInfo.setDir(f.isDirectory()); } return?fileList; }</fileinfo></fileinfo></fileinfo>
當將讀取文件信息顯示到web頁面上時,中文文件名出現亂碼。
2,解決方案
web系統調用該方法讀取文件列表后,中文命名的文件或文件夾顯示為亂碼。出現亂碼往往都是數據流編碼不一致導致的,檢查數據流編碼,首先查看tomcat服務器和頁面顯示編碼都是utf-8編碼,在查看linux系統編碼為iso-8859-15,當然我們也知道java默認采用的是Unicode編碼,但這種默認Unicode編碼不是我們想要的utf-8編碼,所以我們需要自己轉碼。
解決方案1:
將linux系統編碼修改為utf-8,該方案比較簡單,不過要求用戶有系統root權限才可以修改。
解決方案2:
通過java程序轉碼,將系統編碼轉換為utf-8編碼。
/** *?根據path路徑查找出該路徑下可視文件列表 *?@param?path *?@return */ public?List<fileinfo>?getFilesByPath(String?path){ //獲取系統編碼 String?encoding?=?System.getProperty("file.encoding"); List<fileinfo>?fileList?=?new?ArrayList<fileinfo>(); File?file?=?new?File(path); /** *?查找可視文件 */ File[]?files?=?file.listFiles(new?FileFilter()?{ @Override public?boolean?accept(File?f)?{ return?!f.isHidden(); } }); /** *?java文件類型轉換為web顯示文件類型 */ for?(File?f?:?files)?{ FileInfo?fileInfo?=?new?FileInfo(); try?{ //將系統編碼encoding轉換為utf-8編碼 fileInfo.setName(new?String(f.getName().getBytes(encoding),"UTF-8")); }?catch?(UnsupportedEncodingException?e)?{ e.printStackTrace(); } fileInfo.setSize(f.length()); fileInfo.setLastModified(new?Date(f.lastModified())); ???????????????????????fileInfo.setDir(f.isDirectory()); } return?fileList; }</fileinfo></fileinfo></fileinfo>
頁面顯示文件名正常,但path參數在遍歷文件的時候中文出現了亂碼,導致路徑不存在。
解決方法是將path參數從utf-8轉換為系統編碼,再根據path去遍歷文件。
/** *?根據path路徑查找出該路徑下可視文件列表 *?@param?path *?@return */ public?List<fileinfo>?getFilesByPath(String?path)?throws?Exception{ //獲取系統編碼 String?encoding?=?System.getProperty("file.encoding"); List<fileinfo>?fileList?=?new?ArrayList<fileinfo>(); try?{ //將path路徑轉碼為系統編碼 File?file?=?new?File(new?String(path.getBytes("UTF-8"),encoding)); //判斷文件路徑是否存在,是否有讀權限,如不存在或者沒有權限則拋出異常 if(file.exists()?&&?file.isDirectory()?&&?file.canRead()){ /** *?查找可視文件 */ File[]?files?=?file.listFiles(new?FileFilter()?{ @Override public?boolean?accept(File?f)?{ return?!f.isHidden(); } }); /** *?java文件類型轉換為web顯示文件類型 */ for?(File?f?:?files)?{ FileInfo?fileInfo?=?new?FileInfo(); //將系統編碼encoding轉換為utf-8編碼 fileInfo.setName(new?String(f.getName().getBytes(encoding),"UTF-8")); fileInfo.setSize(f.length()); fileInfo.setLastModified(new?Date(f.lastModified())); fileInfo.setDir(f.isDirectory()); } }else{ throw?new?Exception("Paht:"+path+",?exists:"+file.exists()+",?canRead:"+file.isDirectory()); } }?catch?(UnsupportedEncodingException?e1)?{ e1.printStackTrace(); } return?fileList; }</fileinfo></fileinfo></fileinfo>
這樣就可以解決java讀linux系統文件名亂碼問題。。。
解決亂碼問題就是從源頭追溯的顯示,一路糾結編碼就這么簡單。。。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END