【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ 
2014/06/24 Tue [edit]
これまで色々なテキストファイルの読み込み・保存関数を複数ページに渡って列挙してしまったので、一覧としてまとめてみる。説明等は簡略してあるので、詳細な解説や注意点など必要ならば、各記事を参照して貰いたい。例外処理・確認コードも省略する。定数も一番上の定義を共有とする(デフォルトのエンコードと読み込みバッファサイズのみ)。必要あれば、引数等を付け加えてオーバーロードしても良いだろう。
これらは、1つのクラスにまとめても良いが、できれば各プラットフォーム用(Android, Applet, 汎用等)に分けて置いた方が無駄がなくて良いかも。
ストリームからの読み込み・保存
ローカルシステムから、テキストファイルの読み込み・保存
ストリームからテキストを行読みする(OS依存)
URL経由で外部Webサーバ上(http)のテキストファイルを読み込む(ダウンロードする)
【Android】
res/raw フォルダから、テキストファイルの読み込み
assets フォルダから、テキストファイルの読み込み
内部ストレージから、テキストファイルの読み込み・保存
SDカードから、テキストファイルの読み込み・保存
エラーをSDカードに書き出す(別ページ)
プリファレンス機能で値の読み込み・保存(別ページ)
【Applet】
URL経由で同Webサーバ上のテキストファイルを読み込む
jar ファイル内から、テキストファイルを読み込む
■【共通】 ストリームからの読み込み・保存
//設定値
private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード
private static final int DEFAULT_READ_LENGTH = 8192; //一度に読み込むバッファサイズ
//入力ストリームから読み込み、バイト配列で返す(汎用)
public static final byte[] readStream(InputStream inputStream, int readLength) throws IOException {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(readLength); //一時バッファのように使う
final byte[] bytes = new byte[readLength]; //read() 毎に読み込むバッファ
final BufferedInputStream bis = new BufferedInputStream(inputStream, readLength);
try {
int len = 0;
while ((len = bis.read(bytes, 0, readLength)) > 0) {
byteStream.write(bytes, 0, len); //ストリームバッファに溜め込む
}
return byteStream.toByteArray(); //byte[] に変換
} finally {
try {
byteStream.reset(); //すべてのデータを破棄
bis.close(); //ストリームを閉じる
} catch (Exception e) {
//IOException
}
}
}
//入力ストリームから読み込み、テキストエンコードして返す(汎用)
public static final String loadText(InputStream inputStream, String charsetName)
throws IOException, UnsupportedEncodingException {
return new String(readStream(inputStream, DEFAULT_READ_LENGTH), charsetName);
}
//出力ストリームにてテキストを保存(汎用)
public static final void saveText(OutputStream outputStream, String text, String charsetName)
throws IOException, UnsupportedEncodingException {
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(outputStream);
bos.write(text.getBytes(charsetName)); //すべての byte[] を取得
bos.flush();
} finally {
try {
bos.close();
} catch (Exception e) {
//IOException
}
}
}
(解説) readStream(), loadText()
(解説) saveText()
■【共通】 ローカルシステム(Windows 等)から、テキストファイルの読み込み・保存
//ローカルシステム(Windows 等)から、テキストファイルを読み込む(汎用)
//(ex) String fileName = "C:/res/data/sample.txt"; //相対パスでも良い
// String text = loadTextLocal(fileName);
public static final String loadTextLocal(String fileName) throws IOException, FileNotFoundException {
InputStream is = new FileInputStream(fileName);
return loadText(is, DEFAULT_ENCORDING);
}
//ローカルシステム(Windows 等)に、テキストファイルを保存(汎用)
//(ex) String fileName = "C:/res/data/sample.txt"; //相対パスでも良い
// String text = "保存するテキスト";
// saveTextLocal(fileName, text);
public static final void saveTextLocal(String fileName, String text) throws IOException {
OutputStream os = new FileOutputStream(fileName);
saveText(os, text, DEFAULT_ENCORDING);
}
(解説) loadTextLocal()
■【共通】ストリームからテキストを行読みする(OS依存)
/**<h1>ストリームからテキストを行読みする(行セパレータを指定)</h1>
* <p>行末にセパレータを付ける。エンコードはシステム依存となる。</p>
* @param is : 入力ストリーム
* @param lineSep : 行セパレータ("\n" など)
* @return<b>String</b> : 読み込んだテキスト
* @throws IOException
*/
public static final String readLinesText(final InputStream is, final String lineSep) throws IOException {
final StringBuilder str = new StringBuilder();
final BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
while (br.ready()) {
str.append(br.readLine()); //終端文字は含まない
str.append(lineSep); //改行コードなど
}
return str.toString();
} finally {
br.close();
str.setLength(0);
}
}
/**<h1>ストリームからテキストを行読みする(OS依存の改行が付く)</h1>
* <p>行末にセパレータ(改行)を付ける。エンコードはシステム依存となる。</p>
* @param is : 入力ストリーム
* @return<b>String</b> : 読み込んだテキスト
* @throws IOException
*/
public static final String readLinesText(final InputStream is) throws IOException {
return readLinesText(is, System.getProperty("line.separator")); //OS依存 改行コード
}
/**<h1>行ごとに文字列を読み込んでリストで返す(OS 依存)</h1>
* <p>各要素の終端は改行を含まない。</p>
* @param is : 入力ストリーム
* @return<b>List<String></b> : 行ごとの文字列
* @throws IOException
*/
public static final List<String> readLinesList(final InputStream is) throws IOException {
final List<String> list = new ArrayList<String>();
final BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
while (br.ready()) {
list.add(br.readLine()); //終端文字は含まない
}
return list;
} finally {
br.close();
}
}
(解説) readLinesText()
■【Android】 res/raw フォルダから、テキストファイルの読み込み
// res/raw フォルダから、リソース名でテキストファイルを読み込む(Android 用)
//(ex) String resName= "sample"; // "res/raw/sample.txt" の場合
// String text = loadTextRaw(resName, this); //this は起動 Activity 等(Context)
public static final String loadTextRaw(String resName, Context context) throws IOException, FileNotFoundException {
final int id = context.getResources().getIdentifier(resName, "raw", context.getPackageName());
if (id == 0) { //エラーにはならない
throw new FileNotFoundException();
}
InputStream is = context.getResources().openRawResource(id);
return loadText(is, DEFAULT_ENCORDING);
}
// res/raw フォルダから、リソースID でテキストファイルを読み込む(Android 用)
//(ex) int rawId = R.raw.text; // "res/raw/sample.txt" の場合
// String text = loadTextRaw(rawId, this); //this は起動 Activity 等(Context)
public static final String loadTextRaw(int rawId, Context context) throws IOException, FileNotFoundException {
if (rawId == 0) {
return null;
}
InputStream is = context.getResources().openRawResource(rawId);
return loadText(is, DEFAULT_ENCORDING);
}
(解説) loadTextRaw()
■【Android】 assets フォルダから、テキストファイルの読み込み
// assets フォルダから、テキストファイルを読み込む(Android 用)
//(ex) String fileName = "res/data/sample.txt"; // assets/ 以下の相対パス
// String text = loadTextAsset(fileName, this); //this は起動 Activity 等(Context)
public static final String loadTextAsset(String fileName, Context context) throws IOException, FileNotFoundException {
final AssetManager assetManager = context.getAssets();
InputStream is = assetManager.open(fileName);
return loadText(is, DEFAULT_ENCORDING);
}
(解説) loadTextAsset()
■【Android】 内部ストレージから、テキストファイルの読み込み・保存
// 内部ストレージから、テキストファイルを読み込む(Android 用)
//(ex) String fileName = "sample.txt"; // "data/data/[パッケージ名]/files/sample.txt" になる
// String text = loadTextLocalStorage(fileName, this); //this は起動 Activity 等(Context)
public static final String loadTextLocalStorage(String fileName, Context context)
throws IOException, FileNotFoundException {
InputStream is = context.openFileInput(fileName);
return loadText(is, DEFAULT_ENCORDING);
}
//内部ストレージに、テキストファイルを保存する(Android 用)
// (ex) String fileName = "sample.txt"; // "data/data/[パッケージ名]/files/sample.txt" となる
// String text = "保存するテキスト";
// saveTextLocalStorage(fileName, text, this); //this は起動 Activity 等(Context)
public static final void saveTextLocalStorage(String fileName, String text, Context context) throws IOException {
// "data/data/[パッケージ名]/files/" 直下に保存。他アプリアクセス不可(MODE_PRIVATE)
OutputStream os = context.openFileOutput(fileName, Context.MODE_PRIVATE);
saveText(os, text, DEFAULT_ENCORDING);
}
(解説) loadTextLocalStorage()
(解説) saveTextLocalStorage()
■【Android】 SDカードから、テキストファイルの読み込み・保存
(※) Android4.4(API 19)あたりから内部ストレージの仮想パスに変わった模様
// SDCard のマウント状態のチェックする(Android 用)
public static final boolean isMountSDCard() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
return true; //マウントされている
} else {
return false; //マウントされていない
}
}
// SDCard のルートディレクトリを取得(Android 用)
public static final File getSDCardDir() {
return Environment.getExternalStorageDirectory();
}
// SDCard 内の絶対パスに変換(Android 用)
public static final String toSDCardAbsolutePath(String fileName) {
return getSDCardDir().getAbsolutePath() + File.separator + fileName;
}
// SDCard から、テキストファイルを読み込む(Android 用)
//(ex) String fileName = "sample.txt"; // "mnt/sdcard/sample.txt" or "sdcard/sample.txt" になる(端末による)
// String text = loadTextSDCard(fileName);
public static final String loadTextSDCard(String fileName) throws IOException {
if (!isMountSDCard()) { //マウント状態のチェック
throw new IOException("No Mount");
}
final String absPath = toSDCardAbsolutePath(fileName); //SDCard 内の絶対パスに変換
InputStream is = new FileInputStream(absPath);
return loadText(is, DEFAULT_ENCORDING);
}
//SDCard に、テキストファイルを保存する(Android 用)
// (ex) String fileName = "sample.txt"; // "mnt/sdcard/sample.txt" or "sdcard/sample.txt" になる(端末による)
// String text = "保存するテキスト";
// saveTextSDCard(fileName, text);
public static final void saveTextSDCard(String fileName, String text) throws IOException {
if (!isMountSDCard()) {
throw new IOException("No Mount");
}
final String absPath = toSDCardAbsolutePath(fileName); //SDCard 内の絶対パスに変換
OutputStream os = new FileOutputStream(absPath);
saveText(os, text, DEFAULT_ENCORDING);
}
(解説) loadTextSDCard(), isMountSDCard(), toSDCardAbsolutePath(), getSDCardDir()
(解説) saveTextSDCard()
(解説) saveText()
■【共通】 URL経由で外部Webサーバ上(http)のテキストファイルを読み込む(ダウンロードする)
//URL経由でWebサーバ上(http)のテキストファイルを読み込む(Android, Applet, 汎用)
//(ex) String httpUrl = "http://www.xxx.com/sample.txt"; //WebサイトのURL(http)
// String text = loadTextHttp(httpUrl, "UTF-8", 10000); //Timeout:10秒
//(Android) <uses-permission android:name="android.permission.INTERNET" /> が必要。
public static final String loadTextHttp(String httpUrl, String charsetName, int connectTimeout)
throws SocketTimeoutException, IOException {
final URL url = new URL(httpUrl);
final HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(connectTimeout); //接続タイムアウト
con.setRequestMethod("GET");
con.connect();
InputStream is = con.getInputStream();
return loadText(is, DEFAULT_ENCORDING);
}
(参考) JSON を PHP から送信して、Java で受信する
(参考) 画像を PHP から送信して、Android で受信する
■【Applet/汎用】 URL経由で同Webサーバ上のテキストファイルを読み込む
//URL経由でWebサーバ上のテキストファイルを読み込む(Applet, 汎用)
//(ex) String fileName = "res/data/sample.txt"; //html からの相対パス
// String text = loadTextURL(new URL(getCodeBase(), fileName)); //同サーバ上の場合
public static final String loadTextURL(URL url) throws IOException {
InputStream is = url.openStream();
return loadText(is, DEFAULT_ENCORDING);
}
(解説) loadTextURL()
■【Applet】 jar ファイル内から、テキストファイルを読み込む
//クラスから自身の jar の URL を取得する(jar 内の .class からのみ)
public static final URL getJarFileURL(Object object) {
try {
final ClassLoader loader = object.getClass().getClassLoader();
final String name = object.getClass().getName().replace('.', '/') + ".class";
final URL url = loader.getResource(name);
final Pattern p = Pattern.compile("^jar\\:(.+?\\.jar)\\!\\/(.*)");
final Matcher m = p.matcher(url.toString());
if (m.matches()) {
final MatchResult res = m.toMatchResult();
return new URL(res.group(1));
}
} catch (Exception e) {
//MalformedURLException, ClassCastException, NullPointerException, ...
}
return null; //取得失敗した場合はすべて null
}
//ファイルパスから jar 内のリソース URL を作成する
public static final String toJarURL(String fileName, Object context) {
final URL url = getJarFileURL(context); //jar の url を取得
if (url == null) {
return null; //失敗
}
return "jar:" + url.toString() + "!/" + fileName; //JAR URL 構文にするだけ
}
//jar ファイル内から、テキストファイルを読み込む(Applet 用)
//(ex) String fileName = "res/data/sample.txt"; //jar 内相対パス
// String text = loadTextJar(fileName, this); //this は起動 Applet 等(jar 内の .class)
public static final String loadTextJar(String fileName, Object context) throws IOException, FileNotFoundException {
final String jarUrl = toJarURL(fileName, context);
if (jarUrl == null) { //見つからないとき
throw new FileNotFoundException();
}
final URL url = new URL(jarUrl);
InputStream is = url.openStream();
return loadText(is, DEFAULT_ENCORDING);
}
(解説) getJarFileURL()
(解説) toJarURL()
(解説) loadTextJar()
Android のプリファレンス機能を使って読み込みや保存をするには→こちら
(関連記事)
【Android】エラーをSDカードに書き出す
【Android】Preference 機能を使ってデータを読み込み・保存する
【Android】assets フォルダから画像ファイルを読み込む
【Android】SDカードから画像ファイルを読み込む
【Android】SDカードに画像ファイルを保存する(png)
【Android】SDカードに画像ファイルを保存する(jpg)
【Android】内部ストレージから画像ファイルを読み込む
【Android】内部ストレージに画像ファイルを保存する(png)
【Android】内部ストレージに画像ファイルを保存する(jpg)
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/126-05b80898
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |