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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

1回答

2277閲覧

AndroidStudioでAssets階層のしたのファイルにアクセスしたい

alizona

総合スコア126

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2020/08/13 20:52

編集2020/08/22 05:10

イメージ説明
AndroidStudioで、この階層にアクセスしたいです。

階層の指定方法を教えていただけないでしょうか?
txtファイルが更新されないので、階層の指定が間違っていると思っています。
どうぞよろしくお願いします。

java

1 @RequiresApi(api = Build.VERSION_CODES.N) 2 public void main(String[] args) throws IOException { 3 // 文字コード 4 Charset charset = Charset.forName("MS932"); 5 6// InputStream is = getResources().getAssets().open("zipfile.zip"); 7// String inputfile1= convertStreamToString(is); 8 // 入力ファイル 9 String inputfile1 = "zipfile.zip"; 10 11 // 出力先 12 String outputfile1 = "text.txt"; 13 14 15 try( 16 FileInputStream fis = new FileInputStream(inputfile1); 17 BufferedInputStream bis = new BufferedInputStream(fis); 18 ZipInputStream zis = new ZipInputStream(bis,charset); 19 ) { 20 ZipEntry zipentry; 21 // zipの中のファイルがあるだけ繰り返す 22 // 展開後のファイルサイズ、ファイル名に注意 23 while((zipentry = zis.getNextEntry()) !=null) { 24 try(FileOutputStream fos = new FileOutputStream(outputfile1 + zipentry.getName()); 25 BufferedOutputStream bos = new BufferedOutputStream(fos); 26 ){ 27 byte[] data = new byte[1024]; // 1KB 調整可 28 int count = 0; 29 while((count = zis.read(data)) != -1){ 30 bos.write(data,0,count); 31 } 32 } 33 } 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 }

おかげさまで、zipの中身を取得することができました。
わざわざコードまで書いていただき本当にありがとうございます。
イメージ説明
イメージ説明
このようにして、zipを解凍して、ファイル名を取得し、中身を取得していることを確認できました。現在、ファイルの出力先を調べているのですが、確認できません。 package名は、package com.example.pdf;なのですが、どうしてfileが作成されないのかわかりますでしょうか?

何度も申し訳ありません。
解凍されたファイルが文字化けしているのですが、文字コードを変更するべきでしょうか?
macを使っています。
イメージ説明

###なぜか今まではできていたものができなくなってしまいました。

  • コードは全てアドバイスをいただいた時のものに戻しました。
  • 2つのtextファイルをまとめてzipを作成し(macを使っているのですが、macを使うと_MACOS といった余計な階層が入ってしまうためZIPANGというソフトを使ってWindowsZIPを作ります
  • 今まではmacで作ったzipでもtextに変換して内部メモリに保存できていました。
  • 2つのtextファイルをzipに入れているのですが、1つめは "hello.txt"で、2つめが "hello2.txt"です。
  • 下がエラーコードです。
  • while分の関係で最後のファイルにアクセスする時にエラーが出るのかと考え、while分を消して、zipのなかの1つめのtxtファイルのみを、内部ストレージに保存するようにしようとしたのですが、保存されたものは、simpleというzipファイルの名前のexecファイルでした。(下のエラーはwhile文を使っていて、コードには変更を加えていない時のエラーです)
  • 一度動かすことができたのにもかかわらずエラーが起こるようになってしまったということは私の開発環境の問題でしょうか?

java

1W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.example.pdf/files/simple/hello2.txt: open failed: ENOTDIR (Not a directory) 2 at libcore.io.IoBridge.open(IoBridge.java:496) 3 at java.io.FileOutputStream.<init>(FileOutputStream.java:235) 4 at java.io.FileOutputStream.<init>(FileOutputStream.java:125) 5 at com.example.pdf.MainActivity.download(MainActivity.java:108) 6 at com.example.pdf.MainActivity$1.onClick(MainActivity.java:54) 7 at android.view.View.performClick(View.java:7259) 8 at android.view.View.performClickInternal(View.java:7236) 9 at android.view.View.access$3600(View.java:801) 10 at android.view.View$PerformClick.run(View.java:27892) 11W/System.err: at android.os.Handler.handleCallback(Handler.java:883) 12 at android.os.Handler.dispatchMessage(Handler.java:100) 13 at android.os.Looper.loop(Looper.java:214) 14 at android.app.ActivityThread.main(ActivityThread.java:7356) 15 at java.lang.reflect.Method.invoke(Native Method) 16 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 17 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 18 Caused by: android.system.ErrnoException: open failed: ENOTDIR (Not a directory) 19 at libcore.io.Linux.open(Native Method) 20 at libcore.io.ForwardingOs.open(ForwardingOs.java:167) 21 at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252) 22 at libcore.io.ForwardingOs.open(ForwardingOs.java:167) 23W/System.err: at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7255) 24 at libcore.io.IoBridge.open(IoBridge.java:482) 25 ... 15 more 26コード

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

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

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

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

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

keicha_hrs

2020/08/14 11:57 編集

assetsに置いたファイルには書き込むことはできません。そのレベルからの問題でしょう。メソッド名がmainになっていますが、コンソールアプリのようにmainから始まるプログラムを作ろうとしているわけではありませんよね?
alizona

