본문 바로가기

안드로이드 앱 스쿨 2기/Android

[11주차 - 수] Assets

Assets

  • raw 데이터 파일은 raw 폴더에 담으면 스트림을 손쉽게 추출할 수 있다는 장점이 있다.
  • 허나 raw 폴더는 하위 폴더를 만드는 등 계층적으로 관리할 수 없다.
  • 만약 파일들을 계층적인 폴더 구조를 만들어 관리하겠다면 assets 폴더를 사용한다. -> 하위 폴더를 생성 할 수 있다
  • assets 폴더는 res 폴더 내부가 아니므로 리소스(R 클래스)로 관리할 수 없다.

 

파일 구조

 

assets 폴더 생성하는 방법

 

1. activity_main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="파일 데이터 가져오기" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="폰트적용하기" />
</LinearLayout>

 

2. MainActivity

 

 

class MainActivity : AppCompatActivity() {
    lateinit var activityMainBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        activityMainBinding.run{
            button.setOnClickListener {
                // Assets 폴더에 있는 파일과 연결된 스트림을 추출한다.
                // - 가져올 파일의 정확한 위치를 가져와야한다
                // - Assets 폴더는 하폴더를 생성이 가능하다
                val inputStream = assets.open("text/data.txt")
                val inputStreamReader = InputStreamReader(inputStream, "UTF-8")
                val bufferedReader = BufferedReader(inputStreamReader)

                var str:String? = null
                val stringBinding = StringBuffer()

                do{
                    str = bufferedReader.readLine()
                    if(str != null){
                        stringBinding.append("${str}\n")
                    }
                }while(str != null)

                bufferedReader.close()

                textView.text = stringBinding.toString()

            }

            button2.setOnClickListener {
                // Assets 폴더에 있는 폰트 파일을 이용해 폰트 객체를 생성한다.
                val typeFace = Typeface.createFromAsset(assets, "fonts/NanumBrush.ttf")
                // TextView에 적용한다.
                textView.typeface = typeFace
                textView.textSize = 50.0f
            }

        }

    }
}

 


val inputStream = assets.open("text/data.txt")
val inputStreamReader = InputStreamReader(inputStream, "UTF-8")
val bufferedReader = BufferedReader(inputStreamReader)

 

  1. val inputStream = assets.open("text/data.txt")
    • assets 폴더에 있는 파일과 연결된 스트림을 추출합니다.
    • "text/data.txt"는 Assets 폴더 내부에 있는 data.txt 파일을 가리키는 경로입니다.
    • assets.open() 메서드를 사용하여 해당 파일에 접근하는 inputStream을 얻을 수 있습니다.
  2. val inputStreamReader = InputStreamReader(inputStream, "UTF-8")
    • inputStream을 UTF-8 문자 인코딩으로 읽을 수 있는 InputStreamReader로 변환합니다.
  3. val bufferedReader = BufferedReader(inputStreamReader)
    • InputStreamReader를 BufferedReader로 감싸서 한 줄씩 데이터를 읽을 수 있도록 합니다.

 


[결과]

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님

'안드로이드 앱 스쿨 2기 > Android' 카테고리의 다른 글

[12주차 - 금] 9 patch 이미지  (0) 2023.07.14
[11주차 - 수] SQLIteDataBase  (0) 2023.07.06
[11주차 - 수] Raw  (0) 2023.07.05
[11주차 - 화] FileStream  (0) 2023.07.04
[11주차 - 화] Application Class  (0) 2023.07.04