🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

2回答

3482閲覧

java シリアライズ ファイルに書き込み 文字化けする

kokok

総合スコア145

Java

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

0グッド

0クリップ

投稿2019/10/16 03:04

java

1package partThree; 2 3import java.io.File; 4import java.io.FileInputStream; 5import java.io.FileNotFoundException; 6import java.io.FileOutputStream; 7import java.io.IOException; 8import java.io.ObjectInputStream; 9import java.io.ObjectOutput; 10import java.io.ObjectOutputStream; 11 12public class Drill310 { 13 14 public static void main(String[] args) { 15 16 Employee2 emp = new Employee2("田中", 250000); 17 18 try { 19 20 boolean result; 21 String arg2 = args[1]; 22 23 if (args.length != 2) { 24 System.out.println("引数の指定が間違っています"); 25 System.exit(1); 26 } 27 28 File file = new File(args[0]); 29 30 OptionAnalysis opt = new OptionAnalysis(arg2); 31 32 result = opt.optCheck(); 33 34 if (result == false) { 35 System.out.println("オプションの指定が間違っています"); 36 37 opt.usage(); 38 39 System.exit(1); 40 } 41 42 if ((arg2.equals("/w") || arg2.equals("/W"))) { 43 44 ObjectOutput out = new ObjectOutputStream(new FileOutputStream(file)); 45 out.writeObject(emp); 46 47 out.flush(); 48 out.close(); 49 System.out.println(file); 50 System.out.println("インスタンスを保存しました"); 51 // bufferedReader.close(); 52 } else if (arg2.equals("/r") || arg2.equals("/R")) { 53 54 ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); 55 Employee2 empInput = (Employee2) in.readObject(); 56 57 empInput.show(); 58 System.out.println("インスタンスを読み出しました"); 59 60 in.close(); 61 62 } 63 64 } catch (FileNotFoundException e) { 65 e.printStackTrace(); 66 } catch (ClassNotFoundException e) { 67 68 } catch (IOException e) { 69 e.printStackTrace(); 70 } 71 } 72 73} 74

java

1 2package partThree; 3 4import java.io.Serializable; 5 6public class Employee2 implements Serializable { 7 8 private String name; 9 private int salary; 10 11 public void show() { 12 13 System.out.print("私の名前は、" + this.name + "です。"); 14 System.out.println("私の給与は、" + this.salary + "です。"); 15 16 } 17 18 public Employee2(String name, int salary) { 19 this.name = name; 20 this.salary = salary; 21 22 } 23 24} 25

java

1package partThree; 2 3public class OptionAnalysis { 4 5 private String opt; 6 private String write1 = "/w"; 7 private String write2 = "/W"; 8 private String read1 = "/r"; 9 private String read2 = "/R"; 10 11 public OptionAnalysis(String opt) { 12 13 this.opt = opt; 14 15 } 16 17 public boolean optCheck() { 18 19 boolean result; 20 21 if ((opt.equals(write1) || opt.equals(write2)) || (opt.equals(read1) || opt.equals(read2))) { 22 23 result = true; 24 25 } else { 26 27 result = false; 28 } 29 30 return result; 31 32 } 33 34 public void usage() { 35 36 System.out.println("オプションの指定"); 37 System.out.println("/wもしくは,/W =ファイル書き込み"); 38 System.out.println("/rもしくは,/R =ファイル読み込み"); 39 } 40 41} 42

Employee2 のオブジェクトの情報をファイルに書き込みたいと思っております。

現在、のコードだと書き込むと

ャ・ sr partThree.Employee2}K・笑コ゚ I salaryL namet Ljava/lang/String;xp ミ腎 逕ー荳ュ

となってしまいます。(windows10です)

書き込んだファイルを読みだしてみると

私の名前は、田中です。私の給与は、250000です。
インスタンスを読み出しました

と文字化けしません。

windows10のメモ帳で開いているのですが、色々文字コードを変えて開いてみましたが、文字化けが治りませんでした。
(ANSI,Unicode,UTF-8などを試してみました)

なかなか、原因が掴めなかったのでアドバイス頂けると助かります。

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

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

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

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

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

guest

回答2

0

それは文字化けではなくバイトコード、つまりJavaランタイムがオブジェクトの情報として認識できる形式で保存しているものを、人間が認識できる文字列で表示しようとしているからです。

投稿2019/10/16 03:15

A-pZ

総合スコア12011

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

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

kokok

2019/10/16 04:28

回答ありがとうございます。 人間がわかるように表示はできないのでしょうか?
guest

0

ベストアンサー

シリアライズの意味を誤解しているのでは?
シリアライズしたデータは、デシリアライズで復元するためのものです。
そのまま読める形式とは限りません。
読みたければ、デシリアライズしてオブジェクトに戻してオブジェクトの内容を適切に表示してください。

投稿2019/10/16 12:37

otn

総合スコア85893

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

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

kokok

2019/10/17 00:14

回答ありがとうございます。 理解できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問