Java-日本語のファイル名が文字化けしている

スターニー

親ターゲットディレクトリ内の複数のxlsxファイルにデータを書き込むスタンドアロンのJavaプロセスを実行しています。完了すると、ターゲットディレクトリ全体が圧縮されてクラウドにアップロードされ、ダウンロードリンクがユーザーに提供されます。xlsxファイル名とzipファイルの名前はユーザー定義であり、変更することはできません。

問題は、作成されたxlsxファイルの名前にあります。ユーザーが選択したファイル名が日本語の場合、

サイン色紙プレゼントCPN_第2.xlsx

システムで作成される対応するファイルの形式は次のとおりです。

?????????? CPN_?2?.xlsx

同じファイルがクラウドにアップロードされており、ユーザーには文字化けしたファイル名が表示されています。ただし、zipファイルの日本語名は文字化けしておらず、日本語のみです。

以下は、xlsxファイルを作成するためのコードサンプルです。

String fileName = userGivenName + "_" + randomUUID + ".xlsx";
File file = new File(tmpParentDirectoryName, fileName);

FileOutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);

この場合、作成されるxlsxファイルの絶対パスは次のようになります。

/ tmpDirectoryPath / ?????????? CPN_?2?_0c6b37ee-97c4-44d4-b80d-dfe5eafe0045.xlsx

上記と同様に、同じtmpDirectoryに複数のxlsxファイルが作成されます

完了したら、zipファイルを作成してクラウドにアップロードするためのコードサンプルを以下に示します。

File[] files = getFilesInFolder(tmpDirectory);
if (ArrayUtils.isEmpty(files)) {
        continue;
}

File zipFile = new File(targetDirectory, compressedFileName);
createZipFile(files, zipFile);
String url = uploadFile(compressedFileName, zipFile);

次のコードは、データをzipファイルに書き込みます。

public static void createZipFile(File[] files, File zipFile) {
    if (ArrayUtils.isEmpty(files)) {
        return;
    }

    byte[] buffer = new byte[1024];
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));

    try {
        for (File file : files) {
            FileInputStream fis = new FileInputStream(file);
            try {
                String fileName = URLDecoder.decode(file.getName(), "UTF-8");
                ZipEntry zipEntry = new ZipEntry(fileName);
                zos.putNextEntry(zipEntry);
                int length;
                while ((length = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, length);
                }
                zos.closeEntry();
            } finally {
                IOUtils.closeQuietly(fis);
            }
        }
    } finally {
        IOUtils.closeQuietly(zos);
    }
}

アップロードされたzipファイルの日本語名は正しいですが、zipファイルのzipエントリのxlsxファイル名が文字化けしています。

スタンドアロンJavaプロセスには、次のエンコードオプションがあります。

-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8

以下は、localeコマンドの出力です。

locale
LANG=en_IN.UTF-8
LC_CTYPE="en_IN.UTF-8"
LC_NUMERIC="en_IN.UTF-8"
LC_TIME="en_IN.UTF-8"
LC_COLLATE="en_IN.UTF-8"
LC_MONETARY="en_IN.UTF-8"
LC_MESSAGES="en_IN.UTF-8"
LC_PAPER="en_IN.UTF-8"
LC_NAME="en_IN.UTF-8"
LC_ADDRESS="en_IN.UTF-8"
LC_TELEPHONE="en_IN.UTF-8"
LC_MEASUREMENT="en_IN.UTF-8"
LC_IDENTIFICATION="en_IN.UTF-8"
LC_ALL=

誰かが私がここで間違っていることについて私に指示できますか?ユーザーが指定したものと同じファイル名をアップロードしたい。

スターニー

私はついにこれを破ることができました。問題は、Javaプロセスを実行していたmesosスレーブのシステムプロパティにありました。スレーブ上のプロセスは、起動スクリプトを使用してmesosマスタースケジューラーによって開始されました。このため、デフォルトのJavaロケールプロパティがスレーブで適切に設定されていませんでした。

