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

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

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

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

855閲覧

java 起動時と終了時に自動で予定を保存読み込みされるようにしたい

andersong

総合スコア7

Java

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2020/08/04 18:30

予定を管理するシステムを作りたいのですが途中で引っ掛かりました。

予定が自動で保存・読み込みされるようにしたいのですがわかりません。

やりたいこと
CalendarSystemを起動するとデフォルトファイルから予定を読む
CalendarSystemを終了する際にデフォルトファイルへ予定を書きだす

saveSchedules(),loadSchedules()の引数がnullの場合の処理を追加
起動時と終了時は引数をnullで呼び出す
この二つをすればよいのですがどうすればよいでしょうか。
ソースコードをお願いします。

import java.io.;
import java.util.
;
import java.text.*;

public class CalendarSystem {

public class Schedule {
public int sn;
public Date date;
public String content;

public Schedule (int s, String dt, String c) throws ParseException {
sn=s;
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd hh:mm");
date=sdf.parse(dt);
content=c;
}

public String toString() {
return String.format("%04d:%tY/%<tm/%<td %<tH:%<tM %s" ,sn,date,content);
}

}

private int last_sn;
private List<Schedule> sc_list;
private String file_name="schedule.csv";

public static void main (String[] args){
(new CalendarSystem() ).exec();

}

private void exec(){
initSystem();
boolean end_flag=false;
while(!end_flag){
String[] cmd=inputCommand();
switch(cmd[0]) {
case "quit":end_flag=true; break;
case "add":/end_flag=false;/ addSchedule(cmd);break;
case "list":/end_flag=false;/ listSchedules(cmd);break;
case "save":/end_flag=false;/ saveSchedules(cmd);break;
case "load":/end_flag=false;/ loadSchedules(cmd);break;
case "modify":/end_flag=false;/ modifySchedule(cmd);break;
case "del":/end_flag=false;/ deleteSchedule(cmd);break;
case "set":/end_flag=false;/ changeSettings(cmd);break;
case "help":/end_flag=false;/ showHelp();break;
default:
msg("コマンド"+cmd+"がわかりません。");
}
}
quitSystem();
}

private void initSystem(){
msg("*** 予定管理システムSP5へようこそ! ***");
last_sn=0;
sc_list=new ArrayList<Schedule>();
}

private void quitSystem(){
msg("バイバイ!、また使ってね");
}

private void msg(String m){
System.out.println(m);

}
private void msg0(String m){
System.out.print(m);

}

private String input(){
try{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
return br.readLine();
}catch(IOException e){}
return null;
}

private String[] inputCommand(){
msg0("コマンドは?");

String s=input();
if(s!=null)
return s.split(" ");
String[] r={ "" };
return r;
}

private void addSchedule(String[] cmd){
if(cmd.length!=4){
msg("addコマンドの構文が不正です");
return;
}
try{
String d=cmd[1] +" "+cmd[2];
String c=cmd[3];
sc_list.add(new Schedule (++last_sn,d,c));
}catch (ParseException e){
msg("日付が不正です");
}
}

private void listSchedules(String[] cmd){
for(Schedule s:sc_list){
msg(" "+s);
}
}

private void saveSchedules(String[] cmd){
String fn=file_name;
if(cmd.length==2) fn=cmd[1];
try{
PrintWriter pw=new PrintWriter(new FileWriter(fn));
pw.println(sc_list.size());
for(Schedule s:sc_list){
String csv=String.format("%d,%tY/%<tm/%<td,%<tH:%<tM,%s",s.sn,s.date,s.content);
pw.println(csv);
}
pw.close();
}catch(IOException e){
msg("保存失敗:"+fn);
}
}

private void loadSchedules (String[] cmd) {
String fn=file_name;
if (cmd.length==2) fn=cmd[1];
try {
sc_list.clear();
last_sn=0;
BufferedReader br=new BufferedReader (new FileReader(fn));
int n=Integer.parseInt (br.readLine());
for(int i=0;i<n;i++){
String l=br.readLine();
String[] tok=l.split(",");
int sn=Integer.parseInt(tok[0]);
String d=tok[1]+" "+tok[2];
String c=tok[3];
sc_list.add(new Schedule (sn, d, c));
if (last_sn<sn) last_sn=sn;
}
br.close();
} catch (IOException e) {
msg("読み込み失敗:"+fn);
}catch (ParseException e) {
msg("CSVファイルが不正です");
}
}

private void modifySchedule(String[] cmd){
int sn=Integer.parseInt(cmd[1]);
Schedule sc=findScheduleBySn(sn);
if(sc==null){
msg("予定がありません。");
return;
}
switch(cmd[2]){
case "d": modifyScheduleDate(sc,cmd[3]+" "+cmd[4]); break;
case "c": modifyScheduleContent(sc,cmd[3]); break;
}
}

private Schedule findScheduleBySn(int sn){
for(Schedule s:sc_list)
if(s.sn==sn)
return s;
return null;
}

private void modifyScheduleDate(Schedule sc ,String dt){
try{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd hh:mm");
sc.date=sdf.parse(dt);
}catch(ParseException e){
msg("日付が不正です");
}
}

private void modifyScheduleContent(Schedule sc,String c){
sc.content=c;
}

private void deleteSchedule(String[] cmd){
int sn=Integer.parseInt(cmd[1]);
Schedule sc=findScheduleBySn(sn);
if(sc==null){
msg("予定がありません。");
return;
}
msg0("予定「"+sn+"を削除しますか?");
String s=input();
if(s.charAt(0)=='y')
sc_list.remove(sc);
}

private void changeSettings(String[] cmd){
switch(cmd[1]){
case "fn": setFileName(cmd[2]); break;
}
}

private void setFileName(String fn){
file_name=fn;

msg("保存ファイル名を"+fn+"に変更しました。");

}

private void showHelp(){
msg("コマンド:");
msg("add : 新しい予定を追加する(add 2020/5/1 8:00 出勤する");
msg("list : 予定の一覧を追加する");
msg("modify : 予定を修正する");
msg("del : 予定を削除する");
msg("save : 予定をファイルに書き出す");
msg("load : 予定をファイルから読み込む");
msg("help : コマンドの使用法を表示する");
msg("set : 設定を変更する");
msg("quit : 終了する");
}

}

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

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

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

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

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

