新しいファイルを作成する Java

ファイルの作成は非常に一般的な入出力操作です。今日は、Javaでファイルを作成するためのさまざまな方法について見ていきましょう。

Javaファイルの作成

Javaでファイルを作成するための人気のある3つの方法があります。それぞれを順番に見ていきましょう。

  1. File.createNewFile()

    java.io.Fileクラスは、Javaで新しいファイルを作成するために使用できます。Fileオブジェクトを初期化する際に、ファイル名を指定し、createNewFile()メソッドを呼び出すことで、新しいファイルを作成できます。File createNewFile()メソッドは、新しいファイルが作成された場合はtrueを返し、既にファイルが存在する場合はfalseを返します。このメソッドは、ファイルの作成に失敗した場合にはjava.io.IOExceptionをスローします。作成されるファイルは空であり、サイズはゼロバイトです。ファイル名を指定してFileオブジェクトを作成する際には、絶対パスを使用することも、ファイル名のみを指定することも、相対パスを指定することもできます。絶対パスを使用しない場合、Fileオブジェクトはプロジェクトのルートディレクトリからファイルを検索しようとします。コマンドラインからプログラムを実行する場合、絶対パスを使用しない場合、Fileオブジェクトは現在のディレクトリからファイルを検索しようとします。ファイルパスを作成する際には、プログラムをプラットフォームに依存しないようにするために、Systemプロパティfile.separatorを使用する必要があります。単純なJavaプログラムを使用して、さまざまなシナリオを見てみましょう。

    package com.journaldev.files;
    
    import java.io.File;
    import java.io.IOException;
    
    public class CreateNewFile {
    
        /**
         * This class shows how to create a File in Java
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
            String fileSeparator = System.getProperty("file.separator");
            
            //絶対パスでのファイル名
            String absoluteFilePath = fileSeparator+"Users"+fileSeparator+"pankaj"+fileSeparator+"file.txt";
            File file = new File(absoluteFilePath);
            if(file.createNewFile()){
                System.out.println(absoluteFilePath+" ファイルが作成されました");
            }else System.out.println("ファイル "+absoluteFilePath+" は既に存在します");
            
            //ファイル名のみ
            file = new File("file.txt");
            if(file.createNewFile()){
                System.out.println("file.txt ファイルがプロジェクトのルートディレクトリに作成されました");
            }else System.out.println("ファイル file.txt は既にプロジェクトのルートディレクトリに存在します");
            
            //相対パス
            String relativePath = "tmp"+fileSeparator+"file.txt";
            file = new File(relativePath);
            if(file.createNewFile()){
                System.out.println(relativePath+" ファイルがプロジェクトのルートディレクトリに作成されました");
            }else System.out.println("ファイル "+relativePath+" は既にプロジェクトのルートディレクトリに存在します");
        }
    
    }
    

    上記のプログラムを最初にEclipse IDEから実行すると、以下の出力が生成されます。

    /Users/pankaj/file.txt ファイルが作成されました
    file.txt ファイルがプロジェクトのルートディレクトリに作成されました
    Exception in thread "main" 
    java.io.IOException: No such file or directory
    	at java.io.UnixFileSystem.createFileExclusively(Native Method)
    	at java.io.File.createNewFile(File.java:947)
    	at com.journaldev.files.CreateNewFile.main(CreateNewFile.java:32)
    

    相対パスでは、IOExceptionがスローされます。tmpディレクトリがプロジェクトのルートフォルダに存在しないためです。したがって、プロジェクトのルートに「tmp」ディレクトリを作成してプログラムを再度実行しました。以下は出力です。

    ファイル /Users/pankaj/file.txt は既に存在します
    ファイル file.txt は既にプロジェクトのルートディレクトリに存在します
    tmp/file.txt ファイルがプロジェクトのルートディレクトリに作成されました
    

    最初の2つのファイルは既に存在しているため、createNewFile()falseを返し、3つ目のファイルはtmpディレクトリに作成され、trueを返します。その後の実行では、以下の出力が表示されます。

    ファイル /Users/pankaj/file.txt は既に存在します
    ファイル file.txt は既にプロジェクトのルートディレクトリに存在します
    ファイル tmp/file.txt は既にプロジェクトのルートディレクトリに存在します
    

    同じプログラムをターミナルのクラスディレクトリから実行する場合、以下の出力が表示されます。

    //classes出力ディレクトリからの最初の実行	
    pankaj:~/CODE/JavaFiles/bin$ java com/journaldev/files/CreateNewFile
    ファイル /Users/pankaj/file.txt は既に存在します
    file.txt ファイルがプロジェクトのルートディレクトリに作成されました
    Exception in thread "main" java.io.IOException: No such file or directory
    	at java.io.UnixFileSystem.createFileExclusively(Native Method)
    	at java.io.File.createNewFile(File.java:947)
    	at com.journaldev.files.CreateNewFile.main(CreateNewFile.java:32)
    
    //tmpディレクトリが存在しないので、作成する
    pankaj:~/CODE/JavaFiles/bin$ mkdir tmp
    
    //2回目の実行
    pankaj:~/CODE/JavaFiles/bin$ java com/journaldev/files/CreateNewFile
    ファイル /Users/pankaj/file.txt は既に存在します
    ファイル file.txt はプロジェクトのルートディレクトリに既に存在します
    tmp/file.txt ファイルがプロジェクトのルートディレクトリに作成されました
    
    //3回目以降の実行
    pankaj:~/CODE/JavaFiles/bin$ java com/journaldev/files/CreateNewFile
    ファイル /Users/pankaj/file.txt は既に存在します
    ファイル file.txt はプロジェクトのルートディレクトリに既に存在します
    ファイル tmp/file.txt はプロジェクトのルートディレクトリに既に存在します
    
  2. FileOutputStream.write(byte[] b)

    新しいファイルを作成し、同時にデータを書き込む場合は、FileOutputStreamのwriteメソッドを使用します。以下にその使用例を示します。先に説明した絶対パスと相対パスのルールもこの場合に適用されます。

    String fileData = "Pankaj Kumar";
    FileOutputStream fos = new FileOutputStream("name.txt");
    fos.write(fileData.getBytes());
    fos.flush();
    fos.close();
    
  3. Java NIO Files.write()

    私たちはJava NIO Filesクラスを使用して新しいファイルを作成し、データを書き込むことができます。これは、IOリソースのクローズについて心配する必要がないため、良いオプションです。

    String fileData = "Pankaj Kumar";
    Files.write(Paths.get("name.txt"), fileData.getBytes());
    

これで、Javaプログラムで新しいファイルを作成する方法について説明しました。

さらに多くのコアJavaの例は、私たちのGitHubリポジトリでご覧いただけます。

Source:
https://www.digitalocean.com/community/tutorials/java-create-new-file