質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

3014閲覧

urlからzipファイルを内部ディレクトリに保存したいです。

alizona

総合スコア126

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2020/08/20 04:05

編集2020/08/20 14:13

①zipファイルのurlから、zipをダウンロードする
②それを解析してtextにしてパッケージの下のローカルに保存する。

②はすでにできています。
①ができずに、その2つをつなぎ合わせてみたもののエラーが出てます。

アドバイスをいただきたいです。
どうぞよろしくお願いします。

java

1 2import androidx.annotation.RequiresApi; 3import androidx.appcompat.app.AppCompatActivity; 4import java.io.BufferedOutputStream; 5import java.io.File; 6import java.io.FileOutputStream; 7import java.io.IOException; 8import java.io.InputStream; 9import java.net.MalformedURLException; 10import java.net.URL; 11import java.net.URLConnection; 12import java.nio.charset.Charset; 13import java.util.zip.ZipInputStream; 14import java.util.zip.ZipEntry; 15import android.os.Build; 16import android.os.Bundle; 17import android.view.Gravity; 18import android.view.View; 19import android.widget.Button; 20import android.widget.Toast; 21 22 23public class MainActivity extends AppCompatActivity { 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_main); 29 30 31 // Activity上に配置したButtonを押すと実行するようにしてみた 32 Button button = findViewById(R.id.button); 33 button.setOnClickListener(new View.OnClickListener() { 34 35 //internetから直で、textにする 36 @RequiresApi(api = Build.VERSION_CODES.N) 37 @Override 38 public void onClick(View view) { 39 // 文字コード 40 Charset charset = Charset.forName("MS932"); 41 File path = getExternalFilesDir(null); // ☆☆☆追加☆☆☆ 42 43 String url1 = "http://corpus.byu.edu/wikitext-samples/text.zip"; 44 URL url = null; 45 try { 46 url = new URL(url1); 47 } catch (MalformedURLException e) { 48 e.printStackTrace(); 49 } 50 URLConnection connection = null; 51 try { 52 connection = url.openConnection(); 53 } catch (IOException e) { 54 e.printStackTrace(); 55 } 56 String redirect = connection.getHeaderField("Location"); 57 58 if (redirect != null) { 59 try { 60 connection = new URL(redirect).openConnection(); 61 } catch (IOException e) { 62 e.printStackTrace(); 63 } 64 } 65 InputStream a = null; 66 try { 67 a = connection.getInputStream(); 68 } catch (IOException e) { 69 e.printStackTrace(); 70 } 71 72 try ( 73 //zipのurlから取得する方法 74 ZipInputStream zis = new ZipInputStream(a); 75 76 //Assetsファイルから取得する方法 77 //InputStream is = getResources().getAssets().open("Archive.zip"); 78 79 //内部ストレージから取得する方法 80 //InputStream is=new FileInputStream(path + "/" + "Archive.zip"); 81 //BufferedInputStream bis = new BufferedInputStream(is); 82 //ZipInputStream zis = new ZipInputStream(bis, charset); 83 ) { 84 85 ZipEntry zipentry; 86 // zipの中のファイルがあるだけ繰り返す 87 // 展開後のファイルサイズ、ファイル名に注意 88 int j=0; 89 while ((zipentry = zis.getNextEntry()) != null) { 90 91 try (FileOutputStream fos = new FileOutputStream(path + "/" + zipentry.getName()); // 出力 https://techbooster.org/android/application/1629/   92 BufferedOutputStream bos = new BufferedOutputStream(fos); 93 ) { 94 byte[] data = new byte[1024]; // 1KB 調整可 95 int count = 0; 96 int i=0; 97 while ((count = zis.read(data)) != -1) { 98 bos.write(data, 0, count); 99 toastMake(j+"-"+i+"("+zipentry.getName()+"):"+count, 0, -200); 100 i++; 101 } 102 j++; 103 i=0; 104 } 105 } 106 } catch (IOException e) { 107 e.printStackTrace(); 108 } 109 } 110 }); 111 } 112 113 private void toastMake(String message, int x, int y){ 114 Toast toast = Toast.makeText(this, message, Toast.LENGTH_SHORT); 115 // 位置調整 116 toast.setGravity(Gravity.CENTER, x, y); 117 toast.show(); 118 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2020/08/20 06:13

