Java が Linux ファイル名を読み取る際の解決策
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
