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

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

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

Collections APIは開発者に複数のクラスやインターフェイスを供給し、多くのオブジェクトを扱いやすくします。

Java

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

Q&A

解決済

1回答

4164閲覧

HashMapに入れたデータをテキストファイルに書き込み、読み込みができない

Y.Mamoru

総合スコア47

Collections API

Collections APIは開発者に複数のクラスやインターフェイスを供給し、多くのオブジェクトを扱いやすくします。

Java

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

0グッド

0クリップ

投稿2020/08/12 02:21

1.やりたいこと
標準入力した値を、HashMapを使ってkeyとvalueを設定
(0001,employerと打てば、数が社員番号・employerが社員の名前として登録される)

 設定したkeyと値をテキストファイルに書き込む

 その後、ファイルを読み込み、内容を表示させたい。

2.現状
mapの登録まではできている。
ファイルへの書き込みを行うコードも書いたが、読取りが出来ていないので正常に書きこめているのかを確かめられていない。

ーーーーー以下コードーーーーー

Java

1package Java_IO; 2 3import java.io.BufferedWriter; 4import java.io.FileOutputStream; 5import java.io.FileWriter; 6import java.io.IOException; 7import java.io.ObjectOutputStream; 8import java.io.PrintWriter; 9import java.util.LinkedHashMap; 10import java.util.Map; 11import java.util.Scanner; 12 13public class IO_Task_4 { 14 public static void main(String[] args) throws IOException{; 15     // FileWriterクラスのオブジェクトを生成する 16 FileWriter file = new FileWriter("Task_4.txt"); 17 // PrintWriterクラスのオブジェクトを生成する 18 PrintWriter pw = new PrintWriter(new BufferedWriter(file)); 19 20 //入力フォーム 21 System.out.println("文字を入力して下さい"); 22 Scanner scan = new Scanner(System.in); 23 24 //Map型の変数に代入する 25 Map<String , String> map = new LinkedHashMap<String , String>(); 26 27 while(true){ 28 String str = scan.nextLine(); 29 String[] array = new String[2]; 30 31 //printかどうかチェック 32 if(!str.equals("print")){ 33 if(!str.equals("end")){ 34 //map.getでkeyと値が存在するのか確認 35 //mapでもprintでもなければ、入力された文字を,で分けて、番号と名前に分ける 36 array = str.split(","); 37 String num = array[0]; 38 String name = array[1]; 39 if(map.get(num) == null){ 40 //番号が登録済みでなければ、mapに追加 41 map.put(num , name); 42 //ファイルに書きこむ 43 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Task_4.txt"))) { 44 oos.writeObject(map); 45 }catch(IOException e){ 46 e.printStackTrace(); 47 } 48 System.out.println("追加しました"); 49 }else{ 50 //すでに入力済みの場合 51 System.out.println(num + "はすでに入力されています"); 52 } 53 }else{ 54 //入力がendだった場合のシステム終了 55 System.out.println("システム終了"); 56 scan.close(); 57 break; 58 } 59 60 }else{ 61 //入力がprintだった場合の一覧表示 62 System.out.println("---Mapの要素一覧---"); 63 for(String key : map.keySet()){ 64 String value = map.get(key); 65 System.out.println(key + ":" + value); 66 } 67 System.out.println("------------"); 68 scan.close(); 69 break; 70 } 71 ; 72 73 } 74 pw.close(); 75 76 } 77 78

3.今考えている読み込みコード
以下のコードで読みこもうとしているのですが、結果正しくは表示されません。
表示されたものは、
仮表示 loadFactorI
です。

Java

1 2package Java_IO; 3 4 5import java.io.BufferedReader; 6import java.io.File; 7import java.io.FileReader; 8import java.io.IOException; 9 10public class IO_Task_5 { 11 public static void main(String[] args) throws IOException{ 12 13 FileReader reader = null; 14 15 try{ 16 File file = new File("Task_4.txt"); 17 BufferedReader br = new BufferedReader(new FileReader(file)); 18 19 System.out.println("仮表示"); 20 String buffer = br.readLine(); 21 buffer = br.readLine(); 22 23 while(buffer != null){ 24 System.out.println(buffer); 25 buffer = br.readLine(); 26 } 27 br.close(); 28 }catch(IOException e){ 29 e.printStackTrace(); 30 }finally{ 31 if(reader != null){ 32 try{ 33 reader.close(); 34 }catch(IOException e){ 35 e.printStackTrace(); 36 } 37 } 38 } 39 40 } 41} 42

様々なサイトをみながら作ってはいるのですが、イマイチ腑に落ちません。
宜しくお願いします。

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

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

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

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

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

yureighost

2020/08/12 02:45 編集

まず間違っているのがHashMapのオブジェクトそのものを書き出していることです。 Javaは残念ながらCollectionや配列のオブジェクトを出力メソッドにそのまま設定しても 値を一覧で書き出してくれるようなモダンな言語ではないので、 MapのEntrySetメソッドでSet型で取得する等して、for等のループ処理で要素を一つずつ書き込む必要があります。 それと気になるのがIO_Task_4クラスは入力値を一つ書き込んだら終わる動作になっているように見えますが、 そもそもMapを使う必要があるのでしょうか。
Y.Mamoru

2020/08/12 02:54

ご返信ありがとうございます。 Set型での値の取得をこれから試してみます。 そしてMapを使う必要性ですが、 入力の段階で、「num , name」を繰り返し入力できるようになっており 入力されたこれらのデータをまとめて、(numとnameを関連付けて)保存するために、Mapを使用しています。
guest

回答1

0

ベストアンサー

JavaのオブジェクトをObjectOutputStreamを使ってバイナリで出力しているので、それを読み込むにはObjectInputStreamを使います。

java

1try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))){ 2 Map<String, String> convert = (Map<String, String>) ois.readObject(); 3 System.out.println(convert); 4} catch (IOException|ClassNotFoundException e){ 5 e.printStackTrace(); 6}

ただ気になるのは、拡張子がtxtなのでバイナリを出力したかったのでしょうか?

投稿2020/08/12 02:54

A-pZ

総合スコア12011

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

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

Y.Mamoru

2020/08/12 02:58

ありがとうございます! いえ、最終的には文字として表示したいので、上記に合わせて文字列への変換が必要になるということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問