OSDN Git Service

character.iniと一緒にあるreadmeの取り込み
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / model / io / TextReadHelper.java
1 package charactermanaj.model.io;\r
2 \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
8 \r
9 /**\r
10  * テキストの読み込みヘルパー.<br>\r
11  * \r
12  * @author seraphy\r
13  */\r
14 public final class TextReadHelper {\r
15 \r
16         /**\r
17          * プライベートコンストラクタ\r
18          */\r
19         private TextReadHelper() {\r
20                 super();\r
21         }\r
22 \r
23         /**\r
24          * 入力ストリームを指定して、テキストファイルを読み込みます.<br>\r
25          * 入力ストリームは内部で閉じられます.<br>\r
26          * \r
27          * @param is\r
28          *            入力ストリーム\r
29          * @return テキスト、もしくはnull\r
30          * @throws IOException\r
31          *             失敗\r
32          */\r
33         public static String readTextTryEncoding(InputStream is) throws IOException {\r
34                 if (is == null) {\r
35                         return null;\r
36                 }\r
37 \r
38                 // 一旦メモリに取り込む\r
39                 ByteArrayOutputStream bos = new ByteArrayOutputStream();\r
40                 try {\r
41                         int ch;\r
42                         while ((ch = is.read()) != -1) {\r
43                                 bos.write((byte) ch);\r
44                         }\r
45                 } finally {\r
46                         is.close();\r
47                 }\r
48                 byte[] buf = bos.toByteArray();\r
49 \r
50                 String enc = null;\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
56                                 enc = "UTF-16LE";\r
57                         } else if ((buf[0] & 0xff) == 0xfe && (buf[1] & 0xff) == 0xff) {\r
58                                 enc = "UTF-16BE";\r
59                         }\r
60                 }\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
66                                 enc = "UTF-8";\r
67                         }\r
68                 }\r
69                 if (enc == null) {\r
70                         // BOMがない場合はMS932かEUC_JPのいずれかであろう、と仮定する。\r
71                         enc = "JISAutoDetect"; // SJIS/EUC_JPの自動判定\r
72                 }\r
73 \r
74                 // 文字列として変換\r
75                 StringBuilder str = new StringBuilder();\r
76                 InputStreamReader rd = new InputStreamReader(new ByteArrayInputStream(\r
77                                 buf), enc);\r
78                 try {\r
79                         int ch;\r
80                         while ((ch = rd.read()) != -1) {\r
81                                 str.append((char) ch);\r
82                         }\r
83                 } finally {\r
84                         rd.close();\r
85                 }\r
86 \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
92 \r
93                 return line;\r
94         }\r
95 \r
96 }\r