如何在Android的Logcat中查看数组

9

我想在我的logcat中记录原始数据,例如数组,这样我就知道输出是什么。 假设我有一个数组...就像这样:

File[] mp3List = ...
Log.v("test", mp3List);

为什么我不能在控制台直接记录数组?我该如何做到?

5个回答

14

你无法记录数组,因为它只是一个对象。LogCat不知道如何处理它或以你想要的方式显示它。

如果每个File对象都有一个显示你想要信息的toString()方法,你可以使用:

Log.v(Arrays.toString(mp3List));

否则,你必须自己拼接字符串来记录:

StringBuilder sb = new StringBuilder();
for(File f : mp3List) {
  sb.append(f.getName());
}

Log.v(sb.toString());

10
这个不起作用的原因很简单,就是因为 Log.v 的第二个参数是一个 String 而不是一个 File[]。Java 严格执行参数类型。 更新: 你可以很容易地将包含在 File 对象中的信息转换为 String 对象。所有 Java 对象都实现了 toString() 方法,如果我没记错的话,它会返回对象的 ClassName 和地址的组合。但通常这并没有包含有用的信息。所以你需要自己定义转换方式。
现在要从 File[] 转换为 String 更加复杂,因为当你在数组上调用方法时,它会作用于数组对象而不是数组成员(其中包含你可能关心的信息)。因此,调用 mp3List.toString() 将返回一个描述数组对象而不是数组中包含的信息的单个字符串。
所以你可能想编写这样的方法:
String fileArrayToString(File[] f){
    String output = "";
    String delimiter = "\n" // Can be new line \n tab \t etc...
    for (int i=0; i<f.length; i++)
    {
        output = output + f[i].getPath() + delimiter;
    }

    return output;
}

然后,按照以下方式调用make your log call:
Log.v("MyTag", fileArraytoString(mp3List);

然而,这可能很难阅读。

我个人会这样做:

for (int i=0; i<mp3List.legnth; i++)
    Log.v("MyTag", Integer.toString(i) + ":" + mp3List[i].getPath());

它更简单,产生更干净的日志信息,并且作为程序员更容易理解正在发生的情况。


1
如果您有一个字符串数组,只需添加toString()即可显示它。
对于自定义对象,您应该重写toString()方法并打印您想要查看的对象。然后,如果您有一个数组,该数组将使用toString方法的输出进行打印。

如果我使用toString,它将记录类似于:"Ljava.io.File;@4052eac0"的内容,这并没有真正帮助我。 - Badr Hari
这就是为什么你应该在想要打印信息的类中覆盖toString方法的原因。 - J. Maes

0

我更喜欢一行代码:

for(File file:list) Log.d(TAG, "list: " + file.getPath());


0

也许我误解了,但我认为它很简单:

string sLog = "";
for(mp3List..)
{
    sLog += mp3List[i].getName();
}

Log.v(sLog);

不是吗?因为我猜当你尝试像那样打印一个数组时,你会得到一个日志条目,说mp3List是一个System.Blah.Blah.File[]..

希望能有所帮助。


3
字符串连接应该使用 StringBuilder 进行。使用 += 操作符会在每次迭代中创建一个新的字符串对象,因为字符串是不可变的。 - Jivings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接