いろいろな問題が多数ありますが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, 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/04 03:40