• 締切済み

ファイル名を動的に生成したい

ファイル名を日付とその日の中の通し番号にしたいと思っています。 例えば2009/07/17日だったらファイル名を 20090717+その日の中の通し番号とする。 日付をファイル名にするところまではできたのですが「その日の中の 通し番号とする」部分がわかりませんので教えていただきたいのですが。 import java.text.SimpleDateFormat; import java.util.Date; public class CreateFileName { public static void main(String args[]){ Date date1 = new Date(); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd"); //ファイル名は日付とその日の中の通し番号 String fileName = sdf1.format(date1).toString()+".pdf"; System.out.println(fileName); } }

みんなの回答

  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.5

ていうかメモ帳で書くとやっぱりバグがいくつかありますねぇ・・・・(^^;)デバッグしてお使いください。。。すみません。

  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.4

ちょと補足で //大量にやるならStringBuilderを使うほうがいい String fileName = datePrefix + DELIM + currentId + ".pdf"; File file = new File(fileName); assert !(file.exists()); System.out.println(fileName); }//main() までやって、java -eaで試しに実行するとちゃんと動いてるかわかります!(無責任ですみません(^^;))

  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.3

ディレクトリ走査が一番順当かと。 テストしてないんで動かなかったらすみません(^^;) import java.text.SimpleDateFormat; import java.util.*; import org.apache.commons.io.filefilter.*; //apache commonsIOが必要 public class CreateFileName { private static final String DELIM = "-"; //デリミタ private static final String DATE_FORMAT = "yyyyMMdd"; public static void main(String args[]){ String datePrefix = calcPrefix(); int lastId = findLastId(datePrefix); int currentId = lastId++; //大量にやるならStringBuilderを使うほうがいい String fileName = datePrefix + DELIM + currentId + ".pdf"; System.out.println(fileName); }//main() private static String calcPrefix(){ Date date1 = new Date(); SimpleDateFormat sdf1 = new SimpleDateFormat(DATE_FORMAT); return sdf1.format(date1); }//calcPrefix() private static int findLastId(String datePrefix){ File dir = new File("."); FileFilter fileFilter = new RegexFileFilter("^"+datePrefix+DELIM+"[0-9]+"+".pdf"); List<String> fileList = Arrays.asList(fileFilter); //1つも見つからなかったら、IDは0 if(fileList.isEmpty()){ return String.valueOf(0); }else{ //String型の自然順序と逆順でソート(一番大きいものが前) Collections.sort(fileList, Collections.reverseOrder()); String largestFileName = fileList.get(0); } //Idを取り出す Scanner scanner = new Scanner(largestFileName).useDelimiter(DELIM+"|"+"."); //assert文はデバッグ用 String actualDatePrefix = scanner.next(); assert actualDatePrefix.equals(datePrefix); assert scanner.hasNextInt(); int lastId = scanner.nextInt; String remains = scanner.next(); assert remains.equals("pdf"); assert !(scanner.hasNext()); scanner.close(); return lastId; }//findLastId() }//class

  • dyna_1550
  • ベストアンサー率34% (122/353)
回答No.2

ファイルに最大値を保存しておいて、「読み込んだ値 + 1」 とする。 もちろん、最大値を保存したファイルの値も +1する。 日付が変わったらリセット。 アクセスカウンタなどでよく使う手です。 ファイル操作の場合、別スレッドなどからの書き込みにより、 ファイルがバッティングしたり、最大値を保存しているファイルを 取り合いになったり・・・ ファイル操作はロックやら例外処理やら、気を遣いますね。

回答No.1

ずっと動作しているプログラムならば内部の変数をカウントすることで出来そうですが、そうでないとなるとなかなか面倒ですね。 ファイルを作成するフォルダ内の本日日付に該当するファイル一覧を抽出し、最大+1のファイル名とする、とか。

関連するQ&A