【问题标题】:Reading double from text file in assets, with scanner without buffered reader从资产中的文本文件中读取双精度,使用没有缓冲阅读器的扫描仪
【发布时间】:2016-12-27 23:31:58
【问题描述】:

我在 assets 文件夹中有一个文本文件,目录是 main/src/assets/socso.txt,当我尝试读取它时会发生错误。我读了很多其他问题,其中包括一个 whr 放置到文本文件的问题,我很确定我做对了,并且大多数示例都使用了我不想要的缓冲阅读器,所以我对其进行了修改但仍然发生错误。我试图做的是使用扫描仪逐字从文本文件中读取双重数据类型,因此不应该使用缓冲阅读器。以下是我使用的一些代码:

InputStreamReader sc = new InputStreamReader(getAssets().open("socso.txt"));
Vector v = new Vector();
Iterator i = v.iterator();
String llimit;
while((llimit = sc.toString()) != null)
{
    Socso s = new Socso();
    s.setLowerlimit(Double.parseDouble(llimit));
    s.setUpperlimit(Double.parseDouble(sc.toString()));
    s.setEmployershares(Double.parseDouble(sc.toString()));
    s.setEmployeeshares(Double.parseDouble(sc.toString()));
    s.setType2(Double.parseDouble(sc.toString()));

    v.add(s);
}

sc.close();
//when I run this, I can;t even run as error occur

另一个版本

//InputStream is = resources.getAssets().open("socso.txt"); (When I use this it appears as error too)
FileInputStream is = new FileInputStream(socso.txt); //(use this appear FileNotFoundException)
Scanner sc = new Scanner(is);
Vector v = new Vector();
Iterator i = v.iterator();
while(sc.hasNext())
{
    Socso s = new Socso();
    s.setLowerlimit(sc.nextDouble());
    s.setUpperlimit(sc.nextDouble());
    s.setEmployershares(sc.nextDouble());
    s.setEmployeeshares(sc.nextDouble());
    s.setType2(sc.nextDouble());

    v.add(s);
}

我也从另一个问题中尝试过 AssetManager,但答案只是没有回答我的问题,因为上下文语法出现错误,我什至无法运行它。

【问题讨论】:

  • 您是在使用来自片段还是来自活动的代码?
  • "我在 assets 文件夹中有一个文本文件" -- 然后在 AssetManager 上使用 open("socso.txt")。资产是您的开发机器上的文件,而不是设备上的文件,因此FileInputStream 将不起作用。此外,llimit = sc.toString() 毫无意义,因为InputStreamReader 上的toString() 不会从流中返回任何内容。除此之外,我建议使用比您的文本文件看起来更现代的数据文件格式(例如 JSON、XML)。
  • Eyad Mhanna,它实际上是java类内部方法的代码片段,所以我猜它不是活动。
  • CommonsWare,我能知道完整的语法吗,比如如何与扫描仪一起实例化它?

标签: java android android-studio


【解决方案1】:

您不能从片段中调用getAssets() 方法,您需要context 才能访问这些文件。因此,导致您出现问题的行必须是这样才能消除错误

InputStream is = getActivity().getResources.getAssets().open("socso.txt");

还有:

InputStreamReader sc = new InputStreamReader(getActivity().getAssets().open("socso.txt"));

如果你想在java类中调用这些函数,创建一个方法,你传递一个Context类型的参数给它,一个activity中的context就是activity本身,而在片段中是getActivity(),所以方法一定是这样的:

    public void readDoubleFromText(Context context) {
    InputStreamReader sc = new InputStreamReader(context.getAssets().open("socso.txt"));
//rest of function....
}

【讨论】:

  • 我已经用第一个替换了它,但它似乎无法解析 'getActivity()' 部分,是因为代码出现在 Java 类的方法中吗?
  • 如果您在 JAVA 类的方法中使用它,则必须将“上下文”类型的参数传递给该方法,并将 getActivity() 替换为该参数
  • 我明白了,但是我应该在实际参数中放入什么,比如在活动中,我如何解析实际参数中的上下文?
  • 当您调用我从活动中发布的方法时,您应该将活动本身作为上下文传递,例如: readDoubleFromText(NameOfYourActivity.this);如果你想从一个片段中调用它,你必须这样做: readDoubleFromText(getActivity());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 2014-01-17
  • 2016-03-02
  • 1970-01-01
相关资源
最近更新 更多