c# - 从 Assets 中读取文本文件的问题(xamarin)

标签 c# android text xamarin

我在从 Assets 目录中读取简单的 txt 时遇到问题。我真的无法弄清楚为什么它不起作用以及出了什么问题。

下面是我写的方法代码:

        private string ReadFile(){
        var stream = Assets.Open ("sampleText.txt");
        StreamReader sr = new StreamReader (stream);
        string text = sr.ReadToEnd ();
        sr.Close ();
        return text;
    }

这里是错误:

Java.Lang.NullPointerException: Exception of type 'Java.Lang.NullPointerException' was thrown.
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/2970/46c3f7e0/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
at Android.Runtime.JNIEnv.CallNonvirtualObjectMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00084] in /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:596 
at Android.Content.ContextWrapper.get_Assets () [0x0005f] in /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Content.ContextWrapper.cs:154 

我在 windows 上运行我的整个应用程序没有问题,只是我在 android 上运行它有问题。尝试了各种方法,例如 AssetManager 的实例,但效果不佳。

文本文件被标记为 AndroidAsset。

这是我的 TextChangeBench:

public class TextChangeBench : Activity
{
    public TextChangeBench (){}

    private void SaveFile(string[] tab){

        string saveLocation = "sampleTextReworked.txt";
        StreamWriter sw = new StreamWriter (saveLocation);
        foreach (string s in tab) {
            sw.Write (s);
        }
        sw.Close ();
    }

    private string ReadFile(){
        var stream = Assets.Open ("sampleText.txt");
        StreamReader sr = new StreamReader (stream);
        string text = sr.ReadToEnd ();
        sr.Close ();
        return text;
    }
    public void ChangeText(){
        try{
            File.Delete("sampleTextReworked.txt");
        }catch(FileNotFoundException e){Console.WriteLine (e);}

        try{
            string text = ReadFile ();
            char c;
            string[] newTab = new string[text.Length];
            for (int i = 0; i < text.Length; i++)
            {
                c = (char)text [i];
                if (Char.IsUpper(c))
                {
                    newTab[i] = text[i].ToString().ToLower();
                }
                else if (Char.IsLower(c))
                {
                    newTab[i] = text[i].ToString().ToUpper();
                }
                else
                {
                    newTab[i] = text[i].ToString();
                }
            }
            SaveFile(newTab);
        }
        catch(Exception e){Console.WriteLine ("{0} ", e);}
    }
}

这是我的 MainActivity:

[Activity (Label = "csBench", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate (Bundle savedInstanceState)
    {
        base.OnCreate (savedInstanceState);

        SetContentView (Resource.Layout.Main);
        Button startButton = FindViewById<Button> (Resource.Id.start);
        startButton.Click += delegate {

            MathBench mb = new MathBench ();
            TextChangeBench tcb = new TextChangeBench ();
            PassedTime pt = new PassedTime ();
            EditText et = (EditText)FindViewById (Resource.Id.textInfo);

            for (int i = 0; i < 5; i++) {
                pt.StartMeasuring ();
                //mb.Silnia (25);
                //mb.Fibonacci (32);
                //mb.BubbleSort ();
                tcb.ChangeText ();
                if (i == 4) {
                    pt.StopMeasuring ();

                    et.SetText(pt.ReturnResult(), TextView.BufferType.Normal);
                    //et.SetText(pt.ReturnResult().ToString());
                    //Console.WriteLine(pt.ReturnResult ());
                    pt.ResetTimers ();
                }
            }  
        };

    }
}

欢迎任何帮助,在此先感谢。

最佳答案

发生此错误是因为手动创建 Activity 实例(例如 TextChangeBench)绕过了 Android 框架设置过程,使 Activity 处于无效状态。

Activity 用作用户交互点,将 View /屏幕绑定(bind)到应用程序中的逻辑。由于 TextChangeBench 仅实现应用程序逻辑,因此它不需要从 Activity 派生,更适合作为普通 C# 类。

移除对 Activity 的继承以简化 TextChangeBench 的代码。这意味着我们无法再访问 Assets 属性,因此无法检索 Assets 。我们可以通过使用全局应用程序上下文来解决这个问题:

var stream = Android.App.Application.Context.Assets.Open("sampleText.txt");

删除 Activity 继承和使用全局上下文访问 Assets 管理器的组合将修复 Java.Lang.NullPointerException

最终代码如下所示:

public class TextChangeBench 
{
    private void SaveFile(string[] tab)
    {

        string saveLocation = "sampleTextReworked.txt";
        StreamWriter sw = new StreamWriter(saveLocation);
        foreach (string s in tab)
        {
            sw.Write(s);
        }
        sw.Close();
    }

    private string ReadFile()
    {
        var stream = Android.App.Application.Context.Assets.Open("sampleText.txt");

        StreamReader sr = new StreamReader(stream);
        string text = sr.ReadToEnd();
        sr.Close();
        return text;
    }
    public void ChangeText()
    {
        try
        {
            File.Delete("sampleTextReworked.txt");
        }
        catch (FileNotFoundException e) { Console.WriteLine(e); }

        try
        {
            string text = ReadFile();
            char c;
            string[] newTab = new string[text.Length];
            for (int i = 0; i < text.Length; i++)
            {
                c = (char)text[i];
                if (Char.IsUpper(c))
                {
                    newTab[i] = text[i].ToString().ToLower();
                }
                else if (Char.IsLower(c))
                {
                    newTab[i] = text[i].ToString().ToUpper();
                }
                else
                {
                    newTab[i] = text[i].ToString();
                }
            }
            SaveFile(newTab);
        }
        catch (Exception e) { Console.WriteLine("{0} ", e); }
    }
}

参见:

关于c# - 从 Assets 中读取文本文件的问题(xamarin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36293528/

相关文章:

c# - Unity : Find out, 如果用户点击了广告

python - 如何在python中读取文本文件的任意行?

jQuery 获取页面中所有元素的文本

c# - 使用通用协方差/逆变自定义 Autofac 的组件分辨率/问题

C# - 列表中的列表

c# - 将参数传递给 Postman 中的 asmx 网络服务

java - 错误 gps requestLocationUpdates android

android - 将 fragment 放入另一个包含选项卡的 fragment 中?

haskell - 将字节字符串部分解码为文本

c# - 小数超出范围 C# 和 SQL Server