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

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

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

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

Q&A

解決済

1回答

846閲覧

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

sanezane

総合スコア91

Java

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

0グッド

0クリップ

投稿2018/02/03 10:15

編集2018/02/03 10:17

やりたいこと:
総務部のリーダー田中太郎(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(); } }

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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

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

Java

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

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

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

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

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

  1. エラーメッセージもスクリーンショットではなく、質問欄にコピペで記載してくださいな。

エラメッセージはキーワード「プログラム言語名 エラーメッセージ」でぐぐると解決内容がヒットすることが多いです。

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

Java

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

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

Java

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

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

Java

1import java.io.FileInputStream; 2import java.io.FileOutputStream; 3import java.io.IOException; 4import java.io.ObjectInputStream; 5import java.io.ObjectOutputStream; 6 7public class Practice6 { 8 9 public static void main(String[] args) throws IOException { 10 Employee tanaka = new Employee(); 11 tanaka.name = "田中一郎"; 12 tanaka.age = 41; 13 Department soumubu = new Department(); 14 soumubu.name = "総務部"; 15 soumubu.leader = tanaka; 16 17 String desktop_dir = System.getProperty("user.home") + "\Desktop"; 18 System.out.println(desktop_dir); 19 String test_csv = desktop_dir + "\test用3.csv"; 20 try (FileOutputStream fos = new FileOutputStream(test_csv)) { 21 ObjectOutputStream oos = new ObjectOutputStream(fos); // シリアライズ 22 oos.writeObject(soumubu); 23 } 24 25 ProcessBuilder pb = new ProcessBuilder("notepad.exe", test_csv); 26 pb.start(); 27 // デシリアライズしてDepartmentクラスの内容を表示 28 Department load_data = readObject(test_csv); 29 System.out.println(load_data); 30 31 } 32 33 public static Department readObject(String file_name) throws IOException { 34 Department result = null; 35 try (FileInputStream fis = new FileInputStream(file_name)) { 36 try { 37 ObjectInputStream ois = new ObjectInputStream(fis); 38 result = (Department) ois.readObject(); 39 } catch (ClassNotFoundException ex) { 40 ex.printStackTrace(); 41 } 42 } 43 return result; 44 } 45} 46 47class Employee implements java.io.Serializable { 48 49 private static final long serialVersionUID = -1L; 50 String name; 51 int age; 52 53 @Override 54 public String toString() { 55 return String.format("%s%n%d", this.name, this.age); 56 } 57} 58 59class Department implements java.io.Serializable { 60 private static final long serialVersionUID = -1L; 61 String name; 62 Employee leader; 63 64 @Override 65 public String toString() { 66 return String.format("%s%n%s", this.name, leader.toString()); 67 } 68}

投稿2018/02/03 17:52

編集2018/02/04 05:48
umyu

総合スコア5846

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

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

sanezane

2018/02/04 03:40

ごちゃごちゃした質問に丁寧に答えていただきまして誠にありがとうございます。 回答者様にわかりにくい&回答しにくい質問の仕方だったと反省しております。 これからはumyuさんに指摘していただいた形式で質問します。 エラーについてももう少し自分で調べて検証した方が力になる場合もあると思うので臨機応変に対応します。 ホームディレクトリを取得してファイルと連結、ProcessBuilderの最初の引数にはプログラム名を渡す。 何回も繰り返しコードを書いて覚えたいと思います。ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問