A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lovecx24 中级黑马   /  2013-11-30 19:25  /  1379 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看毕向东老师的视频,讲readline()实现的原理本质还是read()方法,只是在里面封装了一个数组,请问这个数组到底有多长,假设我有一个很大的文本,该文本的每行字符很长,这个方法会不会抛出异常或者是程序错误?

评分

参与人数 1黑马币 +6 收起 理由
狼王 + 6 赞一个!

查看全部评分

3 个回复

倒序浏览
不会,这个数组会自动增加存储空间。。。
回复 使用道具 举报
这种问题看看源码就懂了,看不全懂,也能懂个大概吧!
  1. String readLine(boolean ignoreLF) throws IOException {
  2.         StringBuffer s = null;
  3.         int startChar;

  4.         synchronized (lock) {
  5.             ensureOpen();
  6.             boolean omitLF = ignoreLF || skipLF;

  7.         bufferLoop:
  8.             for (;;) {

  9.                 if (nextChar >= nChars)
  10.                     fill();
  11.                 if (nextChar >= nChars) { /* EOF */
  12.                     if (s != null && s.length() > 0)
  13.                         return s.toString();
  14.                     else
  15.                         return null;
  16.                 }
  17.                 boolean eol = false;
  18.                 char c = 0;
  19.                 int i;

  20.                 /* Skip a leftover '\n', if necessary */
  21.                 if (omitLF && (cb[nextChar] == '\n'))
  22.                     nextChar++;
  23.                 skipLF = false;
  24.                 omitLF = false;

  25.             charLoop:
  26.                 for (i = nextChar; i < nChars; i++) {
  27.                     c = cb[i];
  28.                     if ((c == '\n') || (c == '\r')) {
  29.                         eol = true;
  30.                         break charLoop;
  31.                     }
  32.                 }

  33.                 startChar = nextChar;
  34.                 nextChar = i;

  35.                 if (eol) {
  36.                     String str;
  37.                     if (s == null) {
  38.                         str = new String(cb, startChar, i - startChar);
  39.                     } else {
  40.                         s.append(cb, startChar, i - startChar);
  41.                         str = s.toString();
  42.                     }
  43.                     nextChar++;
  44.                     if (c == '\r') {
  45.                         skipLF = true;
  46.                     }
  47.                     return str;
  48.                 }
  49.                
  50.                 if (s == null)
  51.                     s = new StringBuffer(defaultExpectedLineLength);
  52.                 s.append(cb, startChar, i - startChar);
  53.             }
  54.         }
  55.     }
复制代码
回复 使用道具 举报
本帖最后由 落木萧萧 于 2013-11-30 20:09 编辑

粗略看了看源码,貌似数组定长是8192.
  1. private static int defaultCharBufferSize = 8192
复制代码
楼上贴上了readLine()方法,那我就贴调用的fill()方法吧
  1. /**
  2. * Fills the input buffer, taking the mark into account if it is valid.
  3. */
  4. private void fill() throws IOException {
  5. int dst;
  6. if (markedChar <= UNMARKED) {
  7. /* No mark */
  8. dst = 0;
  9. } else {
  10. /* Marked */
  11. int delta = nextChar - markedChar;
  12. if (delta >= readAheadLimit) {
  13. /* Gone past read-ahead limit: Invalidate mark */
  14. markedChar = INVALIDATED;
  15. readAheadLimit = 0;
  16. dst = 0;
  17. } else {
  18. if (readAheadLimit <= cb.length) {
  19. /* Shuffle in the current buffer */
  20. System.arraycopy(cb, markedChar, cb, 0, delta);
  21. markedChar = 0;
  22. dst = delta;
  23. } else {
  24. /* Reallocate buffer to accommodate read-ahead limit */
  25. char ncb[] = new char[readAheadLimit];
  26. System.arraycopy(cb, markedChar, ncb, 0, delta);
  27. cb = ncb;
  28. markedChar = 0;
  29. dst = delta;
  30. }
  31. nextChar = nChars = delta;
  32. }
  33. }

  34. int n;
  35. do {
  36. n = in.read(cb, dst, cb.length - dst);
  37. } while (n == 0);
  38. if (n > 0) {
  39. nChars = dst + n;
  40. nextChar = dst;
  41. }
  42. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马