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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘少伟 中级黑马   /  2012-4-15 01:08  /  1530 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘少伟 于 2012-4-15 01:11 编辑

1、Reader类的read(char[] cbuf)方法返回的是读到的字符数,若到末尾返回-1,那么该方法有没有返回0的可能呢?
2、下面这个用字符流和字节流读取文本文件的例子:
文本文件内容如下:
abcde
fgh你好
代码如下:
  1. import java.io.*;

  2. class FileStreamTest {
  3.         public static void main(String[] args) throws IOException {
  4.                 readerMode();
  5.                 streamMode();
  6.         }

  7.         public static void readerMode() throws IOException {
  8.                 System.out
  9.                                 .println("-------------------readerMode---------------------");
  10.                 FileReader in = new FileReader("1.txt");
  11.                 char[] buf = new char[1024];
  12.                 int len = 0;
  13.                 while ((len = in.read(buf)) != -1) {
  14.                         System.out.println("len=" + len);
  15.                         System.out.println(new String(buf, 0, len));
  16.                 }
  17.                 in.close();
  18.         }

  19.         public static void streamMode() throws IOException {
  20.                 System.out
  21.                                 .println("-------------------streamMode---------------------");
  22.                 FileInputStream in = new FileInputStream("1.txt");
  23.                 byte[] buf = new byte[1024];
  24.                 int len = 0;
  25.                 while ((len = in.read(buf)) != -1) {
  26.                         System.out.println("len=" + len);
  27.                         System.out.println(new String(buf, 0, len));
  28.                 }
  29.                 in.close();
  30.         }
  31. }
复制代码
用字符流读取时,得到的总长度是12,为什么用字节流读取时,得到的却是14?字符流的中英文字符不涉及编码表吗?

3、毕老师Java基础视频19天-21的视频中,写了这样一个程序:
  1. import java.io.*;

  2. class ExceptionInfo {
  3.         public static void main(String[] args) throws IOException {
  4.                 try {
  5.                         int[] arr = new int[2];
  6.                         System.out.println(arr[3]);
  7.                 } catch (Exception e) {
  8.                         e.printStackTrace(new PrintStream("a.txt"));
  9.                 }
  10.         }
  11. }
复制代码
为什么在main方法中,既然大的异常Exception被捕捉了,还能抛出IOException异常,这样做为什么可以?throws Exception和try、catch可以共用?不冲突?

3 个回复

倒序浏览
1、在api文档中:Reader类的read(char[] cbuf)方法,返回值是读取的字符数,如果已到达流的末尾,则返回 -1 ,当你读入的是cbuf=""空字符串那么,你将的到0
2、在计算机中:一个英文占一个字节 ,一个汉字占两个字节 ,因为文件中包含有中文,所以读出的是14个字节。
3、throws 只是把一个异常抛出去了,如果你的上层代码有处理方式,就由上层代码来处理这个异常。
   而try/catch对是清楚的知道该操作可能出现什么异常,同时在catch块中应该有处理的方法。
   而且还有一种方式就是try/catch/finaly的方式。

回复 使用道具 举报
1.read(char[] cbuf) 返回的是字符数组的长度,当数组为"null"时,即为0。
2.当字符流读取文件,将字符串转换成字符数组,不涉及到解码;但字节流读取时,需要将字符串转换成字节数组,而在默认的编码表中,一个中文汉字占两个字节,英文占一个字节,所以会显示数组长度一同。如果实在是不懂建议你看看第二十一天视频,里面有关于编码,解码的讲解。
3.其实在这段代码中补获的是数组角标越界异常 java.lang.ArrayIndexOutOfBoundsException,而在主函数声明的异常,可以不进行catch{}捕获,由虚拟机处理。
对与声明异常throws Exception及其子类(不包含RuntimeException及其子类),除非声明在主函数上,否则必须有try{}catch{},毕老师讲的很清楚,一个异常就对应一个catch{}。
回复 使用道具 举报
1,读到null的时候就是o
2,每个汉字和每个英文占得空间不同
3,而在主函数声明的异常,可以不进行catch{}捕获,throws 是往上抛谁调用谁处理 主函数抛了只能虚拟机处理
对与声明异常throws RuntimeException是一个特殊的异常,不用声明到函数中,还有Exception是所有异常的父类,定义到catch谁都能接
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马