55import com .squareup .okhttp .Response ;
66import com .squareup .okhttp .ResponseBody ;
77import okio .BufferedSink ;
8- import okio .BufferedSource ;
98import okio .Okio ;
109
10+ import java .io .ByteArrayInputStream ;
1111import java .io .File ;
1212import java .io .IOException ;
1313import java .util .Arrays ;
@@ -72,27 +72,25 @@ public static Result download(File file, String url, long maxSize) {
7272 result .exceededSize = true ;
7373 return result ;
7474 }
75- // ダウンロードしたファイルを保存
76- boolean shouldDelete = false ;
77- try (BufferedSink sink = Okio .buffer (Okio .sink (file ))) {
78- sink .writeAll (body .source ());
7975
80- // Schematicファイルかどうかをチェックする
81- if (!checkSchematic (sink .buffer ())) {
82- result .error = "Schematicファイルではありません" ;
83- shouldDelete = true ;
84- return result ;
85- }
76+ // 一旦全部メモリに読み込む
77+ byte [] data = body .source ().readByteArray ();
8678
87- // 結果を構築して返す
88- result .success = true ;
79+ // Schematicファイルかどうかをチェックする
80+ if (!checkSchematic (data )) {
81+ result .error = "Schematicファイルではありません" ;
8982 return result ;
90- } finally {
91- // ダウンロードに失敗したらファイルを削除する
92- if (shouldDelete ) {
93- file .delete ();
94- }
9583 }
84+
85+ // 書き込み先ファイルをオープン
86+ try (BufferedSink sink = Okio .buffer (Okio .sink (file ))) {
87+ // メモリ上のデータをファイルに書き込む
88+ sink .write (data );
89+ }
90+
91+ // 結果を構築して返す
92+ result .success = true ;
93+ return result ;
9694 }
9795 } catch (IOException e ) {
9896 result .error = String .format ("IOエラー: %s" , e .getMessage ());
@@ -103,12 +101,12 @@ public static Result download(File file, String url, long maxSize) {
103101 /**
104102 * Schematicファイルかどうかをチェックする
105103 *
106- * @param source ファイルのソース
104+ * @param data ファイルのソース
107105 * @return チェック結果
108106 */
109- private static boolean checkSchematic (BufferedSource source ) {
107+ private static boolean checkSchematic (byte [] data ) {
110108 // Schematicファイルかどうかをチェックする
111- try (GZIPInputStream input = new GZIPInputStream (source . inputStream ( ))) {
109+ try (GZIPInputStream input = new GZIPInputStream (new ByteArrayInputStream ( data ))) {
112110 // ヘッダーを読み込む
113111 byte [] header = new byte [12 ];
114112 byte [] expected = {0x0a , 0x00 , 0x09 , 'S' , 'c' , 'h' , 'e' , 'm' , 'a' , 't' , 'i' , 'c' };
0 commit comments