1 package charactermanaj.model.io;
\r
3 import java.io.ByteArrayInputStream;
\r
4 import java.io.ByteArrayOutputStream;
\r
5 import java.io.IOException;
\r
6 import java.io.InputStream;
\r
7 import java.io.InputStreamReader;
\r
10 * テキストの読み込みヘルパー.<br>
\r
14 public final class TextReadHelper {
\r
19 private TextReadHelper() {
\r
24 * 入力ストリームを指定して、テキストファイルを読み込みます.<br>
\r
25 * 入力ストリームは内部で閉じられます.<br>
\r
29 * @return テキスト、もしくはnull
\r
30 * @throws IOException
\r
33 public static String readTextTryEncoding(InputStream is) throws IOException {
\r
39 ByteArrayOutputStream bos = new ByteArrayOutputStream();
\r
42 while ((ch = is.read()) != -1) {
\r
43 bos.write((byte) ch);
\r
48 byte[] buf = bos.toByteArray();
\r
51 if (buf.length >= 2) {
\r
52 // Windowsのメモ帳はUTF-16にBOMをつけるので、これで判定できる。
\r
53 // 本アプリケーションのエクスポート時もUTF-16LEのBOM付きで出力する。
\r
54 // 一般的なエディタはUTF-16BEにはBOMをつけないので、事前に判定することはできない。
\r
55 if ((buf[0] & 0xff) == 0xff && (buf[1] & 0xff) == 0xfe) {
\r
57 } else if ((buf[0] & 0xff) == 0xfe && (buf[1] & 0xff) == 0xff) {
\r
61 if (enc == null && buf.length >= 3) {
\r
62 if ((buf[0] & 0xff) == 0xef && (buf[1] & 0xff) == 0xbb
\r
63 && (buf[1] & 0xff) == 0xbf) {
\r
64 // Windowsのメモ帳などはUTF-8にBOMをつけるので、これで判定できる。
\r
65 // 一般的なエディタではUTF-8のBOMはつけないのでUTF-8であるかどうかを事前判定することはできない。
\r
70 // BOMがない場合はMS932かEUC_JPのいずれかであろう、と仮定する。
\r
71 enc = "JISAutoDetect"; // SJIS/EUC_JPの自動判定
\r
75 StringBuilder str = new StringBuilder();
\r
76 InputStreamReader rd = new InputStreamReader(new ByteArrayInputStream(
\r
80 while ((ch = rd.read()) != -1) {
\r
81 str.append((char) ch);
\r
87 // 改行コードをプラットフォーム固有のものに変換
\r
88 String line = str.toString();
\r
89 line = line.replace("\r\n", "\n");
\r
90 line = line.replace("\r", "\n");
\r
91 line = line.replace("\n", System.getProperty("line.separator"));
\r