Java讀linux系統檔案檔名亂碼
阿新 • • 發佈:2019-02-02
1,問題描述
web應用想通過Java讀取linux系統檔案顯示到web頁面上,結果中文檔名出現亂碼?
問題場景描述:當用戶通過瀏覽器訪問tomcat伺服器,請求檢視某一路徑下檔案列表資訊,tomcat的web應用呼叫getFilesByPath(String path)方法讀取檔案列表資訊響應請求,頁面中文檔名出現亂碼。
程式碼如下:
檔案類
Java程式碼
java程式碼如下:
Java程式碼
當將讀取檔案資訊顯示到web頁面上時,中文檔名出現亂碼。
2,解決方案
web系統呼叫該方法讀取檔案列表後,中文命名的檔案或資料夾顯示為亂碼。出現亂碼往往都是資料流編碼不一致導致的,檢查資料流編碼,首先檢視tomcat伺服器和頁面顯示編碼都是utf-8編碼,在檢視linux系統編碼為iso-8859-15,當然我們也知道java預設採用的是Unicode編碼,但這種預設Unicode編碼不是我們想要的utf-8編碼,所以我們需要自己轉碼。
解決方案1:
將linux系統編碼修改為utf-8,該方案比較簡單,不過要求使用者有系統root許可權才可以修改。
解決方案2:
通過java程式轉碼,將系統編碼轉換為utf-8編碼。
Java程式碼
頁面顯示檔名正常,但path引數在遍歷檔案的時候中文出現了亂碼,導致路徑不存在。
解決方法是將path引數從utf-8轉換為系統編碼,再根據path去遍歷檔案。
Java程式碼
這樣就可以解決java讀linux系統檔名亂碼問題。。。
web應用想通過Java讀取linux系統檔案顯示到web頁面上,結果中文檔名出現亂碼?
問題場景描述:當用戶通過瀏覽器訪問tomcat伺服器,請求檢視某一路徑下檔案列表資訊,tomcat的web應用呼叫getFilesByPath(String path)方法讀取檔案列表資訊響應請求,頁面中文檔名出現亂碼。
程式碼如下:
檔案類
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
- 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程式碼如下:
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;
- }
當將讀取檔案資訊顯示到web頁面上時,中文檔名出現亂碼。
2,解決方案
web系統呼叫該方法讀取檔案列表後,中文命名的檔案或資料夾顯示為亂碼。出現亂碼往往都是資料流編碼不一致導致的,檢查資料流編碼,首先檢視tomcat伺服器和頁面顯示編碼都是utf-8編碼,在檢視linux系統編碼為iso-8859-15,當然我們也知道java預設採用的是Unicode編碼,但這種預設Unicode編碼不是我們想要的utf-8編碼,所以我們需要自己轉碼。
解決方案1:
將linux系統編碼修改為utf-8,該方案比較簡單,不過要求使用者有系統root許可權才可以修改。
解決方案2:
通過java程式轉碼,將系統編碼轉換為utf-8編碼。
Java程式碼
- /**
- * 根據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;
- }
頁面顯示檔名正常,但path引數在遍歷檔案的時候中文出現了亂碼,導致路徑不存在。
解決方法是將path引數從utf-8轉換為系統編碼,再根據path去遍歷檔案。
Java程式碼
- /**
- * 根據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;
- }
這樣就可以解決java讀linux系統檔名亂碼問題。。。
解決亂碼問題就是從源頭追溯的顯示,一路糾結編碼就這麼簡單。。。
轉載自:http://xmong.iteye.com/blog/1743150