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

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

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

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

Q&A

4回答

11253閲覧

Javaの質問です。テキストファイルのデータを上書き(部分的に削除)したいです。お力をお貸しください。

YuukiA

総合スコア10

Java

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

0グッド

1クリップ

投稿2016/01/27 16:52

編集2016/01/27 17:49

初めて利用させていただきます。

現在私は、テキストファイルを用いるJavaの勉強をしております。
テキストファイルに、コンソールで入力した「name」「job」「sex」を出力する、また、テキストファイルに書き込まれたデータをコンソールに表示する機能はなんとか作成することが出来ました。

しかし、テキストファイルに書き込まれているデータを上書き(部分的に削除)する機能で詰まってしまいました。自分なりに調べたり、試してみたのですが思うように出来ませんでした。
上書き(一部削除)する時は、数字が入力されたら、それに対応した「Person」クラスの「name」「job」「sex」を一括でしたいです。

どなたかお力をお貸しください。お手数ですが、よろしく御願い致します。


//txtのデータ
List.1//1が入力されたら削除
田中
医者
男性
List.2//2が入力されたら削除
鈴木
看護師
女性

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

public class Editing {
class Person { // 1人分のデータを格納するクラス
private String name;
private String job;
private String sex;

public String getName() { return name; } public void setName(String name) { this.name = name; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } } private boolean checkBeforeReadFile(File file) { if (file.exists()) { if (file.isFile() && file.canRead()) { return true; } } return false; }

// ファイルを読み込む
public ArrayList<Person> readFile(File file) {
int i = 0;
ArrayList<Person> list = new ArrayList<Person>();
BufferedReader br = null;
try {
if (checkBeforeReadFile(file)) {
br = new BufferedReader(new FileReader(file));
String line = null;
Person person = null;
while ((line = br.readLine()) != null) {
switch (i) {
case 0: // 名前
person = new Person(); // Person クラスのインスタンスを生成
person.setName(line); // 名前を格納
i++; // 次は i = 1 → 職業
break;
case 1: // 職業
person.setJob(line); // 職業を格納
i++; // 次は i = 2 → 性別
break;
case 2: // 性別
person.setSex(line); // 性別を格納
list.add(person); // 1人分のデータの格納が完了したので、リストに追加
i=0; // 次は i = 0 → 名前
break;

} } } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return list; }

// 全員分のデータを表示する
private void showPeople(ArrayList<Person> list) {
for (Person person : list) {
System.out.println("名前:" + person.getName());
System.out.println("職業:" + person.getJob());
System.out.println("性別:" + person.getSex());
}
}
public static void main(String[] args) {
try{
File file = new File("sample.txt");

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file,true))); BufferedReader br = new BufferedReader(new FileReader(file)); Editing editing = new Editing(); ArrayList<Person> list = editing.readFile(file); editing.showPeople(list); System.out.println("0:新規登録 1:削除"); int input = new java.util.Scanner(System.in).nextInt(); if(input == 0){ System.out.println("名前を入力してください"); String name = new java.util.Scanner(System.in).nextLine(); System.out.println("仕事を入力してください"); String job = new java.util.Scanner(System.in).nextLine(); System.out.println("性別を入力してください"); String sex = new java.util.Scanner(System.in).nextLine(); pw.println(name); pw.println(job); pw.println(sex); /* pw.println("\n");*/ pw.close(); System.out.println("連絡先を追加しました"); } if(input == 1){ //削除 } } catch(IOException e){ System.out.println(e); } }

}

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

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

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

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

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

guest

回答4

0

与えられたファイルの形式は適切とはおもいませんが、ひとまずはそれに従うコードを書いてみました。
部分的削除は面倒なので、追加・削除にかかわらず、つねにフィアルは全体を書きなおしています。

java

1import java.io.BufferedReader; 2import java.io.BufferedWriter; 3import java.io.File; 4import java.io.FileReader; 5import java.io.FileWriter; 6import java.io.IOException; 7import java.io.PrintWriter; 8import java.util.ArrayList; 9import java.util.List; 10import java.util.Scanner; 11 12public class Editing { 13 private static int MAX_ID_LENGTH = 100; 14 private static int MAX_NAME_LENGTH = 100; 15 private static int MAX_JOB_LENGTH = 100; 16 private static int SEX_LENGTH = 2; 17 18 class Person { // 1人分のデータを格納するクラス 19 private final String id; 20 private final String name; 21 private final String job; 22 private final String sex; 23 24 public Person(String id, String name, String job, String sex) { 25 if (id.length() == 0 || id.length() > MAX_ID_LENGTH) { 26 throw new IllegalArgumentException("id is illegal." + id); 27 } 28 if (name.length() == 0 || name.length() > MAX_NAME_LENGTH) { 29 throw new IllegalArgumentException("name is illegal." + name); 30 } 31 if (job.length() == 0 || job.length() > MAX_JOB_LENGTH) { 32 throw new IllegalArgumentException("job is illegal." + job); 33 } 34 if (sex.length() != SEX_LENGTH) { 35 throw new IllegalArgumentException("sex is illegal." + sex); 36 } 37 this.id = id; 38 this.name = name; 39 this.job = job; 40 this.sex = sex; 41 } 42 43 public String getId() { 44 return id; 45 } 46 47 public String getName() { 48 return name; 49 } 50 51 public String getJob() { 52 return job; 53 } 54 55 public String getSex() { 56 return sex; 57 } 58 59 public String toString() { 60 String ans = ""; 61 ans += (this.getId()); 62 ans += (",[" + this.getName() + "]"); 63 ans += (", " + this.getJob() + "]"); 64 ans += (", " + this.getSex() + "]"); 65 return ans; 66 } 67 } 68 69 // path が存在する、ファイルである、読み込み可能である ことをチェックする。 70 private boolean checkBeforeReadFile(File path) { 71 if (path.exists() && path.isFile() && path.canRead()) { 72 return true; 73 } else { 74 return false; 75 } 76 } 77 78 // ファイルに出力する。 79 public void writeFile(String file, List<Person> people) throws IOException { 80 PrintWriter pw = null; 81 try { 82 pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); 83 for (Person person : people) { 84 pw.println(person.id); 85 pw.println(person.name); 86 pw.println(person.job); 87 pw.println(person.sex); 88 } 89 } finally { 90 if (pw != null) { 91 pw.close(); 92 } 93 } 94 } 95 96 // ファイルを読み込む。 97 public List<Person> readFile(String file_name) throws IOException { 98 List<Person> list = new ArrayList<Person>(); 99 BufferedReader br = null; 100 try { 101 File file = new File("sample.txt"); 102 if (checkBeforeReadFile(file)) { 103 br = new BufferedReader(new FileReader(file)); 104 String line = null; 105 int i = 0; 106 String str[] = { null, null, null, null }; // { id, name, job, 107 // sex } 108 while ((line = br.readLine()) != null) { 109 str[i % 4] = line; 110 i++; 111 if (i % 4 == 0) { 112 list.add(new Person(str[0], str[1], str[2], str[3])); 113 } 114 } 115 } 116 } finally { 117 if (br != null) { 118 try { 119 br.close(); 120 } catch (IOException e) { 121 e.printStackTrace(); 122 } 123 } 124 } 125 return list; 126 } 127 128 public void addPerson(String file_name, List<Person> people, String name, String job, String sex) 129 throws IOException { 130 String id = "List:" + (people.size() + 1); 131 Person person = new Person(id, name, job, sex); 132 people.add(person); 133 writeFile(file_name, people); 134 } 135 136 public boolean deletePerson(String file_name, List<Person> people, String id) throws IOException { 137 for (Person person : people) { 138 if (person.getId().equals(id)) { 139 people.remove(person); 140 writeFile(file_name, people); 141 return true; 142 } 143 } 144 return false; 145 } 146 147 // 全員分のデータを表示する 148 private void showPeople(List<Person> list) { 149 for (Person person : list) { 150 System.out.println("ID:" + person.getId()); 151 System.out.println("名前:" + person.getName()); 152 System.out.println("職業:" + person.getJob()); 153 System.out.println("性別:" + person.getSex()); 154 } 155 } 156 157 public static void action() { 158 String file_name = "sample.txt"; 159 try { 160 Scanner scanner = new Scanner(System.in); 161 Editing editing = new Editing(); 162 163 while (true) { 164 System.out.println("0:新規登録 1:削除 2:表示 9: 終了"); 165 String line = scanner.nextLine(); 166 int input = Integer.parseInt(line); 167 if (input == 0) { 168 System.out.println("名前を入力してください"); 169 String name = scanner.nextLine(); 170 System.out.println("仕事を入力してください"); 171 String job = scanner.nextLine(); 172 System.out.println("性別を入力してください"); 173 String sex = scanner.nextLine(); 174 List<Person> list = editing.readFile(file_name); 175 editing.addPerson(file_name, list, name, job, sex); 176 System.out.println("追加しました。"); 177 } else if (input == 1) { 178 System.out.println("IDを入力してください。"); 179 String num = scanner.nextLine(); 180 List<Person> list = editing.readFile(file_name); 181 boolean ret = editing.deletePerson(file_name, list, "List:" + num); 182 if (ret) { 183 System.out.println("削除しました。"); 184 } else { 185 System.out.println("指定されたidのデータはありませんでした。"); 186 } 187 } else if (input == 2) { 188 List<Person> list = editing.readFile(file_name); 189 editing.showPeople(list); 190 } else if (input == 9) { 191 System.out.println("終了"); 192 break; 193 } 194 } 195 } catch (Exception e) { 196 System.out.println(e); 197 } 198 } 199 200 public static void main(String[] args) { 201 action(); 202 } 203}

投稿2016/03/18 23:47

katoy

総合スコア22324

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

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

0

ルール変えましょう。
テキストファイルはいかのようにします。

name,job,sex
木村,センター,男
中居,リーダー,男
草薙,平社員,女

ヘッダ行付きで、半角カンマ区切りとする。
読み込む時は、ヘッダを読み飛ばし、1行読み込み、半角カンマで分割、person クラスを初期化して、長さ3の配列要素が、name,job,sex 順で並んでるのでそのまま対応する変数のセッターで設定する。

登録処理は、名前、仕事、性別をよみこみ、半角かんまでれんけつした1行をリストに格納、ファイルに保存するときに、既存読み込み行の後ろにアペンドして、ファイル戦先頭に、name,job,sex のヘッダをかきこみ、そのあとリスト内容をかきこみ、。

削除処理は、メニューで削除を選択したら、予め読込、list<Person> 状態のリストを先頭から順に、
行番号:名前、仕事、性別
のヘッダをしゅつりょくし、その後リスト内容を、先頭から、行番号を1から出力する。リストの先頭は0だけど、一般的には、0行目ではなくて、1行目でしょ、だから1から表示するんです。

で、入力プロンプトに、「削除する行番号を入力してkyださい。」ってやって、1 以上 リスト長さ+1いかの数値チェックを行ったあと、list.remove(lineNo-1); することで、行の削除は、完了でづね。

あとは想像力だけでづ。自分ほんい、データ本位ではなくて、自分が使うとしたらこういうとこが気が利いているといいなぁ、と思う部分を考えて、かいぜんすればもっとよくなりまづ。

日本語が少々変ですが、iPadの画面のキーボードを左手人差し指1本で叩いてるため、どうしても思う位置のキーが押せなくて、、、、

投稿2016/01/27 17:26

ipadcaron

総合スコア1693

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

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

tapipi

2020/07/03 00:58

横から失礼いたします。 読み込む時は、ヘッダを読み飛ばし、1行読み込み、半角カンマで分割… の部分がわからないのですが、ご教授願えませんか?
guest

0

java.io.RandomAccessFileを使えばいいんじゃないかな?

Java

1randomaccess.seek(1);//番号で何バイト目にアクセスするかを設定

確か、英語が1バイト、日本語が2バイトです。

投稿2016/04/23 04:44

編集2016/05/01 01:53
sun-solar-arrow

総合スコア113

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

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

退会済みユーザー

退会済みユーザー

2016/06/28 19:46

英語1バイト、日本語2バイトは、MS932(Windows-31j)の話です。 そうではない文字セットもあります。
sun-solar-arrow

2016/06/28 22:30

そうでしたね。ありがとうございます。
guest

0

果たしてプログラムからファイルを「部分的に消す」という動作ができたかどうか。
やるとしたら「該当データを削除した状態でファイルを書き込み、上書きする」という形にするしかないように思うのですが…
そのようにデータを操作したいのであれば、データベースを使うべき場面であると思います。

投稿2016/01/27 17:43

swordone

総合スコア20651

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

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

ipadcaron

2016/01/28 01:32

データベースはファイルベースですよ。 ファイル操作で、挿入、削除、追加、変更を理解しておくことは重要だと思いますが。 メモリ1Mb しかなくても、Hddに10gbあれば、8gb程度のデータを格納可能なデータベースが作れます。
heignamerican

2016/03/18 19:45

> データベースはファイルベース それは間違ってはいないんですが、人間可読の形式と機械可読(というより機械最適化)の形式では性質が異なります。 各カラム固定長という制約をつければ java.io.RandomAccessFile でなんとかできますけど… 今回の質問者さんは初心者マーク付けてますし、単一 plain text (オレオレ行区切りフォーマットですが)でなんとかしたいのでしょう。まあ妥当な判断だと思います。 ファイル保存時は(性能は置いといて)まるっと上書きがシンプルで良いのでは
tkturbo

2016/04/04 20:46

java.io.RandomAccessFileのことも忘れないであげて欲しい。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問