はじめに
こんにちは ◤●ㅅ●◥ノ
今回はファイル操作について学びました!
第6章 ファイルの操作
1.ファイル操作の事前知識
ファイルとは
データをコンピュータに記憶させる時の基本単位のこと
ファイルの読み書きは必ず以下の順序で行う
手順を守らないと致命的な不具合につながる
1.「最初に1回」ファイルを開く
2.「必要な回数」ファイルのデータを読み込み、書き込み
3.「最後に1回」ファイルを閉じる
ファイルの読み込み、書き込み方法の種類
・ランダムアクセス
ファイルのあちこちに読み書きをする方法
・シーケンシャルアクセス
ある場所から連続して少しずつ読み書きする方法
2.テキストファイルの読み書き
ファイルに文字情報を書き込む
→java.ioパッケージのFileWriterクラスを利用する
※必要な情報を書き込んだらファイルを閉じる前に必ずflush()を呼び出す
→呼び出さないとファイルに正しくデータが書き込まれないことがあるため
ファイルの先頭から1文字ずつデータを読み取る
→java.ioパッケージのFileReaderクラスを利用する
3.バイナリファイルの読み書き
普段利用しているさまざまなファイルは大きく2種類に分類できる
・テキストファイル
文字として解釈可能なデータ(文字列)
・バイナリファイル
文字とは解釈できないデータ(バイト列)
バイナリファイルの書き込み→FileOutputStreamクラス
バイナリファイルの読み込み→FileInputStreamクラス
を利用する
文字とコードの違い
文字「A」
コード「01000001」
のような感じ実質的には同じだけど人間がわかりやすいようにしている
漢字などの他のものだとどうなるのか
→アルファベット、数字、カタカナ、漢字など様々ある
→ある文字にどのようなバイト表現を割り当てるかというルールを決める
→文字コード体系(UTF-8など)
4.ファイル操作の落とし穴
ファイル操作をする際に陥りやすい、陥ると致命的な不具合につながる落とし穴がある
→ファイルを閉じるという操作
必ずclose()されることを保証する
途中でreturnしたり例外が発生したりする場合であっても、ファイルを開いたら必ず閉じる
ファイルを確実に閉じる方法
close()は必ずfinallyブロックに書く
5.ストリームの概念
JVMの外部データはメモリ不足になることを配慮して少しずつ読み書きするのが基本
このアプローチに沿ったデータの読み書きのようすを ストリーム という概念で捉える
ストリームはデータが少しずつ流れてくる「小川」のイメージで捉える
JVMは起動直後に3つのストリームを自動的に準備している
・標準出力
・標準出力エラー出力
・標準入力
通常ストリームはJVM外部のデータを少しずつ読み書きする際に利用するが、
内部の読み書きにも応用できる
→StringReaderクラスを利用する
6.フィルタの活用
Javaの世界ではストリームの途中に様々な変換処理をする部品を挟み込むことが可能であり、
それらはフィルタと呼ばれている
Javaが標準で準備しているCipherOutputStreamフィルタを1つ挟むだけで実現できる
JavaAPIではたくさんのフィルタが提供されており、それらは次の特徴を持っている
1.Filter~クラスを継承している
2.単独で存在できず、ストリームに接続する形で生成する
3.複数のフィルタを連結することができる
JavaAPIには、たくさんの種類のフィルタが標準で提供されている
中でも利用頻度が高いのはjava.ioパッケージに準備された4つのフィルタ
文字情報用:BufferedReader,BufferedWriter
バイト情報用:BuferedInputStream,BufferedOutputStream
この4つのクラスは バッファリングフィルタ と総称されている
バッファリングフィルタは上流から少しずつ流れてくるデータを溜め込み、まとまった量になったら下流に流す仕事をしてくれる
データを溜めて一定量ずつまとめて処理するメリットは何か
1.処理性能の向上
少量のデータを複数回より、まとめて1回で書き込む要求をする方が圧倒的に速い
2.まとまった単位でデータを読める
7.ファイルシステムの操作
ファイルそのものに対して操作を行うには別のAPIを用いる必要がある
→java.io.Fileクラス
java.io.Fileには懸念点が2つある
1.備えているファイル操作用の命令が少なく、中途半端
2.ファイルやフォルダを指し示す責務と各種の操作をする責務があり役割が混在している
解決するために
java.nio.file.Pathインタフェース
java.nio.file.Filesクラス
が導入されている
まとめ
ストリームはJVMがデータをやりとりする小川のイメージ
ファイルを前から順に読み書きする方法をシーケンシャルアクセスという
ファイルは必ずfinallyブロックまたはtry-with-resources文を利用して閉じる必要がある
ファイルは他のストリームやフィルタに連結して使用できる
ファイルの読み書きには通用バッファリングフィルタを併用する
java.io.Fileを用いて、特定のファイルやフォルダを指し示すことができる
今回もありがとうございました!
ではまた〜 ◤●ㅅ●◥ノ"