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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

3127閲覧

java.io.File.exis()で存在しているファイルがjava.io.File.listFiles()で取得できない

toroleaman

総合スコア95

Java

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

4クリップ

投稿2017/12/13 12:44

編集2017/12/20 13:10

java.io.File.listFiles()という関数を使ってlinux上のディレクトリにあるファイルの一覧を取得しています。
1からN番までシーケンシャルにファイルを生成していますが、
あるタイミングでM番目のファイルもM+1番目のファイルも
java.io.File.exis()関数で存在しているのに、
listFiles()で取得した結果にM番目のファイルが含まれないのに
M+1番目のファイルが含まれている事象が発生しています。
listFiles()を疑っていて、Bugを探していたら、
listFiles()は、キャッシング機能を持っていて、renameTo()関数によって
リセットされると記載がありました。
https://netbeans.org/bugzilla/show_bug.cgi?id=268744

listFilesは、処理速度が遅いという問題もあり、Fileのインスタンスを
作成している間に、ファイルの状態が変わったりすることで
listFileでファイルが取得できないのでは?と思っています。

再現用のサンプルを作ってもなかなか再現できません。
このような事象が発生したことがある方いますでしょうか。

Javaは、7です。
http://dev.eyewhale.com/archives/1337

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

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

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

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

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

guest

回答1

0

ベストアンサー

Linuxでは、ディスクへの書き込みはキャッシュされ非同期に行われるのでファイルが順番通りに作成される保証はありません。同期書き込みを強制させることもできますがパフォーマンスの観点から現実的ではないでしょう。
ファイルの連番が途切れた場合、そこで処理を打ち切って次に回すなどの工夫をするのが良いでしょう。

Linux におけるファイル I/O の基礎
https://itkq.jp/blog/2017/05/10/linux-file-and-io/

投稿2017/12/19 22:56

hichon

総合スコア5737

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

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

toroleaman

2017/12/20 13:02

なるほど、ディスクへの書き込みがキャッシュされるんですね。IO待ちがどの程度なのか、デバイスIOへの書き込みがキューイングされて、プログラム上では書き込みが終了しても、デバイスへの書き込みでIO待ちになってしまっていて、あとから作成されたファイルが先にデバイスへ書き込んでしまっているのかもしれません。iostatなどで、IO待ちや書き込み待ちキューにどれくらい滞留しているか調べてみます。 listfiles()の問題というよりも、Linuxのファイル書き込みの問題ですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問