Java FileOutputStream存在しない場合はファイルを作成


回答:


302

FileNotFoundExceptionファイルが存在せず作成できない場合(doc)はスローされますが、可能であれば作成されます。を作成する前に、ファイルが存在するかどうかを最初にテストする必要があります(存在しない場合はFileOutputStream、withで作成しますcreateNewFile())。

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 

2
ファイルが存在しない場合、空の.txtファイルをどのように作成しますか?
Stefan Dunn

3
@StefanDunnをcreateNewFile()メソッドに追加しました(私の例を参照)。
talnicolas 2012年

55
条件は冗長です。JavaDocによると、createNewFile()それ自体がファイルの存在をアトミックにチェックします。
aztek

8
@aztekおそらくコードを読みやすくするために条件を残すことができます
Andrii Chernenko 2013

2
createNewFile()ここでの時間の無駄は全部です。システムはすでにそれを行います。あなたはそれを二度見させるだけです。
ローン侯爵


23

空のファイルが存在してもしなくても作成できます...

new FileOutputStream("score.txt", false).close();

ファイルが存在する場合にファイルを残したい場合...

new FileOutputStream("score.txt", true).close();

存在しないディレクトリにファイルを作成しようとすると、FileNotFoundExceptionが発生します。


3
FileNotFoundExceptionどちらの場合もスローされます。
ミクセル2014年

21
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

これfFileOutputStreamコンストラクタに渡します。


2
ここに競合状態があります...次のように実行することをお勧めします。File f = new File( "Test.txt"); if(!f.createNewFile()){System.out.println( "File already exists"); }
人類

19

Apache CommonsのFileUtilsは、これを1行で実現するためのかなり良い方法です。

FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))

これにより、存在しない場合は親フォルダーが作成され、存在しない場合はファイルが作成され、ファイルオブジェクトがディレクトリであるか、書き込みができない場合は例外がスローされます。これは次と同等です:

File file = new File("/home/nikhil/somedir/file.txt");
file.getParentFile().mkdirs(); // Will create parent directories if not exists
file.createNewFile();
FileOutputStream s = new FileOutputStream(file,false);

現在のユーザーが操作の実行を許可されていない場合、上記の操作はすべて例外をスローします。


4

存在しない場合はファイルを作成します。ファイルが存在する場合は、その内容をクリアします。

/**
 * Create file if not exist.
 *
 * @param path For example: "D:\foo.xml"
 */
public static void createFile(String path) {
    try {
        File file = new File(path);
        if (!file.exists()) {
            file.createNewFile();
        } else {
            FileOutputStream writer = new FileOutputStream(path);
            writer.write(("").getBytes());
            writer.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2

パスとファイルを使用して存在しない場合にのみ、ファイルを作成する別の方法を提供するだけです。

Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
    Files.createFile(path);
Files.write(path, ("").getBytes());

0

FileNotFoundExceptionファイルが存在しない場合は、潜在的にを取得できます。

Javaドキュメントは言う:

ファイルが利用可能であるか、作成される可能性があるかは、基盤となるプラットフォームhttp://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.htmlによって異なり ます

Java 7を使用している場合は、java.nioパッケージを使用できます。

オプションパラメータは、ファイルの作成またはオープン方法を指定します...書き込み用にファイルをオープンし、存在しない場合はファイルを作成します...

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html


0

new FileOutputStream(f) ほとんどの場合ファイルを作成しますが、残念ながらFileNotFoundExceptionが発生します

ファイルは存在するが、通常のファイルではなくディレクトリである、存在しないが作成できない、またはその他の理由で開けない場合

Javadocから

つまり、「ファイルを作成できませんでした」という意味のFileNotFoundExceptionが発生するケースはたくさんありますが、ファイルの作成が失敗した理由を見つけることはできません。

解決策は、File APIへの呼び出しをすべて削除し、代わりにFiles APIを使用することです。これにより、エラー処理が大幅に向上します。典型的には、任意に置き換えるnew FileOutputStream(f)Files.newOutputStream(p)

File APIを使用する必要がある場合(たとえば、Fileを使用して外部インターフェースを使用するため)、ファイルをFiles.createFile(p)適切に作成するために使用することは適切な方法であり、そうでない場合は、それが機能しない理由を知ることができます。一部の人々は、これは冗長であると上記でコメントしました。それは本当ですが、場合によっては必要になるかもしれないより良いエラー処理が得られます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.