SQLの窓

2020年10月27日


Java : テキストファイルの入出力



SHIFT_JIS で入力して UTF8N(UTF8) と EUC-JP で出力します

Java のテキストファイル入力は、3つのクラスを1セットで使用します FileInputStream( バイトストリーム ) ▼ InputStreamReader( キャラクタセット処理 ) ▼ BufferedReader ( 行単位で処理する ) ※ 有効なキャラクタセットはこちら 書き込みで UTF8 を指定すると、いわゆる UTF8N になりますので、 BOM( EF BB BF ) が必要な場合は、事前に自分で FileOutputStream を使用して書き込みます
package lightbox;

import java.io.*;

//*****************************************************
// サンプルテストクラス
//*****************************************************
public class Main {

	//*************************************************
	// ●● テキストファイル処理 ●●
	// 
	// 【1】FileInputStream(String name) で
	// ( InputStream => FileInputStream )
	// InputStream を作成し、
	//
	// 【2】InputStreamReader(InputStream in, String charsetName)
	// ( Reader => InputStreamReader )
	// で Reader を作成し
	//
	// 【3】BufferedReader(Reader in) に渡す
	//*************************************************
    public static void main(String[] args) {

		System.out.println("処理開始");

		String targetFile = "readme.txt";
		String resultFile_utf8n = "readme.utf8n.txt";
		String resultFile_utf8 = "readme.utf8.txt";
		String resultFile_ujis = "readme.ujis.txt";

		try {

			// 生のバイトのストリーム
			// キャラクタセットを指定して読み込む為に、使用する
			// ↓【readme.txt】
			FileInputStream fis = new FileInputStream(targetFile);

			// SHIFT_JIS として読み込む為の準備
			// ↓【 FileInputStream】
			InputStreamReader isr = new InputStreamReader(fis, "ms932");

			// 行単位で読み込む為の準備
			BufferedReader br = new BufferedReader(isr);

			String line_buffer;

			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = br.readLine() ) ) {
				// コマンドプロンプトに表示
				System.out.println(line_buffer);
			}

			// 各々受け持ちクラスを閉じる
			br.close();
			isr.close();
			fis.close();


			// *******************************************************
			// ※ "UTF8" で、UTF8N になります
			// UTF8N に変換の為、再度同じファイルを入力
			// 今度は入力は変数を使わずに書く
			// *******************************************************
			br = new BufferedReader(
					new InputStreamReader(
						new FileInputStream(targetFile), "ms932"
					) 
			);
			// *******************************************************
			// UTF8N 用の書き込み用のインスタンスを同様に作成
			// *******************************************************
			BufferedWriter bw = new BufferedWriter(
					new OutputStreamWriter(
						new FileOutputStream(resultFile_utf8n), "utf8"
					) 
			);

			while ( null != (line_buffer = br.readLine() ) ) {
				// CrLf にするには、その通りに書き込む
				bw.write( line_buffer + "\r\n" );
			}
			bw.close();
			br.close();


			// *******************************************************
			// BOM( EF BB BF ) 付きにするには自分で先に書き出す
			// *******************************************************
			br = new BufferedReader(
					new InputStreamReader(
						new FileInputStream(targetFile), "ms932"
					) 
			);
			FileOutputStream fos = new FileOutputStream(resultFile_utf8);
			fos.write( 0xef );
			fos.write( 0xbb );
			fos.write( 0xbf );
			bw = new BufferedWriter(
					new OutputStreamWriter(
						fos, "utf8"
					) 
			);

			while ( null != (line_buffer = br.readLine() ) ) {
				// CrLf にするには、その通りに書き込む
				bw.write( line_buffer + "\r\n" );
			}
			bw.close();
			fos.close();
			br.close();


			// *******************************************************
			// EUC-JP に変換の為、再度同じファイルを入力
			// *******************************************************
			br = new BufferedReader(
					new InputStreamReader(
						new FileInputStream(targetFile), "ms932"
					) 
			);
			// *******************************************************
			// EUC-JP にするには "EUC_JP" でも "EUC-JP" OK
			// *******************************************************
			bw = new BufferedWriter(
					new OutputStreamWriter(
						new FileOutputStream(resultFile_ujis), "euc-jp"
					) 
			);

			while ( null != (line_buffer = br.readLine() ) ) {
				bw.write( line_buffer + "\r\n" );
			}
			bw.close();
			br.close();

		}
		catch( Exception e  ) {
			System.out.println(e.getMessage());
		}

		System.out.println("処理終了");


	}

}







posted by lightbox at 2020-10-27 18:59 | java : テキストファイル | このブログの読者になる | 更新情報をチェックする

2015年09月04日


Java : テキストファイルを読み込んで正規表現で置換

テキストファイルの一括読み込みが必要でしたが、結局一行づつ読み込んで結合するのがオーソドックスのようです。正規表現は、パターンが解っておれば、他の言語より解りやすいと思いました。
( ここでは、簡易的に String を結合していますが、本来は StringBufferStringBuilder を使用します )

パターンの意味

"max_execution_time\s*=\s*[^\n]*?\n"

max_execution_time で始まって、0個以上空白文字の次に = があって、その
次に0個以上空白文字があって、さらに改行以外の文字が0個以上あって改行で
終わる。
※ \s は空白文字です。その後に * が続くので、 \s* で0個以上の空白文字です

[^\n]*? の ? は一番短い一致ですが、この場合省略してもOKです。
[^\n]* が改行以外なので、かならず最短になります。

