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

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

ただいまの
回答率

87.77%

シリアライズ時のcsvの文字化け

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,363

score 86

やりたいこと:
総務部のリーダー田中太郎(41歳)のインスタンスをJVM内に生成したうえで直列化機構を使ってファイル【C:\Users\☆☆☆\Desktop\test用3.csv】に書き込むプログラムを作成し、そのcsvを呼び出したい。

現状:
まずはcsvに書き込もうということで、書き込みはできるのですが文字化けしてしまい、書き込みたい内容が書き込めているのかの確認ができません。
文字化けしたものでもいいので呼び出そうと思いProcessBuilderで呼び出してみたもののエラーが出てしまいました。自分の知識では解決できそうにありません。
まずは文字化けを直して、その後ファイルをプログラムから呼び出して確認したいです。
どなたか知恵をお貸し願います。
コード、エラー時のエビデンスを掲載します。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Practice6 {

    public static void main(String[] args) throws IOException {
        // TODO 自動生成されたメソッド・スタブ
        //総務部のリーダー田中太郎(41歳)のインスタンスをJVM内に生成したうえで直列化機構を使ってファイルC:\Users\☆☆☆\Desktop\test用3.csvに書き込むプログラムを作成
        Employee tanaka = new Employee();
        tanaka.name = "田中一郎";
        tanaka.age = 41;
        Department soumubu = new Department();
        soumubu.name = "総務部";
        soumubu.leader = tanaka;

        FileOutputStream fos = new FileOutputStream("C:\\Users\\☆☆☆\\Desktop\\test用3.csv");

//試してみたモノ        
//BufferedWriter fos = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\yosuk\\Desktop\\test用3.csv"),"Shift-JIS"));

/*PrintWriter fos = new PrintWriter(new BufferedWriter
            (new OutputStreamWriter(new FileOutputStream("C:\\Users\\☆☆☆\\Desktop\\test用3.csv"),"Shift-JIS")));*/


        ObjectOutputStream oos = new ObjectOutputStream(fos);  //シリアライズ
        oos.writeObject(soumubu);

        ProcessBuilder pb = new ProcessBuilder("C:\\Users\\☆☆☆\\Desktop\\test用3.csv");
        pb.start();

    }

}


イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

いろいろな問題が多数ありますが1個ずつ説明します。

1, まず質問文のエラー解決方法

プロセスはファイルにアクセスできません。別のプロセスが使用中です。

FileOutputStream のインスタンス(変数:fos)に対してclose処理を行っていないため、Javaプログラム内ではファイルを開いた状態です。
そのため、ProcessBuilderで別プロセスを生成しファイルを開こうとするとアクセスできません。
try~with~Resources文を使ったclose処理のサンプルです。

try (FileOutputStream fos = new FileOutputStream(test_csv)) {
    ObjectOutputStream oos = new ObjectOutputStream(fos); // シリアライズ
    oos.writeObject(soumubu);
}


何かをオープンしたら不要になったタイミングで必ずクローズ処理を呼び出すこれを徹底してくださいな。

まずはcsvに書き込もうということで、書き込みはできるのですが文字化けしてしまい

2, 文字化けではなくて、ObjectOutputStreamなのでバイト配列でファイルを正しく書き込めています。
質問者様がCSV形式で書き込みたいなら、CSVのライブラリを探して使用するか、自分で記述する必要があります。
CSV形式で書き込みたいというわけではないのですよね?

<質問について>

  1. 質問文のコードは回答者がコンパイルできる形で記載してくださいな。
    EmployeeクラスとDepartmentクラスの定義がありませんでしたこちらで推測して作成しました。
    認識の齟齬を少なくするため、コンパイル可能な最低限のソースコードを質問文に記載してくださいな。

  2. エラーメッセージもスクリーンショットではなく、質問欄にコピペで記載してくださいな。
    エラメッセージはキーワード「プログラム言語名 エラーメッセージ」でぐぐると解決内容がヒットすることが多いです。

<その他>
1, System.getProperty("user.home");を使用するとユーザーのホームディレクトリが取得できます。
デスクトップにファイルを書き出したい時は、このパスを連結すればいいです。

String desktop_dir = System.getProperty("user.home") + "\\Desktop";
System.out.println(desktop_dir);
String test_csv = desktop_dir + "\\test用3.csv";


2, ProcessBuilderのコンストラクタの一番最初の引数にはCSVを開きたいプログラム名を渡してくださいな。

ProcessBuilder pb = new ProcessBuilder("notepad.exe", test_csv);
pb.start();

最後に変更版のソースコードを記載しておきます、ご参考まで。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Practice6 {

    public static void main(String[] args) throws IOException {
        Employee tanaka = new Employee();
        tanaka.name = "田中一郎";
        tanaka.age = 41;
        Department soumubu = new Department();
        soumubu.name = "総務部";
        soumubu.leader = tanaka;

        String desktop_dir = System.getProperty("user.home") + "\\Desktop";
        System.out.println(desktop_dir);
        String test_csv = desktop_dir + "\\test用3.csv";
        try (FileOutputStream fos = new FileOutputStream(test_csv)) {
            ObjectOutputStream oos = new ObjectOutputStream(fos); // シリアライズ
            oos.writeObject(soumubu);
        }

        ProcessBuilder pb = new ProcessBuilder("notepad.exe", test_csv);
        pb.start();
        // デシリアライズしてDepartmentクラスの内容を表示
        Department load_data = readObject(test_csv);
        System.out.println(load_data);

    }

    public static Department readObject(String file_name) throws IOException {
        Department result = null;
        try (FileInputStream fis = new FileInputStream(file_name)) {
            try {
                ObjectInputStream ois = new ObjectInputStream(fis);
                result = (Department) ois.readObject();
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }
}

class Employee implements java.io.Serializable {

    private static final long serialVersionUID = -1L;
    String name;
    int age;

    @Override
    public String toString() {
        return String.format("%s%n%d", this.name, this.age);
    }
}

class Department implements java.io.Serializable {
    private static final long serialVersionUID = -1L;
    String name;
    Employee leader;

    @Override
    public String toString() {
        return String.format("%s%n%s", this.name, leader.toString());
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/04 12:40

    ごちゃごちゃした質問に丁寧に答えていただきまして誠にありがとうございます。
    回答者様にわかりにくい&回答しにくい質問の仕方だったと反省しております。
    これからはumyuさんに指摘していただいた形式で質問します。
    エラーについてももう少し自分で調べて検証した方が力になる場合もあると思うので臨機応変に対応します。

    ホームディレクトリを取得してファイルと連結、ProcessBuilderの最初の引数にはプログラム名を渡す。
    何回も繰り返しコードを書いて覚えたいと思います。ありがとうございました!!!

    キャンセル

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

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る