Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Lösung für das Lesen verstümmelter Linux-Dateinamen durch Java

Lösung für das Lesen verstümmelter Linux-Dateinamen durch Java

藏色散人
藏色散人Original
2020-04-07 10:32:595569Durchsuche

Lösung für das Lesen verstümmelter Linux-Dateinamen durch Java

Lösung für Java, das verstümmelte Dateinamen von Linux-Systemdateien liest

1. Problembeschreibung

Die Webanwendung möchte Verwenden Sie Java. Das Lesen von Linux-Systemdateien und deren Anzeige auf der Webseite führt zu verstümmelten chinesischen Dateinamen?

Beschreibung des Problemszenarios: Wenn der Benutzer über den Browser auf den Tomcat-Server zugreift und anfordert, die Dateilisteninformationen unter einem bestimmten Pfad anzuzeigen, ruft die Tomcat-Webanwendung die Methode getFilesByPath(String path) auf, um die Dateiliste zu lesen Informationen als Antwort auf die Anfrage. Die Seite ist auf Chinesisch. Der Dateiname ist verstümmelt.

Empfohlenes Tutorial: „Java-Lernen

Der Code lautet wie folgt:

Dateiklasse

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

Der Java-Code lautet wie folgt:

/**
* 根据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;
}

Wenn die gelesenen Dateiinformationen auf der Webseite angezeigt werden, erscheint der chinesische Dateiname verstümmelt.

2. Lösung

Nachdem das Websystem diese Methode zum Lesen der Dateiliste aufruft, werden die auf Chinesisch benannten Dateien oder Ordner als verstümmelte Zeichen angezeigt. Verstümmelte Zeichen werden häufig durch eine inkonsistente Datenstromkodierung verursacht. Überprüfen Sie zunächst, ob sowohl der Tomcat-Server als auch die Seitenanzeigekodierung ISO-8859-15 sind Wir wissen auch, dass Java standardmäßig die Unicode-Codierung verwendet, aber diese Standard-Unicode-Codierung ist nicht die UTF-8-Codierung, die wir wollen, also müssen wir sie selbst transkodieren.

Lösung 1:

Ändern Sie die Linux-Systemkodierung auf utf-8. Diese Lösung ist relativ einfach, erfordert jedoch, dass der Benutzer über System-Root-Rechte verfügt, bevor sie geändert werden kann.

Lösung 2:

Konvertieren Sie die Systemkodierung durch Java-Programmtranskodierung in UTF-8-Kodierung.

/**
* 根据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;
}

Der auf der Seite angezeigte Dateiname ist normal, aber die chinesischen Zeichen des Pfadparameters werden beim Durchlaufen der Datei verstümmelt, was dazu führt, dass der Pfad nicht existiert.

Die Lösung besteht darin, den Pfadparameter von utf-8 in die Systemkodierung zu konvertieren und dann die Datei entsprechend dem Pfad zu durchlaufen.

/**
* 根据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;
}

Dies kann das Problem lösen, dass Java in Linux-Systemen verstümmelte Dateinamen liest. . .

Die Lösung des Problems verstümmelter Zeichen besteht darin, die Anzeige von der Quelle aus zu verfolgen. So einfach ist es, sich mit der Kodierung herumzuschlagen. . .

Das obige ist der detaillierte Inhalt vonLösung für das Lesen verstümmelter Linux-Dateinamen durch Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn