Java讀linux文件名亂碼的解決辦法

Java讀linux文件名亂碼的解決辦法

Javalinux系統文件文件名亂碼的解決辦法

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()?&amp;&amp;?file.isDirectory()?&amp;&amp;?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
喜歡就支持一下吧
點贊10 分享