• R/O
  • SSH
  • HTTPS

util: Commit


Commit MetaInfo

Révision175 (tree)
l'heure2018-09-11 21:29:22
Auteurhirukawa_ryo

Message de Log

IMPORT PROJECT: auto-detect-reader

Change Summary

Modification

--- auto-detect-reader/trunk/gradlew.bat (nonexistent)
+++ auto-detect-reader/trunk/gradlew.bat (revision 175)
@@ -0,0 +1,84 @@
1+@if "%DEBUG%" == "" @echo off
2+@rem ##########################################################################
3+@rem
4+@rem Gradle startup script for Windows
5+@rem
6+@rem ##########################################################################
7+
8+@rem Set local scope for the variables with windows NT shell
9+if "%OS%"=="Windows_NT" setlocal
10+
11+set DIRNAME=%~dp0
12+if "%DIRNAME%" == "" set DIRNAME=.
13+set APP_BASE_NAME=%~n0
14+set APP_HOME=%DIRNAME%
15+
16+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17+set DEFAULT_JVM_OPTS=
18+
19+@rem Find java.exe
20+if defined JAVA_HOME goto findJavaFromJavaHome
21+
22+set JAVA_EXE=java.exe
23+%JAVA_EXE% -version >NUL 2>&1
24+if "%ERRORLEVEL%" == "0" goto init
25+
26+echo.
27+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28+echo.
29+echo Please set the JAVA_HOME variable in your environment to match the
30+echo location of your Java installation.
31+
32+goto fail
33+
34+:findJavaFromJavaHome
35+set JAVA_HOME=%JAVA_HOME:"=%
36+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37+
38+if exist "%JAVA_EXE%" goto init
39+
40+echo.
41+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42+echo.
43+echo Please set the JAVA_HOME variable in your environment to match the
44+echo location of your Java installation.
45+
46+goto fail
47+
48+:init
49+@rem Get command-line arguments, handling Windows variants
50+
51+if not "%OS%" == "Windows_NT" goto win9xME_args
52+
53+:win9xME_args
54+@rem Slurp the command line arguments.
55+set CMD_LINE_ARGS=
56+set _SKIP=2
57+
58+:win9xME_args_slurp
59+if "x%~1" == "x" goto execute
60+
61+set CMD_LINE_ARGS=%*
62+
63+:execute
64+@rem Setup the command line
65+
66+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67+
68+@rem Execute Gradle
69+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70+
71+:end
72+@rem End local scope for the variables with windows NT shell
73+if "%ERRORLEVEL%"=="0" goto mainEnd
74+
75+:fail
76+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77+rem the _cmd.exe /c_ return code!
78+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79+exit /b 1
80+
81+:mainEnd
82+if "%OS%"=="Windows_NT" endlocal
83+
84+:omega
--- auto-detect-reader/trunk/javadoc.css (nonexistent)
+++ auto-detect-reader/trunk/javadoc.css (revision 175)
@@ -0,0 +1,574 @@
1+/* Javadoc style sheet */
2+/*
3+Overall document style
4+*/
5+
6+@import url('resources/fonts/dejavu.css');
7+
8+body {
9+ background-color:#ffffff;
10+ color:#353833;
11+ font-family:Meiryo, "メイリオ", YuGothic, "Yu Gothic", "游ゴシック", Osaka, "MS PGothic", "MS Pゴシック", sans-serif;
12+ font-size:14px;
13+ margin:0;
14+}
15+a:link, a:visited {
16+ text-decoration:none;
17+ color:#4A6782;
18+}
19+a:hover, a:focus {
20+ text-decoration:none;
21+ color:#bb7a2a;
22+}
23+a:active {
24+ text-decoration:none;
25+ color:#4A6782;
26+}
27+a[name] {
28+ color:#353833;
29+}
30+a[name]:hover {
31+ text-decoration:none;
32+ color:#353833;
33+}
34+pre {
35+ font-family:MeiryoKe_Gothic, 'MigMix 1M', "MS Gothic", monospace;
36+ font-size:14px;
37+}
38+h1 {
39+ font-size:20px;
40+}
41+h2 {
42+ font-size:18px;
43+}
44+h3 {
45+ font-size:16px;
46+ font-style:italic;
47+}
48+h4 {
49+ font-size:13px;
50+}
51+h5 {
52+ font-size:12px;
53+}
54+h6 {
55+ font-size:11px;
56+}
57+ul {
58+ list-style-type:disc;
59+}
60+code, tt {
61+ font-family:MeiryoKe_Gothic, 'MigMix 1M', "MS Gothic", monospace;
62+ font-size:14px;
63+ padding-top:4px;
64+ margin-top:8px;
65+ line-height:1.4em;
66+}
67+dt code {
68+ font-family:MeiryoKe_Gothic, 'MigMix 1M', "MS Gothic", monospace;
69+ font-size:14px;
70+ padding-top:4px;
71+}
72+table tr td dt code {
73+ font-family:MeiryoKe_Gothic, 'MigMix 1M', "MS Gothic", monospace;
74+ font-size:14px;
75+ vertical-align:top;
76+ padding-top:4px;
77+}
78+sup {
79+ font-size:8px;
80+}
81+/*
82+Document title and Copyright styles
83+*/
84+.clear {
85+ clear:both;
86+ height:0px;
87+ overflow:hidden;
88+}
89+.aboutLanguage {
90+ float:right;
91+ padding:0px 21px;
92+ font-size:11px;
93+ z-index:200;
94+ margin-top:-9px;
95+}
96+.legalCopy {
97+ margin-left:.5em;
98+}
99+.bar a, .bar a:link, .bar a:visited, .bar a:active {
100+ color:#FFFFFF;
101+ text-decoration:none;
102+}
103+.bar a:hover, .bar a:focus {
104+ color:#bb7a2a;
105+}
106+.tab {
107+ background-color:#0066FF;
108+ color:#ffffff;
109+ padding:8px;
110+ width:5em;
111+ font-weight:bold;
112+}
113+/*
114+Navigation bar styles
115+*/
116+.bar {
117+ background-color:#4D7A97;
118+ color:#FFFFFF;
119+ padding:.8em .5em .4em .8em;
120+ height:auto;/*height:1.8em;*/
121+ font-size:11px;
122+ margin:0;
123+}
124+.topNav {
125+ background-color:#4D7A97;
126+ color:#FFFFFF;
127+ float:left;
128+ padding:0;
129+ width:100%;
130+ clear:right;
131+ height:2.8em;
132+ padding-top:10px;
133+ overflow:hidden;
134+ font-size:12px;
135+}
136+.bottomNav {
137+ margin-top:10px;
138+ background-color:#4D7A97;
139+ color:#FFFFFF;
140+ float:left;
141+ padding:0;
142+ width:100%;
143+ clear:right;
144+ height:2.8em;
145+ padding-top:10px;
146+ overflow:hidden;
147+ font-size:12px;
148+}
149+.subNav {
150+ background-color:#dee3e9;
151+ float:left;
152+ width:100%;
153+ overflow:hidden;
154+ font-size:12px;
155+}
156+.subNav div {
157+ clear:left;
158+ float:left;
159+ padding:0 0 5px 6px;
160+ text-transform:uppercase;
161+}
162+ul.navList, ul.subNavList {
163+ float:left;
164+ margin:0 25px 0 0;
165+ padding:0;
166+}
167+ul.navList li{
168+ list-style:none;
169+ float:left;
170+ padding: 5px 6px;
171+ text-transform:uppercase;
172+}
173+ul.subNavList li{
174+ list-style:none;
175+ float:left;
176+}
177+.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited {
178+ color:#FFFFFF;
179+ text-decoration:none;
180+ text-transform:uppercase;
181+}
182+.topNav a:hover, .bottomNav a:hover {
183+ text-decoration:none;
184+ color:#bb7a2a;
185+ text-transform:uppercase;
186+}
187+.navBarCell1Rev {
188+ background-color:#F8981D;
189+ color:#253441;
190+ margin: auto 5px;
191+}
192+.skipNav {
193+ position:absolute;
194+ top:auto;
195+ left:-9999px;
196+ overflow:hidden;
197+}
198+/*
199+Page header and footer styles
200+*/
201+.header, .footer {
202+ clear:both;
203+ margin:0 20px;
204+ padding:5px 0 0 0;
205+}
206+.indexHeader {
207+ margin:10px;
208+ position:relative;
209+}
210+.indexHeader span{
211+ margin-right:15px;
212+}
213+.indexHeader h1 {
214+ font-size:13px;
215+}
216+.title {
217+ color:#2c4557;
218+ margin:10px 0;
219+}
220+.subTitle {
221+ margin:5px 0 0 0;
222+}
223+.header ul {
224+ margin:0 0 15px 0;
225+ padding:0;
226+}
227+.footer ul {
228+ margin:20px 0 5px 0;
229+}
230+.header ul li, .footer ul li {
231+ list-style:none;
232+ font-size:13px;
233+}
234+/*
235+Heading styles
236+*/
237+div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
238+ background-color:#dee3e9;
239+ border:1px solid #d0d9e0;
240+ margin:0 0 6px -8px;
241+ padding:7px 5px;
242+}
243+ul.blockList ul.blockList ul.blockList li.blockList h3 {
244+ background-color:#dee3e9;
245+ border:1px solid #d0d9e0;
246+ margin:0 0 6px -8px;
247+ padding:7px 5px;
248+}
249+ul.blockList ul.blockList li.blockList h3 {
250+ padding:0;
251+ margin:15px 0;
252+}
253+ul.blockList li.blockList h2 {
254+ padding:0px 0 20px 0;
255+}
256+/*
257+Page layout container styles
258+*/
259+.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer {
260+ clear:both;
261+ padding:10px 20px;
262+ position:relative;
263+}
264+.indexContainer {
265+ margin:10px;
266+ position:relative;
267+ font-size:12px;
268+}
269+.indexContainer h2 {
270+ font-size:13px;
271+ padding:0 0 3px 0;
272+}
273+.indexContainer ul {
274+ margin:0;
275+ padding:0;
276+}
277+.indexContainer ul li {
278+ list-style:none;
279+ padding-top:2px;
280+}
281+.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt {
282+ font-size:12px;
283+ font-weight:bold;
284+ margin:10px 0 0 0;
285+ color:#4E4E4E;
286+}
287+.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
288+ margin:5px 0 10px 0px;
289+ font-size:14px;
290+ font-family:MeiryoKe_Gothic, 'MigMix 1M', "MS Gothic", monospace;
291+}
292+.serializedFormContainer dl.nameValue dt {
293+ margin-left:1px;
294+ font-size:1.1em;
295+ display:inline;
296+ font-weight:bold;
297+}
298+.serializedFormContainer dl.nameValue dd {
299+ margin:0 0 0 1px;
300+ font-size:1.1em;
301+ display:inline;
302+}
303+/*
304+List styles
305+*/
306+ul.horizontal li {
307+ display:inline;
308+ font-size:0.9em;
309+}
310+ul.inheritance {
311+ margin:0;
312+ padding:0;
313+}
314+ul.inheritance li {
315+ display:inline;
316+ list-style:none;
317+}
318+ul.inheritance li ul.inheritance {
319+ margin-left:15px;
320+ padding-left:15px;
321+ padding-top:1px;
322+}
323+ul.blockList, ul.blockListLast {
324+ margin:10px 0 10px 0;
325+ padding:0;
326+}
327+ul.blockList li.blockList, ul.blockListLast li.blockList {
328+ list-style:none;
329+ margin-bottom:15px;
330+ line-height:1.4;
331+}
332+ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList {
333+ padding:0px 20px 5px 10px;
334+ border:1px solid #ededed;
335+ background-color:#f8f8f8;
336+}
337+ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList {
338+ padding:0 0 5px 8px;
339+ background-color:#ffffff;
340+ border:none;
341+}
342+ul.blockList ul.blockList ul.blockList ul.blockList li.blockList {
343+ margin-left:0;
344+ padding-left:0;
345+ padding-bottom:15px;
346+ border:none;
347+}
348+ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
349+ list-style:none;
350+ border-bottom:none;
351+ padding-bottom:0;
352+}
353+table tr td dl, table tr td dl dt, table tr td dl dd {
354+ margin-top:0;
355+ margin-bottom:1px;
356+}
357+/*
358+Table styles
359+*/
360+.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary {
361+ width:100%;
362+ border-left:1px solid #EEE;
363+ border-right:1px solid #EEE;
364+ border-bottom:1px solid #EEE;
365+}
366+.overviewSummary, .memberSummary {
367+ padding:0px;
368+}
369+.overviewSummary caption, .memberSummary caption, .typeSummary caption,
370+.useSummary caption, .constantsSummary caption, .deprecatedSummary caption {
371+ position:relative;
372+ text-align:left;
373+ background-repeat:no-repeat;
374+ color:#253441;
375+ font-weight:bold;
376+ clear:none;
377+ overflow:hidden;
378+ padding:0px;
379+ padding-top:10px;
380+ padding-left:1px;
381+ margin:0px;
382+ white-space:pre;
383+}
384+.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link,
385+.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link,
386+.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover,
387+.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover,
388+.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active,
389+.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active,
390+.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited,
391+.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited {
392+ color:#FFFFFF;
393+}
394+.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,
395+.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span {
396+ white-space:nowrap;
397+ padding-top:5px;
398+ padding-left:12px;
399+ padding-right:12px;
400+ padding-bottom:7px;
401+ display:inline-block;
402+ float:left;
403+ background-color:#F8981D;
404+ border: none;
405+ height:16px;
406+}
407+.memberSummary caption span.activeTableTab span {
408+ white-space:nowrap;
409+ padding-top:5px;
410+ padding-left:12px;
411+ padding-right:12px;
412+ margin-right:3px;
413+ display:inline-block;
414+ float:left;
415+ background-color:#F8981D;
416+ height:16px;
417+}
418+.memberSummary caption span.tableTab span {
419+ white-space:nowrap;
420+ padding-top:5px;
421+ padding-left:12px;
422+ padding-right:12px;
423+ margin-right:3px;
424+ display:inline-block;
425+ float:left;
426+ background-color:#4D7A97;
427+ height:16px;
428+}
429+.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab {
430+ padding-top:0px;
431+ padding-left:0px;
432+ padding-right:0px;
433+ background-image:none;
434+ float:none;
435+ display:inline;
436+}
437+.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd,
438+.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd {
439+ display:none;
440+ width:5px;
441+ position:relative;
442+ float:left;
443+ background-color:#F8981D;
444+}
445+.memberSummary .activeTableTab .tabEnd {
446+ display:none;
447+ width:5px;
448+ margin-right:3px;
449+ position:relative;
450+ float:left;
451+ background-color:#F8981D;
452+}
453+.memberSummary .tableTab .tabEnd {
454+ display:none;
455+ width:5px;
456+ margin-right:3px;
457+ position:relative;
458+ background-color:#4D7A97;
459+ float:left;
460+
461+}
462+.overviewSummary td, .memberSummary td, .typeSummary td,
463+.useSummary td, .constantsSummary td, .deprecatedSummary td {
464+ text-align:left;
465+ padding:0px 0px 12px 10px;
466+}
467+th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th,
468+td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{
469+ vertical-align:top;
470+ padding-right:0px;
471+ padding-top:8px;
472+ padding-bottom:3px;
473+}
474+th.colFirst, th.colLast, th.colOne, .constantsSummary th {
475+ background:#dee3e9;
476+ text-align:left;
477+ padding:8px 3px 3px 7px;
478+}
479+td.colFirst, th.colFirst {
480+ white-space:nowrap;
481+ font-size:13px;
482+}
483+td.colLast, th.colLast {
484+ font-size:13px;
485+}
486+td.colOne, th.colOne {
487+ font-size:13px;
488+}
489+.overviewSummary td.colFirst, .overviewSummary th.colFirst,
490+.useSummary td.colFirst, .useSummary th.colFirst,
491+.overviewSummary td.colOne, .overviewSummary th.colOne,
492+.memberSummary td.colFirst, .memberSummary th.colFirst,
493+.memberSummary td.colOne, .memberSummary th.colOne,
494+.typeSummary td.colFirst{
495+ width:25%;
496+ vertical-align:top;
497+}
498+td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover {
499+ font-weight:bold;
500+}
501+.tableSubHeadingColor {
502+ background-color:#EEEEFF;
503+}
504+.altColor {
505+ background-color:#FFFFFF;
506+}
507+.rowColor {
508+ background-color:#EEEEEF;
509+}
510+/*
511+Content styles
512+*/
513+.description pre {
514+ margin-top:0;
515+}
516+.deprecatedContent {
517+ margin:0;
518+ padding:10px 0;
519+}
520+.docSummary {
521+ padding:0;
522+}
523+
524+ul.blockList ul.blockList ul.blockList li.blockList h3 {
525+ font-style:normal;
526+}
527+
528+div.block {
529+ font-size:14px;
530+ font-family:Meiryo, "メイリオ", YuGothic, "Yu Gothic", "游ゴシック", Osaka, "MS PGothic", "MS Pゴシック", sans-serif;
531+}
532+
533+td.colLast div {
534+ padding-top:0px;
535+}
536+
537+
538+td.colLast a {
539+ padding-bottom:3px;
540+}
541+/*
542+Formatting effect styles
543+*/
544+.sourceLineNo {
545+ color:green;
546+ padding:0 30px 0 0;
547+}
548+h1.hidden {
549+ visibility:hidden;
550+ overflow:hidden;
551+ font-size:10px;
552+}
553+.block {
554+ display:block;
555+ margin:3px 10px 2px 0px;
556+ color:#474747;
557+}
558+.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink,
559+.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel,
560+.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink {
561+ font-weight:bold;
562+}
563+.deprecationComment, .emphasizedPhrase, .interfaceName {
564+ font-style:italic;
565+}
566+
567+div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase,
568+div.block div.block span.interfaceName {
569+ font-style:normal;
570+}
571+
572+div.contentContainer ul.blockList li.blockList h2{
573+ padding-bottom:0px;
574+}
--- auto-detect-reader/trunk/src/main/java/net/osdn/util/io/AutoDetectReader.java (nonexistent)
+++ auto-detect-reader/trunk/src/main/java/net/osdn/util/io/AutoDetectReader.java (revision 175)
@@ -0,0 +1,298 @@
1+package net.osdn.util.io;
2+
3+import java.io.BufferedReader;
4+import java.io.File;
5+import java.io.FileInputStream;
6+import java.io.FileNotFoundException;
7+import java.io.IOException;
8+import java.io.InputStream;
9+import java.io.InputStreamReader;
10+import java.io.PushbackInputStream;
11+import java.io.Reader;
12+import java.nio.charset.Charset;
13+import java.nio.file.Files;
14+import java.nio.file.Path;
15+import java.util.ArrayList;
16+import java.util.List;
17+
18+import org.mozilla.universalchardet.UniversalDetector;
19+
20+/** 文字セットの自動判別機能を持つバッファリングされた文字型入力ストリームです。
21+ *
22+ * <p>このクラスは <a href="https://code.google.com/archive/p/juniversalchardet/">juniversalchardet 1.0.3</a> に依存しています。
23+ */
24+public class AutoDetectReader extends BufferedReader {
25+ private Impl reader;
26+
27+ private AutoDetectReader(Impl reader) {
28+ super(reader);
29+ this.reader = reader;
30+ }
31+
32+ private AutoDetectReader(Impl reader, int bufferSize) {
33+ super(reader, bufferSize);
34+ this.reader = reader;
35+ }
36+
37+ /** 読込み元のバイトストリームを指定して、デフォルト・サイズのバッファでバッファリングされた、文字型入力ストリームを作成します。
38+ *
39+ * @param in 読込み元のバイト・ストリーム
40+ */
41+ public AutoDetectReader(InputStream in) {
42+ this(new Impl(in));
43+ }
44+
45+ /** 読込み元のバイトストリームを指定して、指定されたサイズのバッファでバッファリングされた、文字入力ストリームを作成します。
46+ *
47+ * @param in 読込み元のバイト・ストリーム
48+ * @param bufferSize 入力バッファのサイズ
49+ * @throws IllegalArgumentException 入力バッファのサイズが0以下の場合。
50+ */
51+ public AutoDetectReader(InputStream in, int bufferSize) {
52+ this(new Impl(in), bufferSize);
53+ }
54+
55+ /** 読込み元のファイルを指定して、デフォルト・サイズのバッファでバッファリングされた、文字型入力ストリームを作成します。
56+ *
57+ * @param file 読込み元のファイル
58+ * @throws FileNotFoundException 指定されたファイルが存在しないか、通常ファイルではなくディレクトリであるか、またはなんらかの理由で開くことができない場合。
59+ */
60+ public AutoDetectReader(File file) throws FileNotFoundException {
61+ this(new FileInputStream(file));
62+ }
63+
64+ /** 読込み元のファイルを指定して、指定されたサイズのバッファでバッファリングされた、文字型入力ストリームを作成します。
65+ *
66+ * @param file 読込み元のファイル
67+ * @param bufferSize 入力バッファのサイズ
68+ * @throws FileNotFoundException 指定されたファイルが存在しないか、通常ファイルではなくディレクトリであるか、またはなんらかの理由で開くことができない場合。
69+ * @throws IllegalArgumentException 入力バッファのサイズが0以下の場合。
70+ */
71+ public AutoDetectReader(File file, int bufferSize) throws FileNotFoundException {
72+ this(new FileInputStream(file), bufferSize);
73+ }
74+
75+ /** 読込み元のファイルの名前を指定して、デフォルト・サイズのバッファでバッファリングされた、文字型入力ストリームを作成します。
76+ *
77+ * @param filename 読込み元のファイルの名前
78+ * @throws FileNotFoundException 指定されたファイルが存在しないか、通常ファイルではなくディレクトリであるか、またはなんらかの理由で開くことができない場合。
79+ */
80+ public AutoDetectReader(String filename) throws FileNotFoundException {
81+ this(new FileInputStream(filename));
82+ }
83+
84+ /** 読込み元のファイルの名前を指定して、指定されたサイズのバッファでバッファリングされた、文字型入力ストリームを作成します。
85+ *
86+ * @param filename 読込み元のファイルの名前
87+ * @param bufferSize 入力バッファのサイズ
88+ * @throws FileNotFoundException 指定されたファイルが存在しないか、通常ファイルではなくディレクトリであるか、またはなんらかの理由で開くことができない場合。
89+ * @throws IllegalArgumentException 入力バッファのサイズが0以下の場合。
90+ */
91+ public AutoDetectReader(String filename, int bufferSize) throws FileNotFoundException {
92+ this(new FileInputStream(filename), bufferSize);
93+ }
94+
95+ /** 読込み元のファイル・パスを指定して、デフォルト・サイズのバッファでバッファリングされた、文字型入力ストリームを作成します。
96+ *
97+ * @param path 読込み元のファイル・パス
98+ * @throws IOException 入出力エラーが発生した場合。
99+ */
100+ public AutoDetectReader(Path path) throws IOException {
101+ this(Files.newInputStream(path));
102+ }
103+
104+ /** 読込み元のファイル・パスを指定して、指定されたサイズのバッファでバッファリングされた、文字型入力ストリームを作成します。
105+ *
106+ * @param path 読込み元のファイル・パス
107+ * @param bufferSize 入力バッファのサイズ
108+ * @throws IOException 入出力エラーが発生した場合。
109+ * @throws IllegalArgumentException 入力バッファのサイズが0以下の場合。
110+ */
111+ public AutoDetectReader(Path path, int bufferSize) throws IOException {
112+ this(Files.newInputStream(path), bufferSize);
113+ }
114+
115+ /** この文字型入力ストリームの文字セットを返します。
116+ *
117+ * <p>通常、文字セットは読込み元のバイト・ストリームから自動判別されますが、
118+ * 自動判別できない場合にはJava仮想マシンのデフォルトの文字セットが使用されます。</p>
119+ *
120+ * <p>文字セットを自動判別するために、読込み元のバイト・ストリームの先読みが行われます。
121+ * このとき、バイト・ストリームの読み取りでエラーが発生すると、IOExceptionがスローされます。</p>
122+ *
123+ * @return 自動判別された文字コード。ただし、自動判別できなかった場合はJava仮想マシンのデフォルト文字セットが返されます。
124+ * @throws IOException 入出力エラーが発生した場合。
125+ */
126+ public Charset getCharset() throws IOException {
127+ return reader.getCharset();
128+ }
129+
130+ /** この文字型入力ストリームの文字セットを自動判別できたかどうかを返します。
131+ *
132+ * @return 読込み元のバイト・ストリームから文字セットを自動判別できた場合はtrue、そうでなければfalseを返します。
133+ * @throws IOException 入出力エラーが発生した場合。
134+ */
135+ public boolean isDetected() throws IOException {
136+ return reader.isDetected();
137+ }
138+
139+ /** 文字セットを自動判別して、ファイルからすべての行を読み取ります。
140+ *
141+ * <p>このメソッドは、すべての文字が読み取られたか、入出力エラーまたは他の実行時例外がスローされたときに必ずそのファイルがクローズされるようにします。</p>
142+ *
143+ * <p>読み取り時に行末記号は取り除かれるため、{@literal List}要素の{@literal String}には行末記号は含まれません。</p>
144+ *
145+ * @param path ファイル・パス
146+ * @return 読み取った各行。
147+ * @throws IOException 読取り中に入出力エラーが発生した場合。
148+ */
149+ public static List<String> readAllLines(Path path) throws IOException {
150+ try (BufferedReader reader = new AutoDetectReader(path)) {
151+ List<String> result = new ArrayList<String>();
152+ for(;;) {
153+ String line = reader.readLine();
154+ if(line == null) {
155+ break;
156+ }
157+ result.add(line);
158+ }
159+ return result;
160+ }
161+ }
162+
163+ /** 文字セットを自動判別して、ファイルからすべての文字を読み取ります。
164+ *
165+ * @param path ファイル・パス
166+ * @return ファイルから読み取られた文字列
167+ * @throws IOException 読取り中に入出力エラーが発生した場合。
168+ */
169+ public static String readAll(Path path) throws IOException {
170+ try (BufferedReader reader = new AutoDetectReader(path)) {
171+ StringBuilder sb = new StringBuilder();
172+ char[] cbuf = new char[8192];
173+ int len;
174+ while((len = reader.read(cbuf)) >= 0) {
175+ if(len > 0) {
176+ sb.append(cbuf, 0, len);
177+ }
178+ }
179+ return sb.toString();
180+ }
181+ }
182+
183+ private static class Impl extends Reader {
184+ private static final Charset UTF_8 = Charset.forName("UTF-8");
185+ private static final Charset UTF_16BE = Charset.forName("UTF-16BE");
186+ private static final Charset UTF_16LE = Charset.forName("UTF-16LE");
187+ private static final Charset UTF_32BE = Charset.forName("UTF-32BE");
188+ private static final Charset UTF_32LE = Charset.forName("UTF-32LE");
189+ private static final int BUFSIZ = 65536;
190+
191+ private PushbackInputStream in;
192+ private boolean isDetected;
193+ private Charset charset;
194+ private Reader reader;
195+
196+ public Impl(InputStream in) {
197+ this.in = new PushbackInputStream(in, BUFSIZ);
198+ }
199+
200+ public boolean isDetected() throws IOException {
201+ if(reader == null) {
202+ detect();
203+ }
204+ return isDetected;
205+ }
206+
207+ public Charset getCharset() throws IOException {
208+ if(reader == null) {
209+ detect();
210+ }
211+ return charset;
212+ }
213+
214+ private void detect() throws IOException {
215+ if(reader != null) {
216+ return;
217+ }
218+
219+ UniversalDetector detector = new UniversalDetector(null);
220+ byte[] buf = new byte[BUFSIZ];
221+ int offset = 0;
222+ int length = BUFSIZ;
223+ int size;
224+ while((size = in.read(buf, offset, length)) > 0) {
225+ detector.handleData(buf, offset, size);
226+ offset += size;
227+ length -= size;
228+ if(detector.isDone()) {
229+ break;
230+ }
231+ if(length <= 0) {
232+ break;
233+ }
234+ }
235+ in.unread(buf, 0, offset);
236+ detector.dataEnd();
237+ if(detector.getDetectedCharset() != null) {
238+ charset = Charset.forName(detector.getDetectedCharset());
239+ isDetected = true;
240+ }
241+ if(charset == null) {
242+ charset = Charset.defaultCharset();
243+ }
244+ if(charset.equals(UTF_8) && offset >= 3) {
245+ byte[] bom = new byte[3];
246+ int n = in.read(bom);
247+ if(n != 3 || bom[0] != (byte)0xEF || bom[1] != (byte)0xBB || bom[2] != (byte)0xBF) {
248+ in.unread(bom, 0, n);
249+ }
250+ } else if(charset.equals(UTF_16BE) && offset >= 2) {
251+ byte[] bom = new byte[2];
252+ int n = in.read(bom);
253+ if(n != 2 || bom[0] != (byte)0xFE || bom[1] != (byte)0xFF) {
254+ in.unread(bom, 0, n);
255+ }
256+ } else if(charset.equals(UTF_16LE) && offset >= 2) {
257+ byte[] bom = new byte[2];
258+ int n = in.read(bom);
259+ if(n != 2 || bom[0] != (byte)0xFF || bom[1] != (byte)0xFE) {
260+ in.unread(bom, 0, n);
261+ }
262+ } else if(charset.equals(UTF_32BE) && offset >= 4) {
263+ byte[] bom = new byte[4];
264+ int n = in.read(bom);
265+ if(n != 4 || bom[0] != (byte)0x00 || bom[1] != (byte)0x00 || bom[2] != (byte)0xFE || bom[3] != (byte)0xFF) {
266+ in.unread(bom, 0, n);
267+ }
268+ } else if(charset.equals(UTF_32LE) && offset >= 4) {
269+ byte[] bom = new byte[4];
270+ int n = in.read(bom);
271+ if(n != 4 || bom[0] != (byte)0xFF || bom[1] != (byte)0xFE || bom[2] != (byte)0x00 || bom[3] != (byte)0x00) {
272+ in.unread(bom, 0, n);
273+ }
274+ }
275+ reader = new InputStreamReader(in, charset);
276+ }
277+
278+ @Override
279+ public int read(char[] cbuf, int off, int len) throws IOException {
280+ if(charset == null) {
281+ getCharset();
282+ }
283+ return reader.read(cbuf, off, len);
284+ }
285+
286+ @Override
287+ public void close() throws IOException {
288+ if(reader != null) {
289+ reader.close();
290+ reader = null;
291+ in = null;
292+ } else if(in != null) {
293+ in.close();
294+ in = null;
295+ }
296+ }
297+ }
298+}
Afficher sur ancien navigateur de dépôt.