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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

1回答

1130閲覧

ファイルの追記が出来ない

Wind

総合スコア442

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2018/04/26 09:02

編集2018/04/27 02:30

#問題
サンプル1サンプル2を元に、テキストファイルへ追記し続けるサンプルを作成してみたのですが、ファイルの新規作成のみで追記されません。
ファイルが存在すると変更されず、一度ファイルを削除すると新規に項目が一つ保存されたファイルが作成されます。

(例)ボタンを3回押してから"testfile.txt"を削除して、ボタンを押すと”testfile.txt"が作成されて中身は「test3」だけが保存される。
この後にボタンを押しても中身は変わらない。

FileOutputStream fos = new FileOutputStream(file,true); // 追記
だけでは追記されないのでしょうか?
##環境
開発環境:AndroidStudio 3.0.1
実機:Android 6.0

#やりたいこと
ファイルの追記が出来る様にしたいです。
#ソースコード

java

1 2public class MainActivity extends AppCompatActivity { 3 4 private static final int REQUEST_EXTERNAL_STORAGE = 1; 5 private static String[] PERMISSIONS_STORAGE = { 6 Manifest.permission.READ_EXTERNAL_STORAGE, 7 Manifest.permission.WRITE_EXTERNAL_STORAGE 8 }; 9 10 public static void verifyStoragePermissions(Activity activity) { 11 int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 12 int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE); 13 14 if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) { 15 ActivityCompat.requestPermissions( 16 activity, 17 PERMISSIONS_STORAGE, 18 REQUEST_EXTERNAL_STORAGE 19 ); 20 } 21 } 22 23 // メディアスキャン 24 final MediaScannerConnection.OnScanCompletedListener mScanCompletedListner = new MediaScannerConnection.OnScanCompletedListener() 25 { 26 @Override 27 public void onScanCompleted(String path, Uri uri) 28 { 29 } 30 }; 31 32 private TextView textView; 33 private String fileName = "testfile.txt"; 34 private int intRaw = 0; 35 36 @Override 37 protected void onCreate(Bundle savedInstanceState) { 38 super.onCreate(savedInstanceState); 39 setContentView(R.layout.activity_main); 40 verifyStoragePermissions(this); 41 42 textView = findViewById(R.id.text_view); 43 44 Button buttonSave = findViewById(R.id.button_save); 45 buttonSave.setOnClickListener(new View.OnClickListener() { 46 @Override 47 public void onClick(View v) { 48 String strFileName = Environment.getExternalStorageDirectory().getPath() + "/" + fileName; // 内部ストレージ直下 49 String text = "test" + intRaw; // 保存する内容 50 51 saveFile(strFileName, text); 52 if(text.length() == 0){ 53 textView.setText(R.string.no_text); 54 } 55 else{ 56 textView.setText(R.string.saved); 57 } 58 59 String[] paths = {strFileName}; 60 MediaScannerConnection.scanFile(getApplicationContext(), paths, null, mScanCompletedListner); 61 62 intRaw++; 63 } 64 }); 65 } 66 67 // ファイルを保存 68 public void saveFile(String file, String str) { 69 try { 70 FileOutputStream fos = new FileOutputStream(file,true); // 追記 71 OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); 72 BufferedWriter bw = new BufferedWriter(osw); 73 bw.write(str); 74 bw.newLine(); // 改行 75 bw.flush(); 76 bw.close(); 77 Log.i("MainActivity","Saved:" + str); 78 } catch (FileNotFoundException e) { 79 Log.d("MainActivity", e.toString()); 80 } catch (IOException e) { 81 Log.d("MainActivity", e.toString()); 82 } 83 } 84} 85

#テスト結果の追記
確認方法に「USB接続しているWindowsPCでファイルを見ている」ことを記述していませんでした。

出力ファイルをWindowsPCで確認したところ、
・スマホを再起動すれば「testfile.txt」の中身は反映される。
・但しnewLine()(改行)は適用されていない

MediaScannerConnection.scanFile()だけでは中身までWindows PCで見れる様にならないのでしょうか?
もしくは使い方が間違っているのでしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/26 10:00

私の環境でsaveFile()だけテストしたらうまくいきました。2回目以降、saveFile()が呼ばれていないとか、呼ばれているけど例外が発生しているということはありませんか?
Wind

2018/04/26 13:28

確認ありがとうございます。saveFile()でLog.iでカウントアップ出来てるので呼ばれてはいるのは確認しました。例外が出ればどちらかのLog.dにひっかかるかと思ったのですが発生しないので、追記出来ない原因が不明です。ウイルス対策ソフトも入っていませんし・・・。
退会済みユーザー

退会済みユーザー

2018/04/26 23:26

内容を確認の方はエディタを完全に落としてないんだろうけど
Wind

2018/04/27 01:02

確認の方はメモ帳で行っていて毎回終了しています。ただスマホを再起動してからファイルを開いたところ、改行はされていませんが連続で保存されていたので、newLine()が1回も動かずメディアスキャンが1回しか動いていないぽい感じでした。
guest

回答1

0

ベストアンサー

改行はされていませんが連続で保存されていたので

メモ帳で開いたら

test0test1test2

と表示されたということでしょうか?もしそうだとしたら、改行コードの問題ですね。

伝統的に、Windows、macOS、UNIX系のそれぞれのOSでは、テキストファイルにおいて改行を表現するコードに違いがあります。詳細についてはここで細かく説明するよりも、

改行コード - Wikipedia

などをご参照いただくのが良いかと思います。

Androidアプリにおいて、newline()メソッドによって出力される改行コードの処理は、UNIX系の「LFのみ」に準じます。ところが、Windowsのメモ帳はWindows方式の「CR+LF」しか正しく改行として表示されないので、全てのテキストが繋がって見えているだけなのでしょう。プログラムとしては正常に機能していると思われます。

メモ帳ではなく、別のテキストエディターを用いた方が良いでしょう。ワードパッドでもLFのみのファイルを正しく表示できたんじゃなかったかな?

投稿2018/04/28 14:08

編集2018/04/28 17:21
keicha_hrs

総合スコア6768

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

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

Wind

2018/04/29 11:51

コメントありがとうございます。 メモ帳で開くと最初は test0 と表示され、スマホを再起動すると test0test1test2 と、表示されます。 確かにWindowsPCで確認する時は「CR+LR」が見えるエディタが良いですね。 ちょっと探してみます。
Wind

2018/05/07 03:12

追記毎にメディアスキャンをすることは出来ないのですね。 追記終了後に一括でメディアスキャンをすることで動きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問