首頁  >  文章  >  運維  >  Java讀linux檔名亂碼的解決辦法

Java讀linux檔名亂碼的解決辦法

藏色散人
藏色散人原創
2020-04-07 10:32:595480瀏覽

Java讀linux檔名亂碼的解決辦法

Java讀取linux系統檔案檔案名稱亂碼的解決方案

#1,問題描述

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 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;
}

當將讀取檔案資訊顯示到web頁面上時,中文檔案名稱出現亂碼。

2,解決方案

web系統呼叫該方法讀取檔案清單後,中文命名的檔案或資料夾顯示為亂碼。出現亂碼往往都是資料流編碼不一致導致的,檢查資料流編碼,首先查看tomcat伺服器和頁面顯示編碼都是utf-8編碼,在查看linux系統編碼為iso-8859-15,當然我們也知道java默認採用的是Unicode編碼,但這種預設Unicode編碼不是我們想要的utf-8編碼,所以我們需要自己轉碼。

解決方案1:

將linux系統編碼修改為utf-8,此方案比較簡單,不過要求使用者有系統root權限才可以修改。

解決方案2:

透過ja​​va程式轉碼,將系統編碼轉換為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;
}

頁面顯示檔名正常,但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;
}

這樣就可以解決java讀linux系統檔名亂碼問題。 。 。

解決亂碼問題就是從源頭追溯的顯示,一路糾結編碼就這麼簡單。 。 。

以上是Java讀linux檔名亂碼的解決辦法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn