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

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

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

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Q&A

解決済

3回答

9626閲覧

Java 出力ファイル名インクリメント操作

Hyonta

総合スコア36

Java

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

1グッド

2クリップ

投稿2016/05/25 13:29

###実現したいこと
ファイル出力をする際に、対象のフォルダ内に同名ファイルがあれば、
拡張子の前に枝番(例:20160525215810_access_1.log)を付与する。
枝番のついた同名ファイルがあれば枝番を+1して(例:20160525215810_access_2.log)出力するという処理を実装中です。
そのほかの条件としては。
・ _(アンダーバー)と拡張子の間に数字以外の値が入っているファイルは無視
・ 枝番が飛んでいた場合(例:_1と_3がある)は、抜けている枝番のファイルを作成。
です。

以下のソースコードで実装中なのですが、もっと効率的なやり方がありそうですので助言いただければと思います。

###現在のソースコード

Java

1 // 出力ファイル名の作成 2 String outputAbsolutePath = outputPath + outputFileName; 3 File outputFile = new File(outputAbsolutePath); 4 5 // 拡張子取得(.logか.txtであることは確定) 6 int extensionIndex = outputFileName.lastIndexOf("."); 7 String extension = outputFileName.substring(extensionIndex, extensionIndex + 4); 8 9 // 出力ファイル名の作成(枝番あり) 10 String fileName; 11 String outputFileBranch = outputFileName.substring(0, extensionIndex) + "_"; 12 13 String outputFileNameBranch1 = outputPath + outputFileName.substring(0, extensionIndex) 14 + "_1" + extension; 15 File outputFileBranch1 = new File(outputFileNameBranch1); 16 17 // 出力フォルダ内ファイル取得 18 File[] files = inputData.getOutputPath().listFiles(); 19 20 // 同名ファイル有無判定 21 for (File file : files) { 22 fileName = file.getName(); 23 // 同名ファイルあり 24 if (outputFile.exists()) { 25 // 同名ファイルに枝番号ありの場合は、枝番を+1のファイルを作成。 26 if (fileName.startsWith(outputFileBranch)) { 27 int beginIndex = fileName.lastIndexOf("_"); 28 int endIndex = fileName.indexOf("."); 29 int branchNumber = Integer.parseInt(fileName.substring(beginIndex + 1, endIndex)); 30 branchNumber++; 31 String outputFileNameBranch = outputFileBranch + branchNumber; 32 outputAbsolutePath = outputPath + outputFileNameBranch + extension; 33 } 34 // 枝番号1のファイルが存在しない場合は、枝番1のファイルを作成。 35 if (!outputFileBranch1.exists()) { 36 outputFileBranch = outputFileBranch + "1"; 37 outputAbsolutePath = outputPath + outputFileBranch + extension; 38 break; 39 } 40 } 41 }
KiyoshiMotoki👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

修正していこうとすると混乱するので、はじめから整理して書いてみます。

java

1String outputPath; //保存場所のパス(パス区切り文字で終わっているのですか?) 2String outputFileName; //保存ファイル名 3File file = new File(outputPath + outputFileName); 4 5// 拡張子取得 6int extensionIndex = outputFileName.lastIndexOf("."); 7//第二引数がなければ、substringメソッドはそのインデックスから最後までの文字列を返す 8//このため、別に拡張子の文字数が確定していなくても拡張子を抽出できる 9String extension = outputFileName.substring(extensionIndex); 10outputFileName = outputFileName.substring(0, extensionIndex); 11int branch = 0; 12 13//わざわざファイルリストを取得しなくても、これでそのファイル名が存在するかは判定可能 14while(file.exists()) { 15 branch++; 16 //これで順次Fileを作成しながら判定を繰り返せば、飛び番のファイル名にも対応可能 17 file = new File(outputPath + outputFileName + "_" + branch + extension); 18}

投稿2016/05/25 14:30

編集2016/05/25 18:08
swordone

総合スコア20651

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

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

0

これだけでいいと思う。

java

1File fl = new File(outputPath + outputFileName); 2string filename = outputFileName.substring(outputFileName.lastIndelOf(".")); 3String extension = fl.getName().substring(fl.getName().lastIndexOf(".") + 1); 4 5int i = 0; 6while(fl.exists()){ 7 8 i ++; 9 fl = new File(outputPath + filename + "_" + i + extension); 10}

投稿2016/05/25 15:09

otftrough

総合スコア476

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

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

KiyoshiMotoki

2016/05/26 02:35

 String extension = fl.getName().substring(fl.getName().lastIndexOf(".") + 1); は  String extension = fl.getName().substring(fl.getName().lastIndexOf(".")); ですね。 または   fl = new File(outputPath + filename + "_" + i + extension); を   fl = new File(outputPath + filename + "_" + i + "." + extension); に。 さもないと拡張子の直前のピリオドが抜け落ちてしまうので。
otftrough

2016/05/26 04:54

うっかりしてました。その通りです。
guest

0

お二人ともありがとうございました。
こんなに簡単にできるとは感謝感激です。
以下のように実装しまして、無事うごきました。

// 出力ファイルの設定
String outputAbsolutePath = outputPath + outputFileName;
File outputFile = new File(outputAbsolutePath);

// 拡張子取得
int extensionIndex = outputFileName.lastIndexOf(".");
String extension = outputFileName.substring(extensionIndex);

// 出力ファイル名の作成(枝番あり)
String outputFileBranch = outputFileName.substring(0, extensionIndex) + "_";

// 同名ファイルが存在する場合、出力ファイルに枝番を付与する処理
int branch = 0;
while (outputFile.exists()) {
branch++;
outputFile = new File(outputPath + outputFileBranch + branch + extension);
}

投稿2016/05/26 05:29

Hyonta

総合スコア36

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問