m.ts10806

2020/08/04 20:18

>ソースコードをお願いします。 作業依頼を請け負う場所ではないので、どうぞ、クラウドワークスなどでお金を出してやってもらってください。
guest

回答1

0

ベストアンサー

execメソッドを見ると、起動時は initSystem() 、終了時は quitSystem()を呼び出しているので、これらのメソッド内に loadSchedules() と、saveSchedules()を配置すれば良いかと。

loadSchedues()やsaveSchedules()はコマンドを配列で受け取って、その中からファイル名を決めているコードになっているようです。

java

1String fn = file_name; 2if (cmd.length == 2) 3 fn = cmd[1];

それぞれのメソッドで、cmdがnullでないときの条件を追加すれば良いだけでしょう。

java

1String fn = file_name; 2if (cmd != null && cmd.lendth == 2) { 3 fn = cmd[1]; 4}

既に file_name の値は

java

1private String file_name = "schedule.csv";

で、schedule.csvで定義されています(おそらくこれがデフォルトのファイル名)ので、開始と終了時に読み込みと保存がされる処理にはなっています。

投稿2020/08/05 00:43

A-pZ

総合スコア12011

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

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

andersong

2020/08/05 04:44

回答ありがとうございます。 execメソッドを見ると、起動時は initSystem() 、終了時は quitSystem()を呼び出しているので、これらのメソッド内に loadSchedules() と、saveSchedules()を配置すれば良いかと。 のところなのですが、initSystem() とquitSystem()にどのようにloadSchedules() と、saveSchedules()を配置すればよいのでしょうか。 よろしくお願いいたします。
andersong

2020/08/05 05:26

nullを返せばできました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問