システム開発

【Java】ファイル操作(java.nio.file)

シロクマくん

こんにちは、シロクマです!

今日は、javaを使ったファイル操作を行うパッケージ「java.nio.file」の使い方について説明します!

Contents

Javaのファイル操作

Javaには標準でファイル入出力を行うためのライブラリがあります。

「Java ファイル書き込み」とググるとたくさんの記事が出てくることでしょう。

そうです。Javaはサーバサイドで動作するプログラムなので、ローカルファイルへアクセスすることも簡単にできるのです。

そんなファイル操作を可能にするパッケージこそ「Java.nio.file」なのです。

Java.nio.fileでできること

ファイル操作とばっくり言われても、「結局何ができるの?」と思われることでしょう。具体的には以下です。

  • ファイルの読み込み
  • ファイルへの書き込み
  • ファイル新規作成
  • ファイルの削除
  • その他いろいろ・・・

はい。ここに書ききれないほどたくさんのことが可能で、システムで実現したいファイル操作は大体カバーできているのでは?と思います。なので、Javaを使ってファイル操作をしたい場合はJava.nio.fileの使い方を覚えましょう!

使い方、サンプル

※本記事は、Adopt Java11.0.10.9 hotspot で動作することを想定しています。なので、バージョンやバイナリ違いで動作が異なる可能性があります。たぶん大丈夫だけど。

  • ファイル読み込み( Files.readAllLines )
package mynio;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

public class MynioMain {

	public static void main(String[] args) {

		//以下Windows環境で①、②ならいずれの書き方でもでも可。③は×。
		Path gotPath = Paths.get("C:\\nio\\test.txt"); //①
		//Path gotPath = Paths.get("C:/nio/test.txt"); //②
		//Path gotPath = Paths.get("C/nio/test.txt"); //③


		try {
			//読み込み対象が「utf-8」ならcharset指定省略可。
			List<String> lines = Files.readAllLines(gotPath);

			for (String line : lines ) {
                //一行ずつ出力
				System.out.println(line);

			}
		} catch (IOException e) {
			e.printStackTrace();

		}
	}
}

出力結果

吾輩わがはいは猫である。名前はまだ無い。
 どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。この書生というのは時々我々を捕つかまえて煮にて食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶やかんだ。その後ご猫にもだいぶ逢あったがこんな片輪かたわには一度も出会でくわした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙けむりを吹く。どうも咽むせぽくて実に弱った。これが人間の飲む煙草たばこというものである事はようやくこの頃知った。
 この書生の掌の裏うちでしばらくはよい心持に坐っておったが、しばらくすると非常な速力で運転し始めた。書生が動くのか自分だけが動くのか分らないが無暗むやみに眼が廻る。胸が悪くなる。到底とうてい助からないと思っていると、どさりと音がして眼から火が出た。それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。
 ふと気が付いて見ると書生はいない。たくさんおった兄弟が一疋ぴきも見えぬ。肝心かんじんの母親さえ姿を隠してしまった。その上今いままでの所とは違って無暗むやみに明るい。眼を明いていられぬくらいだ。はてな何でも容子ようすがおかしいと、のそのそ這はい出して見ると非常に痛い。吾輩は藁わらの上から急に笹原の中へ棄てられたのである。


  • ファイル書き込み( Files.write )
package mynio;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;

public class MynioMain {

	public static void main(String[] args) {

		//以下Windows環境で①、②ならいずれの書き方でもでも可。③は×。
		Path gotPath = Paths.get("C:\\nio\\test.txt"); //①
		//Path gotPath = Paths.get("C:/nio/test.txt"); //②
		//Path gotPath = Paths.get("C/nio/test.txt"); //③

		List<String> lines = new ArrayList();

		lines.add("ここから追記");
		lines.add("ようやくの思いで笹原を這い出すと向うに大きな池がある。");

		try {
			/*StandardOpenOption(列挙型)で用意された値を使用。
               write用には以下を使う。
                 ①APPEND・・・対象ファイルに追記する。
                 ②CREATE・・・対象ファイルが存在しない場合は新規作成する。
                 ③TRUNCATE_EXISTING・・・対象ファイルにもともと書き込まれていたデータを削除し新しく書込み
            */
			Files.write(gotPath, lines, StandardOpenOption.APPEND);

		} catch (IOException e) {
			e.printStackTrace();

		}
	}
}
  • ファイル新規作成( Files.createFile )
package mynio;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class MynioMain {

	public static void main(String[] args) {

		//以下Windows環境で①、②ならいずれの書き方でもでも可。③は×。
		Path gotPath = Paths.get("C:\\nio\\test.txt"); //①
		//Path gotPath = Paths.get("C:/nio/test.txt"); //②
		//Path gotPath = Paths.get("C/nio/test.txt"); //③

		try {
			//すでに存在するファイル作成しようとすると例外スローするため事前に存在確認推奨。
			if ( Files.exists(gotPath) ) {
				//第2引数で属性設定可。
				Files.createFile(gotPath);

			}

		} catch (IOException e) {
			e.printStackTrace();

		}
	}
}

エラー

java.nio.file.FileAlreadyExistsException: C:\nio\test.txt
	at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:87)
	at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
	at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
	at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:235)
	at java.base/java.nio.file.Files.newByteChannel(Files.java:371)
	at java.base/java.nio.file.Files.createFile(Files.java:648)
	at mynio.MynioMain.main(MynioMain.java:19)
  • ファイル削除( Files.delete, Files.deleteExists )
package mynio;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class MynioMain {

	public static void main(String[] args) {

		//以下Windows環境で①、②ならいずれの書き方でもでも可。③は×。
		Path gotPath = Paths.get("C:\\nio\\test2.txt"); //①
		//Path gotPath = Paths.get("C:/nio/test.txt"); //②
		//Path gotPath = Paths.get("C/nio/test.txt"); //③

		try {
			//存在しないファイル作成しようとすると例外スローするため事前に存在確認推奨。
			if ( Files.exists(gotPath) ) {
				//第2引数で属性設定可。
				Files.delete(gotPath);

			}

			//以下を使うと存在確認+削除が可能。削除結果に応じてbooleanを返すのでこっちの方が使いやすい。
			//Files.deleteIfExists(gotPath);

		} catch (IOException e) {
			e.printStackTrace();

		}
	}
}

エラー

java.nio.file.NoSuchFileException: C:\nio\test3.txt
	at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
	at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
	at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
	at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:274)
	at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105)
	at java.base/java.nio.file.Files.delete(Files.java:1142)
	at mynio.MynioMain.main(MynioMain.java:21)

tips eclipse環境のjava.nio.file実行でハマった。。。(【Java】eclipseのJavaバージョンについて)

tips java.nioとjava.ioの違い

まとめ

はい。ということで、今回は「java.nio.file」を使ったファイル操作について紹介しました。説明したのは、基本的な操作だけでしたが、これでも結構出来ることが広がると思います。あと、ファイル操作はなんだかんだ使うんじゃないかなと。。。

シロクマくん

説明しきれなかった各メソッドのオプションまわりと、java.nio.fileの詳細はJava11の公式APIを見てね!