を取得します。しかし、私はこれらすべてのファイルに興味がありません。私は最新のものを取得したいだけで、最新のもののファイル名は(タイムスタンプが含まれているので)辞書編集の順番で最大のファイル名であることがわかります。このファイルを取得する最も簡単な方法は何ですか?それはいつも私の流れの中で最後に来るものですか?あなたならどうしますか?私は<code>pattern</code>に一致する私の<code>dir</code>内のファイルの<code>DirectoryStream</code>を取得</p> <pre><code>DirectoryStream<Path> stream = Files.newDirectoryStream(dir,pattern); </code></pre> <p>を使用して最新のファイル
答えて
こんにちは、私はあなたが必要としていると信じているコード断片です。
DirectoryStream<Path> stream = Files.newDirectoryStream(dir,pattern);
Path latestPath=null;
FileTime latestTime = null;
for (Path path:stream) {
BasicFileAttributes attribs = Files.readAttributes(path, BasicFileAttributes.class);
FileTime time = attribs.creationTime();
if (latestTime==null) {
latestPath = path;
latestTime = time;
}
else {
if (time.compareTo(latestTime)>0) {
latestTime = time;
latestPath = path;
}
}
}
のJava 8バージョン:
DirectoryStream<Path> stream = Files.newDirectoryStream(null,"");
List<Path> list = new ArrayList()<>();
stream.forEach(list::add);
list.stream()
.max((t,q)->{
BasicFileAttributes attribs1 = Files.readAttributes(t, BasicFileAttributes.class);
BasicFileAttributes attribs2 = Files.readAttributes(q, BasicFileAttributes.class);
return attribs1.creationTime().compareTo(attribs2.creationTime());});
私たちはイテレータから直接ストリーミングすることができます任意の方法を参照してくださいいけないので、それはそれは、Java 8
ありがとうございます。それは、よりよい解決策がなければ、私が取る標準的な方法です。エレガントな方法でより少ないコードを使ってパスを取得する方法(多分新しいJava 8ストリームテクニックを使用する)があるかどうか疑問に思っていました。ちなみに:あなたは作成時間を比較する必要はありません、あなたはsimlyファイル名を比較することがあります。 –
私はそれがより速くなるとは確信していません。 DirectoryStreamが実装するものはIteratorです。イテレータでのみConsumerを実行できます。実際にストリームを流すには、コレクションに変換する必要があります。だからここには1つの非常に醜いJava 8バージョンがありますが、私はそれより良いことが出てくるものは何もありません。 –
おそらく 'stream.forEach(list :: add)'は_stream_を使う目的を打ち消します。 'DirectoryStream'は適切なJava 8の' Stream'でした:-(( –
DirectoryStream
はJava 8ストリームを実際に提供していないので、普通の古いFile
APIに戻ってしまうと、より簡単な解決策が得られるかもしれないと主張します。たとえば、次のプログラム:
public class MostRecentFile {
public static void main(String[] args) throws IOException {
Path dir = Paths.get(args[0]);
String regex = args[1];
Arrays.stream(dir.toFile().listFiles(fn -> fn.getName().matches(regex))).sorted((f1, f2) -> {
try {
FileTime c2 = Files.readAttributes(f2.toPath(),
BasicFileAttributes.class).creationTime();
FileTime c1 = Files.readAttributes(f1.toPath(),
BasicFileAttributes.class).creationTime();
return c2.compareTo(c1);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
).findFirst().ifPresent(f -> System.out.println("found: " + f.getName()));
}
}
が正しく最初の引数(例えば)/tmp/files
及び第二引数.*txt
使用して、最新の.txt
ファイル出力します(注:それは正規表現ではなく、グロブです)。
found: 6.txt
(これらのファイルには、1 2 3.txt 5.txt 6.txt
が含まれています)。
タイムスタンプに基づいてファイルが時系列で提供されていて、newDirectoryStreamがそれを分かりやすく並べると仮定すると、ストリームの最後のエントリになります。 – ManoDestra
私はファイル名_starts with_タイムスタンプと仮定しています。そうですか? –
@ManoDestra私の質問は、newDirectoryStreamがそれらを注文するかどうかです。それが注文すれば、私はそれが最後のファイルであるというファイル命名概念によって知っています。 –