2020/08/14 13:22

いいえ、Androidアプリを作ろうとしています。
guest

回答1

0

ベストアンサー

先にコメントを書きましたが、assetsフォルダーを出力先とすることはできません。その代わりに、openFileOutput()を用いてアプリケーション用の領域にgetExternalFilesDir()を用いて内部ストレージのパッケージ専用フォルダーにファイルを書き出す方法に変更するように修正してみました。このメソッドを用いると、/data/data/<パッケージ名>/files/<内部ストレージ>/Android/<パッケージ名>/files/の下にファイルが書き出されます。

java

1 // Activity上に配置したButtonを押すと実行するようにしてみた 2 Button button = findViewById(R.id.button); 3 button.setOnClickListener(new View.OnClickListener() { 4 @RequiresApi(api = Build.VERSION_CODES.N) 5 @Override 6 public void onClick(View view) { 7 // 文字コード 8 Charset charset = Charset.forName("MS932"); 9 10 try ( 11 InputStream is = getResources().getAssets().open("zipfile.zip"); 12 BufferedInputStream bis = new BufferedInputStream(is); 13 ZipInputStream zis = new ZipInputStream(bis, charset); 14 ) { 15 File path = getExternalFilesDir(null); // ☆☆☆追加☆☆☆ 16 17 ZipEntry zipentry; 18 // zipの中のファイルがあるだけ繰り返す 19 // 展開後のファイルサイズ、ファイル名に注意 20 while ((zipentry = zis.getNextEntry()) != null) { 21 try (FileOutputStream fos = new FileOutputStream(path + "/" + zipentry.getName()); // ☆☆☆修正☆☆☆ 22 BufferedOutputStream bos = new BufferedOutputStream(fos); // os→fosに修正 23 ) { 24 byte[] data = new byte[1024]; // 1KB 調整可 25 int count = 0; 26 while ((count = zis.read(data)) != -1) { 27 bos.write(data, 0, count); 28 } 29 } 30 } 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } 34 } 35 }); 36

投稿2020/08/14 08:34

編集2020/08/14 15:30
keicha_hrs

総合スコア6768

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

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

alizona

2020/08/14 13:23

本当にありがとうございます。 zipを解凍して、ファイル名を取得し、中身を取得していることを確認できました。現在、ファイルの出力先を調べているのですが、確認できません。 package名は、package com.example.pdf;なのですが、どうしてfileが作成されないのかわかりますでしょうか?
keicha_hrs

2020/08/14 13:54

新たに添付していただいた図は、端末上でファイルマネージャーを開いて閲覧したものでしょうか?openFileOutput()およびopenFileInput()で読み書きされるファイルが置かれるのは、一般のファイルマネージャーでは見られない、専用領域です。内部ストレージのAndroidフォルダーの下に展開される方が良かったのであれば、回答のコードを少し修正します。
alizona

2020/08/14 14:03

はい。端末とmacをつなげて、ファイルマネージャーから探しました。 MODE_PRIVATE: 他のアプリからアクセスできないprivate fileとして生成 MODE_APPEND: 既にファイルがあった場合、追記で開く と言うところを変更してみたのですが、それで内部ストレージに保存されるようになるわけではありませんでした。 最後の最後まで教えていただきありがとうございます。
keicha_hrs

2020/08/14 14:20

コード修正しました。pathという変数を追加したのと、try()の中の記述を修正したのみです。これで、"<内部ストレージ>/Android/<パッケージ名>/files/"の下にファイルが展開されるはずです。
alizona

2020/08/14 14:40

ありがとうございます。全てのデータを取得することができました。 ここまでしていただき本当にありがとうございました。
alizona

2020/08/14 14:50

申し訳ありません。txtが文字化けしてしまいます。 ただ普通に、手動でダブルクリックでzipを解凍しても、同じく文字化けしています。 私はmacを使っています。
keicha_hrs

2020/08/14 15:13

> 手動でダブルクリックでzipを解凍しても というのは、assetsに格納した元々のzipファイルのことですか?それを解凍しても文字化けしているのならば、このプログラムではどうにもならないと思いますが・・・。 私の環境はLinuxですが、UTF-8で作成したテキストファイルをzipに格納したものをassetsに置いて、このプログラムで展開し、Android端末の中に入っているHTMLビューアで正常に閲覧することができました。
alizona

2020/08/15 12:15 編集

私もmacで作った2つのtxtファイルをzipにして、このプログラムで動かしたのですが、無事動きました。 なぜか私の使おうとしていたzipはwindowsのものだったので展開できないようでした。
alizona

2020/08/22 05:25

以前は、2つのtextファイルをzip化したものを、Assentsに入れて、 それをtxtにして内部ストレージに保存する方法を教えていただきありがとうございました。
alizona

2020/08/22 05:28 編集

現在、urlからzipを保存しようといろいろなことをしていたところ、 2つのtextファイルをzip化すると_MACOSという階層が間に入ってしまうようになりました。そしてAssetsの階層でfileを見つけられなくなってしまったたので、ZIPANGというソフトでWindowsZIP に変換して実行しているのですがエラーが出るようになりました。 詳細はこのページの質問欄の一番下に追加したのですが、アドバイスをいただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問