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

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

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

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

Q&A

解決済

3回答

16425閲覧

Javaで特定のディレクトリ配下のファイルを時系列でソートして削除

karasu0318

総合スコア28

Java

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

0グッド

0クリップ

投稿2018/01/02 13:31

Javaで下記を実現する方法はありますでしょうか?

1.特定のディレクトリ配下のファイルをタイムスタンプでソート
2.ソートした後、「今日から5日前以前」とか範囲指定して、その対象のファイルだけ削除する。
3.ファイルを削除するごとにファイル名をログに出力

JavaでFileクラスのメソッドを調べましたが、1と2を実現できそうなものはありませんでした。。。
できればシェルスクリプトを使用することなく、実現したいです。

ご教授お願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

java

1import java.io.File; 2import java.text.SimpleDateFormat; 3import java.util.Arrays; 4import java.util.Comparator; 5 6public class FileOpe { 7 private static String TIME_FORMAT = "yyyy/MM/dd HH:mm:ss"; 8 private static long CURRENT_TIMESTAMP = System.currentTimeMillis(); 9 10 public static void main(String[] args) { 11 System.out.println( 12 "現在時刻:" + new SimpleDateFormat(TIME_FORMAT).format(CURRENT_TIMESTAMP) 13 ); 14 File[] fileArray = sortedFiles("."); 15 Arrays.asList(fileArray).stream().forEach(i -> { 16 long timeStamp = i.lastModified(); 17 long diffDays = (CURRENT_TIMESTAMP - timeStamp) / (24 * 60 * 60 * 1000); 18 System.out.println( 19 new SimpleDateFormat(TIME_FORMAT).format(timeStamp) + 20 " " + 21 diffDays + "day(s)\t " + 22 i.getName() 23 ); 24 }); 25 } 26 27 static File[] sortedFiles(String path) { 28 File dir = new File(path); 29 File[] fileArray = dir.listFiles(); 30 Arrays.sort(fileArray, new Comparator<File>() { 31 public int compare(File file1, File file2) { 32 return file1.lastModified() >= file2.lastModified() ? 1 : -1; 33 } 34 }); 35 return fileArray; 36 } 37}

実行結果例:

イメージ説明

ファイル削除機能は、これに追加実装できるはずです。

java folder file list sort
で google 検索するといろいろ情報を得られます。

参考情報

  • 【Java入門】FileのlistFilesでファイルを検索して一覧を取得

https://www.sejuku.net/blog/21229

  • 【Java】File[]を更新日でソート

http://akiyamada2020.hatenablog.com/entry/20171208/1512704441

投稿2018/01/03 23:58

編集2018/01/04 00:00
katoy

総合スコア22324

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

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

karasu0318

2018/01/08 09:25

返信遅くなり申し訳ありません。 ご回答いただきありがとうございます。 わかりやすく、実現できるので、ベストアンサーに選ばせていただきます。 本当に助かりました。 ありがとうございます。
guest

0

java.nio.Files.find

java

1try{ 2 try(Stream<Path> s=Files.find(Paths.get("."),1,(p,e)->System.currentTimeMillis()-e.lastModifiedTime().toMillis()>TimeUnit.MILLISECONDS.convert(5L,TimeUnit.DAYS))){//並べ替えなくてもできた(1)(2) 3 s.parallel().forEach(p->{ 4 try{ 5 Files.deleteIfExists(p); 6 System.out.println(p);//ログ出力(3) 7 }catch(IOException ex){ 8 throw new UncheckedIOException(ex); 9 } 10 }); 11 }catch(UncheckedIOException ex){ 12 throw ex; 13 } 14}catch(IOException ex){ 15 System.out.println(ex); 16}

walkFileTreeとかも使えそう(どういうのがパフォーマンスが出るのかな?気になってきた)
並び替えが必要ならstream apiでも使って並べてください
よく考えたら並び替えには最終更新日時が必要ですよね
二回ファイルの属性を取得するのは無駄なので……

java

1TreeSet<PathAndModifiedTime> test() throws IOException{ 2 try(Stream<Path> s=Files.walk(Paths.get("."))){ 3 return s.map(p->{ 4 try{ 5 long t=Files.getLastModifiedTime(p); 6 return new PathAndModifiedTime(p,t); 7 }catch(IOExceotion ex){ 8 throw new UncheckedIOException(ex); 9 } 10 }).collect(Collectors.toCollection(TreeSet::new)); 11 }catch(UncheckedIOException ex){ 12 throw ex.getCause(); 13 } 14}

java

1public class PathAndModifiedTime implements Comparable<PathAndModifiedTime>{ 2 private Path p; 3 private long t; 4 public PathAndModifiedTime(Path path,long time){ 5 p=path; 6 t=time; 7 } 8 public long getModifiedTime(){ 9 return t; 10 } 11 public Path getPath(){ 12 return p; 13 } 14 @Override 15 public int compareTo(PathAndModifiedTime o){ 16 int temp=Long.compare(t,o.t); 17 if(temp!=0){ 18 return temp; 19 } 20 return p.compareTo(o.p); 21 } 22}

コンパイル通してないんでよろしく

投稿2018/01/02 15:31

編集2018/01/09 02:26
tignear

総合スコア260

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

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

karasu0318

2018/01/08 09:24

返信遅くなり申し訳ありません。 ご回答いただきありがとうございます。 とても迷ったのですが、ベストアンサーにできず申し訳ありません。 でも、本当に助かりました。 ありがとうございます。
guest

0

「タイムスタンプ」が更新時間のことなら、lastModifiedがあります。

投稿2018/01/02 15:18

swordone

総合スコア20651

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

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

karasu0318

2018/01/08 09:21

返信遅くなり申し訳ありません。 ご回答いただきありがとうございます。 おかげで最終更新時刻を取得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問