質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

15835閲覧

jarファイル実行時のファイル作成の文字コードについて

orange0190

総合スコア1698

JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2015/07/28 04:26

いつもお世話になっております。

現在、eclipse4.2を利用して、windows上で動くアプリケーションをjavaを用いて作成しております。
アプリケーションの作成はほぼ完了しており、eclipseでエクスポートを行いjarファイルを作成しました。

そのアプリケーションの機能でiPadからデータが送られてきたら、そのデータをPCに保存するという機能があり、拡張子「dat」のファイルを保存します。

しかし、現在次のような問題があり、困っています。どうかご助力をお願いします。

[問題点]

ファイル保存時、データはUTF-8として保存されるが、jarで実行した場合に、文字化けする。
eclipseから実行した場合には問題なく表示される。

jarファイルから実行した場合でも文字化けを起こさないようにするにはどうすればいいでしょうか。

iPadから送られてくるデータはUTF-8になっています。

作成した結果を載せます。
eclipseで実行・作成
eclipseで作成

jarファイルで実行・作成
jarファイルで作成

jarファイルで作成したファイルを以下の操作をすると次の画像のようになります。
メモ帳を開き、「ファイル」→「開く」から一度文字コードを「ANSI」で開く。その後、「ファイル」→「開く」から一度文字コードを「UTF-8」で開く。
jarファイルで作成2


また、環境は次のようになります。

java : 1.8.0_51
OS : windows7 64bit

以下がファイル作成部分のソースになります。

java

1BufferedWriter bw = null; 2BufferedReader br = null; 3 4String dirPath; 5try{ 6 dirPath = this.getDirPath(); //ディレクトリパスを取得 7}catch(IOException ioE){ 8 ioE.printStackTrace(); 9 dirPath = "."; 10} 11//ディレクトリ作成 12File dir = new File(dirPath); 13if(!dir.exists() || !dir.isDirectory()){ 14 dir.delete(); 15 dir.mkdirs(); 16} 17 18try{ 19 bw = new BufferedWriter(new OutputStreamWriter(this.outputStream)); 20 br = new BufferedReader(new InputStreamReader(this.inputStream)); 21 22 char c[] = new char[256]; 23 while(br.ready()){ 24 if((br.read(c, 0, c.length)) == -1){ 25 } 26 } 27 String kNo = new String(c); 28 String targetPath = dir.getCanonicalPath() + System.getProperty("file.separator") + kNo ; 29 targetPath = targetPath.replaceAll("\u0000", ""); 30 File uploadDir = new File(targetPath); 31 32 if(!uploadDir.exists() || !uploadDir.isDirectory()){ 33 uploadDir.delete(); 34 uploadDir.mkdirs(); 35 } 36 37 // 受信完了通知送信 38 bw.write("1"); 39 bw.flush(); 40 41 while(true){ 42 String fileName; 43 BufferedWriter fileBw; 44 int cLen = c.length; 45 for(int i = 0 ; i < cLen ; i++){ 46 // 配列cのクリア 47 c[i] = 0; 48 } 49 int len = -1; 50 51 // ファイル名受信 52 while(!br.ready()){ 53 } 54 if((len = br.read(c, 0, c.length)) != -1){ 55 // 受信完了通知送信 56 bw.write("1"); 57 bw.flush(); 58 fileName = new String(c); 59 if(len == 1 && c[0] == '.'){ 60 // ファイル名が「.」一文字だったらループ終了 61 System.out.println("exit"); 62 break; 63 } 64 65 String upFilePath = uploadDir.getCanonicalPath() + System.getProperty("file.separator") + fileName; 66 upFilePath = upFilePath.replaceAll("\u0000", ""); 67 File uploadFile = new File(upFilePath); 68 if(uploadFile.exists()){ 69 // ファイルが既に存在していた場合は削除しておく 70 uploadFile.delete(); 71 }else{ 72 uploadFile.createNewFile(); 73 } 74 fileBw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile))); 75 // データ受信とファイルへの書込み 76 try{ 77 for(int i = 0 ; i < cLen ; i++){ 78 // 配列cのクリア 79 c[i] = 0; 80 } 81 while((len = br.read(c, 0, c.length)) != -1){ 82 if(len == 1 && c[0] == '.'){ 83 fileBw.write(""); 84 break; 85 } 86 fileBw.write(c, 0, len); 87 88 for(int i = 0 ; i < cLen ; i++){ 89 // 配列cのクリア 90 c[i] = 0; 91 } 92 93 if(!br.ready()){ 94 break; 95 } 96 } 97 fileBw.flush(); 98 }catch(IOException ioE){ 99 ioE.printStackTrace(); 100 }finally{ 101 fileBw.close(); 102 } 103 104 // 受信完了通知を送信する 105 bw.write("1"); 106 bw.flush(); 107 } 108 } 109 110}catch(IOException ioE){ 111 ioE.printStackTrace(); 112 113 StringWriter sw = new StringWriter(); 114 PrintWriter pw = new PrintWriter(sw); 115 ioE.printStackTrace(pw); 116}finally{ 117 // バッファ、入出力用ストリーム、ソケットを閉じる 118 try{ 119 if(bw != null){ 120 // 受信完了通知送信 121 bw.write("1"); 122 bw.flush(); 123 bw.close(); 124 } 125 if(br != null){ 126 br.close(); 127 } 128 if(this.inputStream != null){ 129 this.inputStream.close(); 130 } 131 if(this.outputStream != null){ 132 this.outputStream.close(); 133 } 134 if(this.clientSocket != null){ 135 this.clientSocket.close(); 136 } 137 }catch(IOException ioE){ 138 ioE.printStackTrace(); 139 } 140}

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

文字コードをバッファリーダ、ライターに指定してはいかがでしょうか?

java

1 bw = new BufferedWriter(new OutputStreamWriter(this.outputStream), "UTF-8"); 2 br = new BufferedReader(new InputStreamReader(this.inputStream), "UTF-8");

投稿2015/07/28 05:08

tenraku

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orange0190

2015/07/28 05:23

回答ありがとうございます。 示していただいたコードでは、少々間違いがあったようでしてコンパイルできませんでしたが、次のようにしたらテスト環境ではうまくいきました。 bw = new BufferedWriter(new OutputStreamWriter(this.outputStream, "UTF-8")); br = new BufferedReader(new InputStreamReader(this.inputStream, "UTF-8")); 実環境で試してみます。
tenraku

2015/07/28 05:36

環境ないので試してない事を言っておくべきでした。ごめんなさい。
orange0190

2015/07/28 05:46

実環境で試した結果、文字化けを解消することができました。 ありがとうございました。
eripong

2015/07/28 06:05

参考情報です。 それで文字化けしないのであれば、ソースを変更せずにjava起動オプションに、 -Dfile.encoding=UTF-8 を指定しても解消すると思います。 元々、文字化けが発生したのがデフォルトファイルエンコーディングに頼っている ことによる様なので、eclipseから実行した際のデフォルトファイルエンコーディングが UTF-8でうまくいき、javaコマンドで実行した場合にはその環境に応じたものになり文字化けが発生していたのだと思います。 それから、ソースを修正して対応する場合、 fileBw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile))); も fileBw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile), "UTF-8")); としておかないと化けるケースがあるかもしれません。 また、質問と関係ないですが、 fileName = new String(c); のところは、 fileName = new String(c, 0, len); としないと、 配列cに格納されている0もStringに含まれてしまいます。 これが、"\u0000"がfileNameに入ってしまう原因と思います。
orange0190

