반응형
package tipcalculator.gohool.writeread;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity {
    private Button button;
    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);
        button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //만약 editText가 ""아니라면 write한 message를 string으로 변환해주고 WriteToFile에 담아주면, 바이트스트림으로 변환하여, todolist.txt에 저장한다.
                if(!editText.getText().toString().equals("")){
                    String message = editText.getText().toString();
                    WriteToFile(message);
                }
            }
        });
        
        
        //만약 ReadFromFile에 바이트로 저장되어있는게 있다면, 스트링으로 변환하여 가져온다.
        if(ReadFromFile() != null){
            editText.setText(ReadFromFile());
        }
        

    }
    //  문자 스트림에서 바이트 스트림으로의 변환을 제공하는 입출력 스트림이다.
    //바이트를 읽어서 지정된 문자 인코딩에 따라 문자로 변환하는데 사용한다.
    private void WriteToFile(String message){
        try {
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("todolist.txt", Context.MODE_PRIVATE));
            outputStreamWriter.write(message);
            outputStreamWriter.close(); // 꼭 닫아줘야함
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //바이트 스트림에서 문자 스트림으로
    private String ReadFromFile(){
        String result = "";
        try {
            InputStream inputStream = openFileInput("todolist.txt");
            if(inputStream != null){
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                String tempString = "";
                StringBuilder stringBuilder = new StringBuilder();

                //readLine : 1 행의 텍스트를 읽어들입니다
                while ((tempString = bufferedReader.readLine()) != null){
                    stringBuilder.append(tempString);
                }

                inputStream.close();
                result = stringBuilder.toString();

            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }
}

BufferedReader 사용이유

버퍼를 둠으로써, 파일,네트워크와 같은 물리적인 장치에서 데이터를 사용자가 요청할때마다 매번 읽어오는것보단, 일정량사이즈로 한번에 읽어온후, 버퍼에 보관합니다. 그리고, 사용자가 요구시,버퍼에서 읽어오게됩니다. 결국, 속도를 향상시키고, 시간의 부하를 줄일수 있게 됩니다.

 

StringBuilder 란?

String을 만드는 객체, 메모리의 낭비를 줄이기 위해. 

 

추가 ++덧붙여서, stream이 몬지 궁금하실거 같은데요. 스트림은 자바에서, 데이터 입출력시, 전송되는 데이터의 흐름을 말합니다. 간단히 설명하면, 자바에서 데이터 입출력시, 시스템을 사용한 직접적인 작업은 JVM과 JVM에의해 제공되는 라이브러리들에 의해서 처리되고, 사용자는 단지 스트림통해서, 데이터를 송신하거나 수신하기만 하면됩니다. 그래서, (데이터를 받는) 입력시, InputStream이란것을 이용한것입니다. InputStream 안쪽 작업은 자바가 구현해주는 거죠.

출처 여기

 

 

 

전(왼), 후(오)

 

반응형

+ Recent posts