我正在玩一个简单的
android应用程序,使用运行android-7(2.1)的模拟器和一个运行android-8(2.2)的moto-defy.
我碰到一个有趣的问题,一个CSV解析应用程序在模拟器上失败,但成功地在defy和常规的java应用程序(使用sun java).
我跟踪问题,原因是android-7的StringReader的实现不支持负的跳过操作:
Android的7:
/** * Skips {@code amount} characters in the source string. Subsequent calls of * {@code read} methods will not return these characters unless {@code * reset()} is used. * * @param ns * the maximum number of characters to skip. * @return the number of characters actually skipped or 0 if {@code ns < 0}. * @throws IOException * if this reader is closed. * @see #mark(int) * @see #markSupported() * @see #reset() */ @Override public long skip(long ns) throws IOException { synchronized (lock) { if (isClosed()) { throw new IOException(Msg.getString("K0083")); //$NON-NLS-1$ } if (ns <= 0) { return 0; } long skipped = 0; if (ns < this.count - pos) { pos = pos + (int) ns; skipped = ns; } else { skipped = this.count - pos; pos = this.count; } return skipped; } }
J2SE 1.6:
/** * Skips the specified number of characters in the stream. Returns * the number of characters that were skipped. * * <p>The <code>ns</code> parameter may be negative,even though the * <code>skip</code> method of the {@link Reader} superclass throws * an exception in this case. Negative values of <code>ns</code> cause the * stream to skip backwards. Negative return values indicate a skip * backwards. It is not possible to skip backwards past the beginning of * the string. * * <p>If the entire string has been read or skipped,then this method has * no effect and always returns 0. * * @exception IOException If an I/O error occurs */ public long skip(long ns) throws IOException { synchronized (lock) { ensureOpen(); if (next >= length) return 0; // Bound skip by beginning and end of the source long n = Math.min(length - next,ns); n = Math.max(-next,n); next += n; return n; } }
因此,android版本保持一个字符向前,而不是向后跳过(解析器在某些情况下使用这个来预读字符).
我的问题是J2EE规范中存在的各种不兼容性和差异性在哪里?如果没有,你们还遇到什么其他问题.
谢谢,p.