2015/07/28 06:16

eripongさん、情報ありがとうございます。 デフォルトファイルエンコーディングが問題だったのですね。ひとまず、ソース修正で対応しました。 また、「"\u0000"がfileNameに入ってしまう」件に関して、こちらも一応解決済みですが、なぜeclipseで実行した場合とjarファイルで実行した場合に違いがでてしまうのでしょうか? eclipseで実行した場合には問題はありませんでした。
eripong

2015/07/28 07:01

うーん。 eclipseで動いた理由は分かりません。 そのときのコードはこのコードからにreplaceAll("\u0000", "")を追加しただけですか?
tenraku

2015/07/28 07:10 編集

Eclipseはデフォルトの文字コードをパッケージ毎に持ってるのでそこでUTF-8指定とかされてれば動くのではないでしょうか。(憶測ですが) ------------自己レス------------ ソースコードの文字コードなので関係ないですね。失礼しました。
eripong

2015/07/28 07:20

new String(c)が問題なのですが、 ディレクトリパスを作る流れはreplaceAll以外は変わっていないでしょうか?
orange0190

2015/07/28 08:52

replaceAll以外は変わっていません。
eripong

2015/07/29 00:57

そうですか。 ちょっとすぐには分からないです。 何か分かったらお伝えしますね。
guest

0

確信はないのですが,改行コードの違いによるものではないでしょうか.
改行コード - Wikipedia
iOSでは改行を「LF」だけで処理してバイトストリームにして送りますが,
Windowsでは「CR+LF」が改行コードであるためこれを改行とは判定しません.
対処の仕方を調べて,もう一度投稿させていただきます.

(すみません,文字化けを引き起こす原因ではなく,改行がおかしくなる原因です)

投稿2015/07/28 05:09

編集2015/07/28 05:26
KenTerada

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orange0190

2015/07/28 05:34

回答ありがとうございます。 申し訳ありません。画像はもともと1行のデータになるので、今回は改行は関係ないと思います。ただ、複数行になるものもありますので、対策を教えていただけますか?
KenTerada

2015/07/28 06:16

文字の位置がずれていたのは,改行が無くなったからではなかったのですね. 失礼しました. HTMLなどのプロトコルでは,改行コードは「CR+LF」とすることが決まっているそうです. これに習って,送受信するデータは「CR+LF」に統一するならば, iOS側でソケットに送信する前に,バッファ上で「LF」を「CR+LF」にすれば良いと思います. もしiOS側で行を含む文字列を取得する場合は,バッファ上で「CR+LF」を「LF」にすれば良いと思います. String lb = System.getProperty("line.separator"); で実行環境で使用している改行コードを取得できるそうです. どの環境でも動くようにするならば,送信前に, if (lb.compareTo("\r\n") != 0) str = str.replaceAll(lb. "\r\n") 受信後に, if (lb.compareTo("\r\n") != 0) str = str.replaceAll("\r\n", lb); とすれば,この問題を回避できると思います.
orange0190

2015/07/28 06:30

複数行の対策、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問