max_execution_time\s*=\s*\d+ を使うと、行の最後までを判断せずに
必要な部分のみを置換する事ができます
※ ここでは、(\d+) としてサブマッチで使っています
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Main {

	public static void main(String[] args) {
		Main thisClass = new Main();
		thisClass.testAction();
	}

	// メソッド
	void testAction() {
		MyTool out = new MyTool(">>>");
		out.println("処理開始");

		String textData = "";
		
		try {
			// 生のバイトのストリーム
			FileInputStream fis = new FileInputStream( "c:\\php\\php.ini" );
			// SHIFT_JIS として読み込む為の準備
			InputStreamReader isr = new InputStreamReader(fis, "Windows-31j");
			// 行単位で読み込む為の準備
			BufferedReader br = new BufferedReader(isr);
		
			String line_buffer = "";
			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = br.readLine() ) ) {
				textData += line_buffer + "\n";
			}
		
			// 閉じる
			br.close();
			isr.close();
			fis.close();
		}
		catch( Exception e ) {
			textData = e.toString();
		}
		
		// 置換対象の内容確認
		out.printlnTarget(textData);

		// その文字列のみの置換
		// ( = の前後に一つのスペースが入っていないと置換できません )
		String textData1 = textData.replace("max_execution_time = 30", "max_execution_time = 90");
		// 置換結果の確認
		out.printlnTarget(textData1);

		// その文字列と、行の終わりまでの置換
		Pattern regPat = Pattern.compile("max_execution_time\\s*=\\s*[^\\n]*?\\n");
		Matcher regMat = regPat.matcher(textData);
		String textData2 = regMat.replaceAll("max_execution_time = 90\n");
		// 置換結果の確認
		out.printlnTarget(textData2);

		out.println("処理終了");
	}

	// *****************************************************
	// 内部用クラス
	// *****************************************************
	class MyTool {

		private String mark = null;

		// コンストラクタ
		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}
		
		public void printlnTarget(String text) {
			Pattern regPat = Pattern.compile("max_execution_time\\s*=\\s*(\\d+)");
			Matcher regMat = regPat.matcher(text);

			println( "サブマッチ数 : " + regMat.groupCount()+"" );
			// find を実行しないと、サブマッチを取得できない
			if (regMat.find()) {
				println( regMat.group(0) ); // マッチ全体
				println( regMat.group(1) );	// ここが数字部分
			}
			System.out.println();
			
		}

	}	
	
}



タグ:java 正規表現
posted by lightbox at 2015-09-04 02:57 | java : テキストファイル | このブログの読者になる | 更新情報をチェックする

2009年09月28日


Java : iniファイルの読み取り

文字列処理のサンプルです。
Tomcat6.0 のサンプルに同梱しました( webapp\sample_basic\local_func.jsp )
実際は、セクションの処理やコメント行の処理が必要です( その他、同名エントリの処理等 )


// *********************************************************
// PHP.INI のエントリの値( 1 )
// ※ StringTokenizer
// コメントを考慮していません( ; )
// 行解析の前に;を含む右側の文字列を取り去る必要があります
// *********************************************************
public String getPhpIni_1( String Entry ) {

	String ret = "";

	try {
		// 生のバイトのストリーム
		FileInputStream fis = new FileInputStream("c:\\php\\php.ini");
		// SHIFT_JIS として読み込む為の準備
		InputStreamReader isr = new InputStreamReader(fis, "SJIS");
		// 行単位で読み込む為の準備
		BufferedReader br = new BufferedReader(isr);

		String line_buffer = "";
		// BufferedReader は、readLine が null を返すと読み込み終了
		String str = "";
		while ( null != (line_buffer = br.readLine() ) ) {
			StringTokenizer st = new StringTokenizer(line_buffer,"=",false);
			//トークンの出力
			while(st.hasMoreTokens()) {
				str = st.nextToken();
				str = str.trim();
				if(str.equalsIgnoreCase( Entry )){
					ret = st.nextToken();
					ret = ret.trim();
				}
			}
		}

		// 閉じる
		br.close();
		isr.close();
		fis.close();
	}
	catch( Exception e ) {
		ret = e.getMessage();
	}

	return ret;

}
// *********************************************************
// PHP.INI のエントリの値( 2 )
// ※ split
// コメントを考慮していません( ; )
// 行解析の前に;を含む右側の文字列を取り去る必要があります
// *********************************************************
public String getPhpIni_2( String Entry ) {

	String ret = "";

	try {
		// 生のバイトのストリーム
		FileInputStream fis = new FileInputStream("c:\\php\\php.ini");
		// SHIFT_JIS として読み込む為の準備
		InputStreamReader isr = new InputStreamReader(fis, "SJIS");
		// 行単位で読み込む為の準備
		BufferedReader br = new BufferedReader(isr);

		String line_buffer = "";
		// BufferedReader は、readLine が null を返すと読み込み終了
		String str = "";
		while ( null != (line_buffer = br.readLine() ) ) {
			String[] result = line_buffer.split("=");
			str = (String)result[0];
			str = str.trim();
			if(str.equalsIgnoreCase( Entry )){
				ret = (String)result[1];
				ret = ret.trim();
			}
		}

		// 閉じる
		br.close();
		isr.close();
		fis.close();
	}
	catch( Exception e ) {
		ret = e.getMessage();
	}

	return ret;

}



タグ:java Tomcat
posted by lightbox at 2009-09-28 17:47 | java : テキストファイル | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり