Javaで下記を実現する方法はありますでしょうか?
1.特定のディレクトリ配下のファイルをタイムスタンプでソート
2.ソートした後、「今日から5日前以前」とか範囲指定して、その対象のファイルだけ削除する。
3.ファイルを削除するごとにファイル名をログに出力
JavaでFileクラスのメソッドを調べましたが、1と2を実現できそうなものはありませんでした。。。
できればシェルスクリプトを使用することなく、実現したいです。
ご教授お願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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総合スコア22328
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総合スコア260
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
「タイムスタンプ」が更新時間のことなら、lastModifiedがあります。
投稿2018/01/02 15:18
総合スコア20675
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/08 09:25