首页 > 解决方案 > 复制的文件文本不可读

问题描述

我正在制作一个应用程序,它从内存中复制文件(工作)然后读取它并显示文件中的信息。该文件为 csv 格式,当我尝试从文件中显示文本时,所有非英文字符都显示为 �。所以尝试用记事本++打开它,我看到当我尝试UTF-8编码时记事本显示应该存在的字符,表明它应该可以被android应用程序读取。这是我用来复制文件的代码:

//called in the main activity 
    Intent myIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    myIntent.setType("text/*");
    myIntent.addCategory(Intent.CATEGORY_OPENABLE);
    startActivityForResult(myIntent, 100);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 100) {
        if(resultCode == Activity.RESULT_OK){
            Uri result= data.getData();
            Log.e("fag", result.getPath() + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));

            copyFile(result);


        }
        if (resultCode == Activity.RESULT_CANCELED) {
            Log.e("", "canceled");
        }
    }
    Intent a = new Intent(getApplicationContext(), MainActivity.class);
    startActivity(a);
}

 private void copyFile(Uri uri) {

    FileOutputStream out = null;
    try {
        InputStream in = getContentResolver().openInputStream(uri);
        out = openFileOutput(NAME , MODE_PRIVATE);
        byte[] buffer = new byte[1024];
        while ( in.read(buffer) != -1) {
            out.write(buffer);
        }
        in.close();
        in = null;
        out.close();
        out = null;
    }  catch (FileNotFoundException fnfe1) {
        Log.e("tag", fnfe1.getMessage());
        fnfe1.printStackTrace();
    }
    catch (Exception e) {
        Log.e("tag", e.getMessage());
    } 
}

然后我使用列表视图显示文件并使用以下代码读取抛出缓冲区:

BufferedReader br = null;
        try {
            File a = new File(getFilesDir().getPath() + "/CSV_RAW");
            if(a.isFile())Log.e("TEST", "file exists");
            br = new BufferedReader(new FileReader(a.getPath()));
            int count = 0;
            String ln;
            while((ln =br.readLine()) != null)
            {
                if (ln.indexOf(',') != -1)
                    count++;
            }
            br = new BufferedReader(new FileReader(a.getPath()));
            ln= br.readLine() ;
            arr = new String[count];
            count = 0;
            while((ln = br.readLine()) != null)
            {
                if (ln.indexOf(',') != -1){
                arr[count] = getName(ln);
                count ++;
                }
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

我想知道如何解决它或者是否存在更深层次的问题。

标签: javaandroid

解决方案


一种解决方案是读写 utf8 是使用BufferedReader / BufferedWriterInputStreamReader / OutputStreamWriter如下所示

//reading utf8
BufferedReader br = new BufferedReader(new InputStreamReader(in /*your FileInoutStream*/ , "utf8"),1024 /* buffer size */);
//writing utf8
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out /*your FileOutputStream */, "utf8"),1024 /* buffer size */);

推荐阅读