2012年08月15日

一時ファイル作成メソッド

あまり使い所無いかもしれません。


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


/**
* 指定したサイズの一時ファイルを作成し、そのFileオブジェクトを返す
*
* @param size ファイルサイズ
* @return 一時ファイルのFileオブジェクト
*/
public static File createFile(int size) {

final int BUF_SIZE = 4096;
FileOutputStream _fos = null;
try {

// ファイル接頭辞="Temp"、拡張子=".dat"
File tempFile = File.createTempFile("Temp", ".dat");

_fos = new FileOutputStream(tempFile);

int writeSize = size;
byte[] _byte = new byte[BUF_SIZE];
while (true) {
if (writeSize < BUF_SIZE) {
break;
}
_fos.write(_byte);

writeSize = writeSize - BUF_SIZE;
}
_byte = new byte[writeSize];
_fos.write(_byte);
_fos.flush();

return tempFile;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (_fos != null) {
try {
_fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
posted by 台北猫々 at 00:06| Comment(0) | TrackBack(0) | 技術メモ(Java)

2011年05月28日

phpのimplode関数みたいな2


/**
* リストを指定された区切り文字列で連結した文字列に変換する
*
* @param glue
* 区切り文字列
* @param pieces
* 数字リスト
* @return 変換後文字列
*/
public static String implode(String glue, List<Integer> pieces) {
StringBuffer buf = new StringBuffer();
for (int i = 0;; i++) {
buf.append(pieces.get(i));
if (i == pieces.size() - 1) {
break;
}
buf.append(glue);
}
return buf.toString();
}
posted by 台北猫々 at 23:37| Comment(0) | TrackBack(0) | 技術メモ(Java)

2011年04月16日

数値の前0埋め

以前に前0埋めを文字列の長さで判定して処理していたコード
を見かけましたが、↓の方がすっきりしますね。


import java.text.DecimalFormat;

public class Sample004 {
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("00");
System.out.println(df.format(9));
}
}


"09"
posted by 台北猫々 at 23:43| Comment(0) | TrackBack(0) | 技術メモ(Java)

2011年04月06日

西暦year年month月の第num day_of_month曜日の日にちを求める

ニッチな感じですが。
例えば、2011年4月の第4日曜日の日にちを求めたい、という時の処理

System.out.println(getTargetDay(2011, Calendar.APRIL, Calendar.SUNDAY, 4));

24
となります。


/**
* 西暦year年month月の第num day_of_month曜日の日にちを求める
*
* @param year
* 西暦
* @param month
* Calendar.JANUARY〜
* @param day_of_month
* Calendar.SUNDAY
* @param num
* 1〜
* @return
*/
public static int getTargetDay(int year, int month, int day_of_month, int num) {

Calendar cal = Calendar.getInstance();

// 指定年月の1日の曜日を取得
cal.set(year, month, 1);
int wday = cal.get(Calendar.DAY_OF_WEEK);

// 当月の1日の曜日(wday)と、指定曜日(day_of_month)を比較して処理分け
return wday > day_of_month
? (7 * num + 1) - (wday - day_of_month)
: (7 * (num - 1) + 1) + (day_of_month - wday);
}
posted by 台北猫々 at 22:49| Comment(0) | TrackBack(0) | 技術メモ(Java)

2011年02月05日

エンコーディングによる微妙な違い

受け取るデータの文字エンコーディングが、Shift_JISと聞いていたので、
文字列のバイト数チェックをShift_JISでやっていたのですが、思ったよう
に動かず、もしかしてと思って確認するとMS932でした。。。

ちょっと、うっかりしてました。
原因はこれ、"−"は変換では「[全]マイナス」という表記で表示されているもの。

String str = "−";
System.out.println("SJISの場合は[" + str.getBytes("Shift_JIS").length + "]");
System.out.println("MS932の場合は[" + str.getBytes("MS932").length + "]");


SJISの場合は[1]
MS932の場合は[2]

全角文字のバイト数で違いがあるのですね。
posted by 台北猫々 at 23:58| Comment(0) | TrackBack(0) | 技術メモ(Java)

2011年02月03日

そういうのがあるんだぁ

Hibernate(3.6)で、log4jを使用してログを出力しようと思いまして、
log4j.xmlの設定を行なったのですが、全くログ出力せず。。。

なんでかなと、色々と試しても駄目で、しょうがなくソースを見てみると

 import org.slf4j.Logger;

こんな感じの記述がしてあったので、ラッパーを使用しているのかなとリンク
しているjarファイルを見ると、

 slf4j-nop-1.6.1.jar

こんなのがありまして、SLF4Jを見ると、ログの出力を抑止するものらしい。。。

 slf4j-log4j12-1.6.1.jar

かわりにこちら↑を配置したら、ログが出力されました。

説明無しで環境を渡されると、無駄な労力をとられますな。
posted by 台北猫々 at 23:18| Comment(0) | TrackBack(0) | 技術メモ(Java)

2011年01月30日

スタックトレースを文字列として取得

Javaで例外が発生した場合に、そのスタックトレース(printStackTrace()で
標準出力するような情報)をログファイルに出力したいことがありまして、

ただ、ExceptionのメソッドでスタックトレースをStringとして直接取得する
メソッドが無いようなので、以下のgetStackTraceメソッドを作成してみました。

===

package example;

public class Sample001 {

public static void main(String[] args) {
try {
Integer.parseInt("a");
} catch (NumberFormatException e) {
System.out.println(getStackTrace(e));
}
}

public static String getStackTrace(Exception e) {
StackTraceElement[] list = e.getStackTrace();
String rtn = e.getClass() + ":" + e.getMessage() + "\n";
for( StackTraceElement s : list ) {
rtn += s.toString() + "\n";
}
return rtn;
}

}

【実行結果】
class java.lang.NumberFormatException:For input string: "a"
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
java.lang.Integer.parseInt(Integer.java:447)
java.lang.Integer.parseInt(Integer.java:497)
example.Sample001.main(Sample001.java:11)
posted by 台北猫々 at 16:41| Comment(3) | TrackBack(0) | 技術メモ(Java)

2010年08月23日

Javaでファイルの文字コード判別

タイトルの機能が必要になりそうなので、ちょっと探してみたら
既に素敵ライブラリが提供されていました。

やはり、Javaの集合知はすごいですね。

「juniversalchardet」
http://code.google.com/p/juniversalchardet/
posted by 台北猫々 at 23:32| Comment(0) | TrackBack(0) | 技術メモ(Java)

2010年08月17日

Tomcatの設定ファイルが復元

Tomcatの設定ファイル(server.xml、tomcat-users.xmlなど)を変更して、Eclipseの【サーバービュー】からTomcatを起動すると、あら不思議。

設定ファイルが初期状態に戻ってしまいます。何度やりなおしても、同じ結果にTomcatのホームディレクトリ配下を検索しても、元のファイルはどこにもないし、どうなっているのよ。と四苦八苦していたのですが、、、

わかってしまいました。

Eclipseの【サーバービュー】にTomcatの情報を登録する時に自動作成されますワークスペース内の、Serversプロジェクトの中の「ローカル・ホスト の Tomcat v5.0 サーバー-config」というフォルダの中にデフォルトの設定ファイルがあって、起動時にここから実行環境にコピーされていたようです。

こんな仕様知らなかったー
posted by 台北猫々 at 22:48| Comment(0) | TrackBack(0) | 技術メモ(Java)

2010年07月27日

四捨五入

double変数を指定された精度で丸めた結果を文字列として返します。


/**
* 四捨五入
*
* @param db
* 処理対象データ
* @param scale
* 小数点以下のスケール。指定されたスケールにまるめます。
* @return 計算結果
*/
public static String halfUp( double db, int scale ) {
BigDecimal d = new BigDecimal(db);
return (d.setScale(scale, RoundingMode.HALF_UP)).toString();
}

posted by 台北猫々 at 22:21| Comment(0) | TrackBack(0) | 技術メモ(Java)

2010年07月26日

「日付文字列をDateに変換」のメモ

import java.text.DateFormat;
import java.util.Date;

Date d = DateFormat.getDateInstance().parse("2010/2/1");
posted by 台北猫々 at 23:43| Comment(0) | TrackBack(0) | 技術メモ(Java)

2009年02月28日

JavaでExcel仕様のCSVファイルの読み込みと表示

ExcelのCSV仕様に沿ったCSVファイルデータをJavaで分割・表示します。というソースを作成しようと思いましたが、既にあったので、紹介します。

OpenCsv「CSVReaderクラス」
http://opencsv.sourceforge.net/

【ExcelのCSV仕様】
エンクォート文字(")で囲まれた区切り文字(,)および改行はスキップします。
また、項目中のエンクォート文字(")の連続2個("")は、エンクォート文字1個(")に置き換えられます。
具体例:
47201,"900 ","900,""0000"
というデータは、
[47201] [900 ] [900,"0000]
のように分割されます。

【使用例】

import java.io.FileReader;

public class CsvFileReadSkeleton {

public static void main(String[] args) throws Exception {
CSVReader reader = new CSVReader(new FileReader("c:\\okinawa.csv"));
String [] nextLine;
int i=1;
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
System.out.println("Row Number => " + i);
for( String data : nextLine ) {
System.out.println("[" + data + "]");
}
i++;
}
}
}
posted by 台北猫々 at 23:39| Comment(0) | TrackBack(1) | 技術メモ(Java)

2009年02月27日

TERASOLUNAで、全角文字→半角文字変換と半角文字→全角文字変換

NTTデータが公開しているTERASOLUNAフレームワークなんですが、中を見ると結構便利なユーティリティクラスがあります。
そんな中で、今回は全角文字→半角文字変換と半角文字→全角文字変換を使ってみます。

TERASOLUNAサイトのダウンロードページから、ブランクプロジェクトをダウンロードして適当な場所で解凍します。
そして、"terasoluna-spring-thin-blank\webapps\WEB-INF\lib\terasoluna-thin-server.jar"ファイルをEclipseプロジェクトに追加しましょう。

で、以下のソースを作成・実行するとTERASOLUNAによる文字変換を体験できます。ICUと比較して機能が限定されている分でしょうか、処理が軽い気がします。

import jp.terasoluna.fw.util.StringUtil;

public class TestTerasolunaStringUtil {

public static void main(String args[]) {

String src = "AaAアいろはアイウエイウエ";

//全角文字→半角文字に変換
System.out.println(src + "→★(全角文字→半角文字)★→" + StringUtil.zenkakuToHankaku(src));

//半角文字→全角文字に変換
System.out.println(src + "→★(半角文字→全角文字)★→" + StringUtil.hankakuToZenkaku(src));
}
}




AaAアいろはアイウエイウエ→★(全角文字→半角文字)★→AaAアいろはアイウエイウエ
AaAアいろはアイウエイウエ→★(半角文字→全角文字)★→AaAアいろはアイウエイウエ

と、なります。

ちなみにソースは、"terasoluna-spring-thin-blank\terasoluna\src\terasoluna-server4jweb-src_2.0.1.0.zip"にあります。
posted by 台北猫々 at 22:09| Comment(0) | TrackBack(0) | 技術メモ(Java)

2009年02月26日

Javaで、ICUで、文字変換

ICUサイトダウンロードページから、ICU4J(今回は"icu4j-4_0_1.jar")をダウンロードします。

EclipseプロジェクトにICU4JのJarを追加します。で、以下のソースを作成・実行するとICUによる文字変換を体験できます。


import com.ibm.icu.text.*;
import com.ibm.icu.util.*;

public class TestICU {

public static void main(String args[]) {

String src = "AaAアいろはアイウエイウエ";

//全角文字→半角文字に変換
Transliterator trF2H = Transliterator.getInstance("Fullwidth-Halfwidth");
System.out.println(src + "→★(全角文字→半角文字)★→" + trF2H.transliterate(src));

//半角文字→全角文字に変換
Transliterator trH2F = Transliterator.getInstance("Halfwidth-Fullwidth");
System.out.println(src + "→★(半角文字→全角文字)★→" + trH2F.transliterate(src));

//カタカナ→ひらがなに変換
Transliterator trK2H = Transliterator.getInstance("Katakana-Hiragana");
System.out.println(src + "→★(カタカナ→ひらがな)★→" + trK2H.transliterate(src));

//ひらがな→カタカナ変換
Transliterator trH2K = Transliterator.getInstance("Hiragana-Katakana");
System.out.println(src + "→★(ひらがな→カタカナ)★→" + trH2K.transliterate(src));

//ひらがな→ローマ字に変換
Transliterator trH2L = Transliterator.getInstance("Hiragana-Latin");
System.out.println(src + "→★(ひらがな→ローマ字)★→" + trH2L.transliterate(src));

}
}




AaAアいろはアイウエイウエ→★(全角文字→半角文字)★→AaAアいろはアイウエイウエ
AaAアいろはアイウエイウエ→★(半角文字→全角文字)★→AaAアいろはアイウエイウエ
AaAアいろはアイウエイウエ→★(カタカナ→ひらがな)★→AaAあいろはあいうえいうえ
AaAアいろはアイウエイウエ→★(ひらがな→カタカナ)★→AaAアイロハアイウエイウエ
AaAアいろはアイウエイウエ→★(ひらがな→ローマ字)★→AaAアirohaアイウエイウエ

となります。

ちなみに、


import org.apache.commons.collections.EnumerationUtils;

for(Object s : EnumerationUtils.toList(Transliterator.getAvailableIDs()) )
System.out.println(s);


↑で可能な変換のリストを閲覧できます(ただし、commons-collections-3.1.jarが必要)
変換できるリスト
Accents-Any
Any-Accents
Any-Publishing
Arabic-Latin
Armenian-Latin
Bengali-Devanagari
Bengali-Gujarati
Bengali-Gurmukhi
Bengali-Kannada
Bengali-Latin
Bengali-Malayalam
Bengali-Oriya
Bengali-Tamil
Bengali-Telugu
Cyrillic-Latin
Devanagari-Bengali
Devanagari-Gujarati
Devanagari-Gurmukhi
Devanagari-Kannada
Devanagari-Latin
Devanagari-Malayalam
Devanagari-Oriya
Devanagari-Tamil
Devanagari-Telugu
Digit-Tone
Fullwidth-Halfwidth
Georgian-Latin
Greek-Latin
Greek-Latin/UNGEGN
Gujarati-Bengali
Gujarati-Devanagari
Gujarati-Gurmukhi
Gujarati-Kannada
Gujarati-Latin
Gujarati-Malayalam
Gujarati-Oriya
Gujarati-Tamil
Gujarati-Telugu
Gurmukhi-Bengali
Gurmukhi-Devanagari
Gurmukhi-Gujarati
Gurmukhi-Kannada
Gurmukhi-Latin
Gurmukhi-Malayalam
Gurmukhi-Oriya
Gurmukhi-Tamil
Gurmukhi-Telugu
Halfwidth-Fullwidth
Han-Latin
Hangul-Latin
Hebrew-Latin
Hiragana-Katakana
Hiragana-Latin
Jamo-Latin
Kannada-Bengali
Kannada-Devanagari
Kannada-Gujarati
Kannada-Gurmukhi
Kannada-Latin
Kannada-Malayalam
Kannada-Oriya
Kannada-Tamil
Kannada-Telugu
Katakana-Hiragana
Katakana-Latin
Latin-Arabic
Latin-Armenian
Latin-Bengali
Latin-Cyrillic
Latin-Devanagari
Latin-Georgian
Latin-Greek
Latin-Greek/UNGEGN
Latin-Gujarati
Latin-Gurmukhi
Latin-Han
Latin-Hangul
Latin-Hebrew
Latin-Hiragana
Latin-Jamo
Latin-Kannada
Latin-Katakana
Latin-Malayalam
Latin-NumericPinyin
Latin-Oriya
Latin-Syriac
Latin-Tamil
Latin-Telugu
Latin-Thaana
Latin-Thai
Malayalam-Bengali
Malayalam-Devanagari
Malayalam-Gujarati
Malayalam-Gurmukhi
Malayalam-Kannada
Malayalam-Latin
Malayalam-Oriya
Malayalam-Tamil
Malayalam-Telugu
NumericPinyin-Latin
NumericPinyin-Pinyin
Oriya-Bengali
Oriya-Devanagari
Oriya-Gujarati
Oriya-Gurmukhi
Oriya-Kannada
Oriya-Latin
Oriya-Malayalam
Oriya-Tamil
Oriya-Telugu
Pinyin-NumericPinyin
Publishing-Any
Simplified-Traditional
Syriac-Latin
Tamil-Bengali
Tamil-Devanagari
Tamil-Gujarati
Tamil-Gurmukhi
Tamil-Kannada
Tamil-Latin
Tamil-Malayalam
Tamil-Oriya
Tamil-Telugu
Telugu-Bengali
Telugu-Devanagari
Telugu-Gujarati
Telugu-Gurmukhi
Telugu-Kannada
Telugu-Latin
Telugu-Malayalam
Telugu-Oriya
Telugu-Tamil
Thaana-Latin
Thai-Latin
Tone-Digit
Traditional-Simplified
Any-Null
Any-Remove
Any-Hex/Unicode
Any-Hex/Java
Any-Hex/C
Any-Hex/XML
Any-Hex/XML10
Any-Hex/Perl
Any-Hex
Hex-Any/Unicode
Hex-Any/Java
Hex-Any/C
Hex-Any/XML
Hex-Any/XML10
Hex-Any/Perl
Hex-Any
Any-Lower
Any-Upper
Any-Title
Any-Name
Name-Any
Any-NFC
Any-NFD
Any-NFKC
Any-NFKD
Any-Latin
Any-Telugu
Any-Malayalam
Any-Oriya
Any-Gurmukhi
Any-Gujarati
Any-Bengali
Any-Devanagari
Any-Kannada
Any-Tamil
Any-Han
Any-Katakana
Any-Hiragana
Any-Armenian
Any-Cyrillic
Any-Hangul
Any-Arabic
Any-Greek
Any-Greek/UNGEGN
Any-Hebrew
Any-Thai
Any-Syriac
Any-Thaana
Any-Georgian
posted by 台北猫々 at 21:11| Comment(0) | TrackBack(1) | 技術メモ(Java)

2009年02月20日

正規表現で、渡された文字列に半角カタカナが存在するか?のチェック(Java編)



/**
* 文字列に半角カタカナが存在するか?
* 参考:
* http://www.unicode.org/charts/PDF/U0000.pdf
*/

private static final String P_HALF_KATAKANA = ".*[\\uFF65-\\uFF9F].*";

/**
* 文字列に半角カタカナが存在するか?
* @param str チェック対象文字列
* @return はい:true いいえ:false
*/

public static boolean existHalfKatakana(String str) {
return str.matches(P_HALF_KATAKANA);
}

posted by 台北猫々 at 21:42| Comment(1) | TrackBack(1) | 技術メモ(Java)

2009年02月19日

正規表現で、渡された文字列に非半角数字があるか?のチェック(Java編)


/**
* 文字列に半角数字でない文字が存在するか?
* 参考:
* http://www.unicode.org/charts/PDF/U0000.pdf
*/

private static final String P_NOT_DIGIT = ".*[^0-9].*";

/**
* 半角数字でない文字があるか
* @param str チェック対象文字列
* @return 半角数字でない文字がある:true ない:false
*/

public static boolean existNotDigit(String str) {
return str.matches(P_NOT_DIGIT);
}
posted by 台北猫々 at 21:29| Comment(0) | TrackBack(0) | 技術メモ(Java)

2009年02月18日

正規表現で、文字列は全て半角英数字か?のチェック(Java編)


/**
* 文字列が「半角英数字」のみか?
*/

private static final String P_ALPHA_DIGIT_ONLY = "^[0-9A-Za-z]+$";


/**
* 全て半角英数字か?
* @param str チェック対象文字列
* @return はい:true いいえ:false
*/

public static boolean isAlphaDigitOnly(String str) {
return str.matches(P_ALPHA_DIGIT_ONLY);
}
posted by 台北猫々 at 19:21| Comment(0) | TrackBack(0) | 技術メモ(Java)

2009年01月19日

JAXB2でオブジェクト→XMLして結果をStringに格納する方法のメモ

※clazzは、XML変換対象のクラス情報
 objは、XML変換対象のクラスのオブジェクト

JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller ma = context.createMarshaller();

StringWriter s = new StringWriter();
ma.marshal(obj, s);
System.out.println(s.toString());
posted by 台北猫々 at 20:24| Comment(0) | TrackBack(0) | 技術メモ(Java)

2009年01月08日

渡された文字列に非半角英字があるか?のチェック(Java編)


/**
* 文字列に半角英字でない文字が存在するか?
* 参考:
* http://www.unicode.org/charts/PDF/U0000.pdf
*/

private static final String P_NOT_ALPHA = ".*[^A-Za-z].*";

/**
* 半角英字でない文字があるか
* @param str チェック対象文字列
* @return 半角英字でない文字がある:true ない:false
*/

public static boolean existNotAlpha(String str) {
return str.matches(P_NOT_ALPHA);
}
posted by 台北猫々 at 20:56| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年12月25日

Javaでオブジェクト(ArrayListなど)のディープコピーを行う

HashMapのArrayListオブジェクトをディープコピーしようとすると、ループ文で1個づつコピーしなければなりませんが、ちょっと面倒です。そこで、ObjectOutputStreamで対象オブジェクトをシリアライズしてバイト配列に変換できることを利用して、ディープコピーするメソッドを紹介します。

/**
* ディープコピーします
* @param obj コピー元オブジェクト
* @return コピーオブジェクト
*/
public static Object deepCopy(Object obj)

これ↑が、ディープコピー用のメソッドです。実装および使用方法は、「ソースコード」に載せています。

「ソースコード」の実行結果は、

src:[{Aitem1=A1, Aitem3=A3, Aitem2=A2, Aitem4=A4, Aitem5=A5}]
src:[{Aitem1=A1, Aitem3=A3, Aitem2=A2, Aitem4=A4, Aitem5=A5}]
dst:[{Aitem1=A1-2, Aitem3=A3-2, Aitem2=A2-2, Aitem4=A4, Aitem5=A5}]

となり、ディープコピー先のdstオブジェクトに対して変更を行っても、コピー元のsrcオブジェクトには影響ありません。

ちなみに、deepCopy内でコメントオフしているシャローコピー(cloneメソッド)を有効にして、ディープコピーをコメントオフして実行すると、

src:[{Aitem1=A1, Aitem3=A3, Aitem2=A2, Aitem4=A4, Aitem5=A5}]
src:[{Aitem1=A1-2, Aitem3=A3-2, Aitem2=A2-2, Aitem4=A4, Aitem5=A5}]
dst:[{Aitem1=A1-2, Aitem3=A3-2, Aitem2=A2-2, Aitem4=A4, Aitem5=A5}]

となり、シャローコピーではコピー先への変更がコピー元にも影響します。

posted by 台北猫々 at 23:15| Comment(0) | TrackBack(1) | 技術メモ(Java)