Implementación del marco de guardado en archivo de alto rendimiento de la cadena de registro personalizada de Android

1. Introducción

Utilicé dos o tres registros populares para guardar en el marco de archivos antes, pero todavía hay problemas de personalización y pérdida de registros. Hoy le daré una forma de cumplir con este requisito.

2. Texto

2.1, implementación del código:

object Log2FileUtils {
    
    
    private var fileName3 : File?= null
    private var txtFileName3 : File?= null
    private val strQueue: BlockingQueue<String> = LinkedBlockingQueue()
    private var saveThread3: Thread? = null

    fun tlog(s : String){
    
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    
      //创建文件 android10及以上沙盒机制
            fileName3 =
                File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
                    .toString() + "/dukerDev/Log")
            if(!fileName3!!.exists()){
    
    
                fileName3!!.mkdirs()
            }
            txtFileName3 = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
                .toString() + "/dukerDev/Log" + "/${
      
      getDateV1()}.txt")//以当天日期创建新的文件
            if(!txtFileName3!!.isFile){
    
    
                txtFileName3!!.createNewFile()
            }
        } else {
    
    
            fileName3 =
                File(Environment.getExternalStorageDirectory().toString() + "/dukerDev/Log")
            if(!fileName3!!.exists()){
    
    
                fileName3!!.mkdirs()
            }
            txtFileName3 =  File(Environment.getExternalStorageDirectory().toString() + "/dukerDev/Log" + "/${
      
      getDateV1()}.txt")
            if(!txtFileName3!!.isFile){
    
    
                txtFileName3!!.createNewFile()
            }
        }
        val s1 = "${
      
      getTimeV3()}: ${
      
      s}\n"  //在日志前加上毫秒级时间
        if (!strQueue.offer(s1)) {
    
      //把日志写入到队列
            Log.e("dukerDev","日志写缓冲区已满")
        }
        if(saveThread3 == null || !saveThread3!!.isAlive){
    
    //第一次调用时,启动写文件线程
            saveThread3 = Thread(saveRunnable3, "save-thread3").apply {
    
     start() }
        }
    }

    private val saveRunnable3 = Runnable {
    
      //写文件专用线程
        try {
    
    
            while (true){
    
    
                val str = strQueue.take()  //从队列中取日志
                writeToFile(str)
            }
        } catch (e: Exception) {
    
    
            Log.e("dukerDev","save3Runnable err ${
      
      e.message}")
        }
    }

    private fun writeToFile(s : String) {
    
      //将日志写入到文件
        val buffer: ByteArray = s.toByteArray()
        var out: OutputStream? = null
        try {
    
    
            out = FileOutputStream(txtFileName3, true)
            out.write(buffer, 0, buffer.size)
        } catch (ex: java.lang.Exception) {
    
    
            Log.e("dukerDev","ex err ${
      
      ex.message}")
        } finally {
    
    
            try {
    
    
                out!!.close()
            } catch (ioEx: IOException) {
    
    
                Log.e("dukerDev","ioEx err ${
      
      ioEx.message}")
            }
        }
    }
}
fun getDateV1() = SimpleDateFormat("yyyy-MM-dd").format(Date())!!
fun getTimeV3() = SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(Date())

2.2, utilice:

tlog("dukerDev test01")
Log2FileUtils.tlog("dukerDev test02")

2.3, archivo de salida:

2022-10-24 10:24:00:000: dukerDev test01
2022-10-24 10:24:00:060: dukerDev test02

2.4, Descripción:

1. Al crear un archivo, cree un nuevo archivo con el nombre de la fecha del día para evitar que todos los registros se escriban en un solo archivo. Es un inconveniente verificar el registro. 2. El prefijo de tiempo de registro tiene una precisión de milisegundos
.
3. Subproceso dedicado para escribir archivos para garantizar el rendimiento
4. Desde la cola Escribir y leer para evitar pérdidas o errores al escribir
registros

2.5, nota:

1. Debe solicitar y obtener dinámicamente permisos de lectura y escritura de archivos antes de usarlos.
2. Si falla la creación o escritura de archivos, intente agregar android:requestLegacyExternalStorage="true" en el archivo AndroidManifest.xml

Reimpresión, indique la fuente https://blog.csdn.net/Duker_tec/article/details/127492781

Lugares incompletos o incorrectos, bienvenido a comentar o agregar

Supongo que te gusta

Origin blog.csdn.net/Duker_tec/article/details/127492781
Recomendado
Clasificación