Maison >Opération et maintenance >exploitation et maintenance Linux >Solution pour Java lisant les noms de fichiers Linux tronqués

Solution pour Java lisant les noms de fichiers Linux tronqués

藏色散人
藏色散人original
2020-04-07 10:32:595606parcourir

Solution pour Java lisant les noms de fichiers Linux tronqués

Solution pour Java lisant les noms de fichiers tronqués des fichiers système Linux

1. Description du problème

L'application Web souhaite utiliser Java Lire les fichiers système Linux et les afficher sur la page Web entraîne des noms de fichiers chinois tronqués ?

Description du scénario de problème : lorsque l'utilisateur accède au serveur Tomcat via le navigateur et demande à afficher les informations de la liste de fichiers sous un certain chemin, l'application Web Tomcat appelle la méthode getFilesByPath (String path) pour lire la liste de fichiers. informations en réponse à la demande La page est en chinois Le nom du fichier est tronqué.

Tutoriel recommandé : "Java learning"

Le code est le suivant :

Classe de fichiers

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

Le code java est comme suit :

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

Lorsque les informations du fichier lu sont affichées sur la page Web, le nom du fichier chinois apparaît tronqué.

2. Solution

Une fois que le système Web a appelé cette méthode pour lire la liste des fichiers, les fichiers ou dossiers nommés en chinois sont affichés sous forme de caractères tronqués. Les caractères tronqués sont souvent causés par un codage de flux de données incohérent. Pour vérifier le codage du flux de données, vérifiez d'abord que le codage du serveur Tomcat et de l'affichage de la page est tous deux codé en utf-8. Vérifiez que le codage du système Linux est iso-8859-15. , nous savons également que Java utilise par défaut le codage Unicode, mais ce codage Unicode par défaut n'est pas le codage utf-8 que nous souhaitons, nous devons donc le transcoder nous-mêmes.

Solution 1 :

Changez le codage du système Linux en utf-8. Cette solution est relativement simple, mais elle nécessite que l'utilisateur dispose des autorisations root du système avant de pouvoir la modifier.

Solution 2 :

Convertissez l'encodage du système en encodage utf-8 via le transcodage du programme 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;
}

Le nom de fichier affiché sur la page est normal, mais les caractères chinois du paramètre path apparaissent tronqués lors de la traversée du fichier, ce qui fait que le chemin n'existe pas.

La solution consiste à convertir le paramètre path de utf-8 en codage système, puis à parcourir le fichier en fonction du chemin.

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

Cela peut résoudre le problème de la lecture par Java des noms de fichiers tronqués dans les systèmes Linux. . .

Résoudre le problème des caractères tronqués consiste à retracer l'affichage à partir de la source. C'est aussi simple que cela de lutter jusqu'au bout avec l'encodage. . .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn