yakidaiko
@yakidaiko (Yakiny)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Android Studio のFileOutputStream.writeで文字の先頭に「null」がつく

解決したいこと

Android Studio初心者で、Java無知です。
Android Studioで超簡易的なメモ帳をつくっていて、それでファイルに出力し、読み込もうとしたときに文字の先頭に「null」のいう文字がついてきました。
例えば、このように「abc」と入力し、WRITEをクリックして書き込みます。↓
キャプチャ.PNG
そしたらREADをクリックし、読み込みます。そしたら「abc」と表示されるはずが...
キャプチャ2.PNG

「nullabc」となります。これにはどう対処すればよいでしょうか。
回答お願いします。

該当するソースコード

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EditText editText = findViewById(R.id.editText);
                String text = editText.getText().toString();

                saveFile("newfile.txt",text);
                //wrirte button click event
            }
        });
        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //read button click event
                String text = readFile("newfile.txt");
                EditText editText = findViewById(R.id.editText);
                editText.setText(text);
            }
        });

    }
    private void saveFile(String file, String str){
        try {
            FileOutputStream fileOutputStream = openFileOutput(file, MODE_PRIVATE );
            fileOutputStream.write(str.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private String readFile(String file) {
        String text = null;
        try {
            FileInputStream fileInputStream = openFileInput(file);
            BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream, "UTF-8"));
            String lineBuffer;
            while (true) {
                lineBuffer = reader.readLine();
                if (lineBuffer != null) {
                    text += lineBuffer;
                } else {
                    break;
                }
            }
        } catch (IOException e) {
            Toast myToast = Toast.makeText(
                    getApplicationContext(),
                    "ファイルの読み込みに失敗しました!",
                    Toast.LENGTH_SHORT
            );
            myToast.show();
        }
        return text;
    }
}

ねんのためレイアウトファイルのコードも載せておきます。

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="334dp"
        android:layout_height="539dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Text"
        android:textAlignment="textStart"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.493"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.171" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="Write"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.79"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.971" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="71dp"
        android:text="Read"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/button"
        app:layout_constraintHorizontal_bias="0.347"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.969" />
</androidx.constraintlayout.widget.ConstraintLayout>

自分で試したこと

Googleで検索

0

1Answer

デバッグ実行してみたら、なぜnullが入るのか分かると思います。

1.下記の行にブレークポイントを設置する

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        EditText editText = findViewById(R.id.editText); // ※この行と
        String text = editText.getText().toString();

        saveFile("newfile.txt",text);
        //wrirte button click event
    }
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //read button click event
        String text = readFile("newfile.txt"); // ※この行に
        EditText editText = findViewById(R.id.editText);
        editText.setText(text);
    }
});

2.Android Studioでデバッグ実行を開始する
3.メモ帳にテキストを入力して、「WRITE」ボタンや「READ」ボタンを押してみる(ブレークポイントがヒットする)
4.ステップ実行しながら、editTextやtextの中身を確認する(どのタイミングでnullが入っているか分かる)

下記の記事が参考になると思います。
https://techacademy.jp/magazine/2441

1Like

Comments

  1. @yakidaiko

    Questioner

    String text = nullでテキストは空白になるのではなく、"null"という文字になって、どれで先頭にnullがつくということでした。本当にJava無知でした。回答ありがとうございました!

Your answer might help someone💌