zipファイルそのものを保存したいのでしょうか? それとも、zipファイルの中身を展開したものを保存したいのでしょうか?
alizona

2020/08/20 06:20 編集

zipファイルを展開して保存したいです。以前にAssets に保存してあるzipをtextに変換して内部ストレージに保存するコードが完成していたので、それと組み合わせる形で、コードを書きました。 しかしながら、htmlからどのようにzipを取得していいのかがわかりません。 https://stackoverrun.com/ja/q/12653558 このサイトを参考にしました。 https://corpus.byu.edu/wikitext-samples/text.zip サイトの中では、このようにURLの最後がzipになっているのですが、私はそのようなファイルを見つけることができません。
Y.H.

2020/08/20 06:24

> String url1 = "http://www.nomadworks.co.jp/htmlsample/download.html"; これだとdownload.htmlというhtmlファイルをダウンロードしているだけですよ。 ダウンロードしたいzipのurlを記載しましょう。 参考視されたサイトではzipファイルのurlを記載されていますよね?
alizona

2020/08/20 06:28

どのようにzipファイルへのリンクを確認するのかがわかりません。 というのも、zipファイル名をクリックするとインストールが開始されるだけで、zipへのリンクを表示する方法がわかりません。まずはここが解決すべき点なのですが、つまづいています。
alizona

2020/08/20 06:32

スクレイピングして、zipファイルにアクセスするのでしょうか?
Y.H.

2020/08/20 06:33

リンクを右クリックして「リンクのURLをコピー」でクリップボードにURLが入りませんか? Chromeでdownload.htmlへアクセスし、表内のinfo01.zipで試すと取得できましたよ。
Y.H.

2020/08/20 06:39

そもそも要件はどちらでしょうか? 1) アプリ内で指定したURL(質問記載ではdownload.html)のHTMLから zipのURLを取り出してダウンロードしたい 2) アプリ内で指定したURLのzipファイルをダウンロードしたい
alizona

2020/08/20 06:42

右クリックでURLをコピーすることはできました。 要件としては、ある別のサイトのzipファイルを毎日1つ取得したいです。 そのため(1)が当てはまると思います。
Y.H.

2020/08/20 06:51

2)ということは、zipのURLは固定ではなく、毎日変わるということですね。 であれば、htmlの取得はできている(InputStream a )ので それを解析して取得したいzipのURLを取り出してください。 取り出したzipのURLがわかれば、そのURLに対して再度アクセスしInputStreamで読み込んだものをFileOutputStreamでローカルへ保存するだけです。
alizona

2020/08/20 07:22

ありがとうございます。 そのURLに対して再度アクセスしInputStreamで読み込んだものをFileOutputStreamでローカルへ保存する。 この過程では、zipファイルがtextファイルになっているのでしょうか?
Y.H.

2020/08/20 07:33

> zipファイルを展開して保存したいです。 あぁこれを見落としてました。 サイトアクセスしInputStreamからZipInputStreamを生成し、FileOutputStreamでローカルへ保存する。 ですね。 とりあえず、質問記載のコードでURLにzipのURL(右クリックでURLをコピーすることはできました。のURL)を指定すれば 指定したzipを処理できませんか?
Y.H.

2020/08/20 09:00

a = connection.getInputStream(); の結果aはnullですか?
alizona

2020/08/20 14:13 編集

String redirect = connection.getHeaderField("Location");
alizona

2020/08/20 14:13 編集

このコードがnullになっているので、getHeaderFieldについて調べてみます。
alizona

2020/08/20 14:14 編集

ありがとうございます
guest

回答1

0

自己解決

https://qiita.com/b_a_a_d_o/items/afa0d83bbffdb5d4f6be
この設定が原因でした。

その段階までアドバイスいただいた、Y.Hさんありがとうございました。

投稿2020/08/21 03:42

alizona

総合スコア126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問