スレーブの起動スクリプトに次の行を追加しました。

export LANG=en_IN.UTF-8

起動スクリプトにlocaleプロパティを明示的に追加すると、問題を解決できました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

抽出中に日本語のファイル名が文字化けしている

ファイルcsv java springのエクスポート時に日本語の文字がエラーになる

Javaで文字列として中国語と日本語の文字を使用する方法は?

Javaの単語のテキストファイルに文字列が含まれているかどうかを確認します

Javaは、文字列と別の文字を使用してファイルに名前を付けます

Windows上のJava:ファイル名の「/」スラッシュが区切り文字として機能しないようにする

Java-JTextFieldから日本語を取得し、ファイルに保存します

Java write int to fileは、ファイル内の「中国語」の文字を示しています

OracleからJava 7を使用している場合、File.list()がMac OS XでNON-ASCII文字を含むファイル名を誤って取得する

Javaの部分的なファイル名に基づいてファイルが存在するかどうかを確認します

Javaの拡張子を除いて、ファイル名から数字以外の文字を削除します

どの言語が適しているかでない場合でも、Javaを使用してファイル形式を作成できますか?

RegExを使用してJavaで単一ドットのファイル名を受け入れる

JavaでBufferedReaderを使用して.txtファイル内の特定の文字列を見つける方法

Javaを使用してファイル内の文字、母音、行の数を見つける方法は?

Javaの複数のパスからのファイル名に基づいてファイルをグループ化する方法

java antidecompilerバージョン8エラーが破損しているか、jarファイルの名前が変更されています

Java ファイル名文字列のファイル パスに「file:」プレフィックスを使用していますか?

Eclipseを実行しているときにJavaがファイルを見つけられない

シリアル化されてネットワーク経由で送信されるJavaファイルクラスには、ファイルに関するすべての情報が含まれているわけではありません

日本語のSRTファイルが文字化けし、iconvで修正するエンコーディングを決定できません

コンパイルする継承を使用してJavaファイルに名前を付ける

Javaを使用して、ファイル内の前後の単語に応じて単語を置き換える

Javaでファイル名の文字列を分割する方法

Javaを使用してテキストファイル内の特定の単語の隣の単語を抽出する

ベース名を使用してJavaで出力ファイルに名前を付ける

Java。テキストファイルからいくつかの単語やフレーズを見つけて表示します

空の.javaファイル名は機能していますか?

拡張Javaに基づいて特定のファイル名を取得します

TOP 一覧

  1. 1

    PictureBoxで画像のブレンドを無効にする

  2. 2

    レスポンシブウェブサイトの一番下にスティッキーなナビゲーションバーを作成するのに問題がある

  3. 3

    Rパッケージ「AppliedPredictiveModeling」のインストール中にエラーが発生しました

  4. 4

    Chromeウェブアプリのウェブビューの高さの問題

  5. 5

    HTTPヘッダー 'SOAPAction'の値はサーバーによって認識されませんでした

  6. 6

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  7. 7

    C ++でのcURLとマルチスレッドの使用

  8. 8

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  9. 9

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  10. 10

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  11. 11

    Spring @ModelAttributeモデルフィールドマッピング

  12. 12

    Python / SciPyのピーク検出アルゴリズム

  13. 13

    Ansibleで複数行のシェルスクリプトを実行する方法

  14. 14

    テキストフィールドの値に基づいて UIslider を移動します

  15. 15

    tf.nn_conv2dとtf.nn.depthwise_conv2dの違い

  16. 16

    ZScalerと証明書の問題により、Dockerを使用できません

  17. 17

    MLでのデータ前処理の背後にある直感

  18. 18

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  19. 19

    java.lang.NoClassDefFoundError:com / sun / istack / tools / DefaultAuthenticator $ Receiver

  20. 20

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  21. 21

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

ホットタグ

アーカイブ