Java が Linux システム ファイルのファイル名を文字化けして読み取る問題の解決策
1、問題の説明
Web アプリケーションで使用したいJava Linux システム ファイルを読み込んで Web ページに表示すると、中国語のファイル名が文字化けしますか?
問題シナリオの説明: ユーザーがブラウザを通じて Tomcat サーバーにアクセスし、特定のパスにあるファイル リスト情報の表示を要求すると、Tomcat Web アプリケーションは getFilesByPath(String path) メソッドを呼び出してファイル リストを読み取ります。ページは中国語です ファイル名は文字化けしています
推奨チュートリアル: 「java learning」
コードは次のとおりです:
ファイル クラス
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:
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; }
このページでは、ファイル名は正常であることが示されていますが、ファイルを移動するとパス パラメーターの中国語の文字が文字化けして、パスが存在しません。
解決策は、パス パラメーターを utf-8 からシステム エンコーディングに変換し、パスに従ってファイルをスキャンすることです。
/** * 根据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; }
これにより、Linux システムで Java が文字化けしたファイル名を読み取る問題を解決できます。 。 。
文字化けの問題を解決するには、ソースから表示をたどることになりますが、エンコードに四苦八苦するのはそれだけ簡単です。 。 。
以上がJava が Linux ファイル名を読み取る際の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。