5
5
import com .squareup .okhttp .Response ;
6
6
import com .squareup .okhttp .ResponseBody ;
7
7
import okio .BufferedSink ;
8
- import okio .BufferedSource ;
9
8
import okio .Okio ;
10
9
10
+ import java .io .ByteArrayInputStream ;
11
11
import java .io .File ;
12
12
import java .io .IOException ;
13
13
import java .util .Arrays ;
@@ -72,27 +72,25 @@ public static Result download(File file, String url, long maxSize) {
72
72
result .exceededSize = true ;
73
73
return result ;
74
74
}
75
- // ダウンロードしたファイルを保存
76
- boolean shouldDelete = false ;
77
- try (BufferedSink sink = Okio .buffer (Okio .sink (file ))) {
78
- sink .writeAll (body .source ());
79
75
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 ();
86
78
87
- // 結果を構築して返す
88
- result .success = true ;
79
+ // Schematicファイルかどうかをチェックする
80
+ if (!checkSchematic (data )) {
81
+ result .error = "Schematicファイルではありません" ;
89
82
return result ;
90
- } finally {
91
- // ダウンロードに失敗したらファイルを削除する
92
- if (shouldDelete ) {
93
- file .delete ();
94
- }
95
83
}
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 ;
96
94
}
97
95
} catch (IOException e ) {
98
96
result .error = String .format ("IOエラー: %s" , e .getMessage ());
@@ -103,12 +101,12 @@ public static Result download(File file, String url, long maxSize) {
103
101
/**
104
102
* Schematicファイルかどうかをチェックする
105
103
*
106
- * @param source ファイルのソース
104
+ * @param data ファイルのソース
107
105
* @return チェック結果
108
106
*/
109
- private static boolean checkSchematic (BufferedSource source ) {
107
+ private static boolean checkSchematic (byte [] data ) {
110
108
// Schematicファイルかどうかをチェックする
111
- try (GZIPInputStream input = new GZIPInputStream (source . inputStream ( ))) {
109
+ try (GZIPInputStream input = new GZIPInputStream (new ByteArrayInputStream ( data ))) {
112
110
// ヘッダーを読み込む
113
111
byte [] header = new byte [12 ];
114
112
byte [] expected = {0x0a , 0x00 , 0x09 , 'S' , 'c' , 'h' , 'e' , 'm' , 'a' , 't' , 'i' , 'c' };
0 commit comments