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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄金龙 中级黑马   /  2013-1-26 10:26  /  1536 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-27 11:16 编辑
  1. /*
  2. IO类 以及异常处理
  3. */
  4. import java.io.*;

  5. class  Demo03
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 FileWriter fw = null;
  10.                 try
  11.                 {
  12.                         
  13.                         fw = new FileWriter("fileWrite.txt");
  14.                         fw.write("123456789");
  15.                         
  16.                 }
  17.                 catch (IOException e)
  18.                 {
  19.                         sop(e.toString());
  20.                 }
  21.                 finally
  22.                 {
  23.                         try
  24.                         {
  25.                                 if(fw!=null)
  26.                                         fw.close();
  27.                         }
  28.                         catch (IOException e)
  29.                         {        
  30.                                 sop(e.toString());
  31.                         }
  32.                 }
  33.                
  34.                 FileReader fr = null;
  35.                 try
  36.                 {
  37.                         fr = new FileReader("fileWrite.txt");
  38.                         for(;fr.read()!=-1;)//for(int ch=0;(ch=fr.read())!=-1;)
  39.                              sop(fr.read());//sop(ch);
  40.                 }
  41.                 catch (IOException e)
  42.                 {
  43.                         sop(e.toString());
  44.                 }
  45.                
  46.         }

  47.         public static void sop(Object obj)
  48.         {
  49.                 System.out.println(obj);
  50.         }
  51. }
复制代码
如果换成注释的代码就可以正常读取到 123456789

如果没换就是读取乱七八糟的.....求解析现象

没指定变量前就不能正常的读取?循环一次fr.read()不就有新值了吗?

未命名.jpg (1.77 KB, 下载次数: 18)

未命名.jpg

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

6 个回复

倒序浏览
try {
   fr = new FileReader("fileWrite.txt");
   /*
   for (; fr.read() != -1;)
    sop((char)fr.read());
   */
   
   for(int ch=0;(ch=fr.read())!=-1;)
    sop((char)ch);   
}
我把try里面的代码格式弄了一下:先说注释的那里,read一次,指针就会偏移到下一位,你在for那里没有用变量来接收,就丢失了。说个例子:如果你for里面读取到最后一个,那么就不为-1,然后进入for循环,那么sop((char)fr.read());中的read就读取最后一个的下一个,即到了末尾了,没有数据,就返回-1

for(int ch=0;(ch=fr.read())!=-1;)
sop((char)ch);   
这个是每读取一次,就用变量来接收,不会丢失数据

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
解释一下你的问题:
第一,你读到的是正确的数据,read方法返回的是一个int型数据,50,52,54,56强转成char类型的对应的分别是2,4,6,8,
第二,分析read指针:
for(;fr.read()!=-1;);
sop(fr.read());
首先for里边判断一次,那你sop又调用一次read,那read的指针就指向了2了,所以sop出来的是2(也就是返回的50),
然后又判断for,read指针指向3,但是并没有sop,当sop时又调用了read一次,所以打印出来是4,
那么接下来类推,6,8,指到9的时候还正常当调用sop时就是文件结尾了所以打印出来是-1,也就是你那个结果,
和定义ch变量接不接收没关系,而是调用read次数的原因。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 柴乔军 于 2013-1-26 10:50 编辑

字符流一次读取了两个字节,所以在最后打印出了-1,而在打印的时候,又被截取了后1个字节的数字,所以打印出来就变成这样了
当你声明变量ch的时候,因为它是int类型,所以2个字节长度的值被分为了两个int值,内部是如何操作的。。。这个我就不清楚了,你换成字节流
应该是没有问题的
回复 使用道具 举报
黑马王振宇 发表于 2013-1-26 10:48
解释一下你的问题:
第一,你读到的是正确的数据,read方法返回的是一个int型数据,50,52,54,56强转成ch ...

解析的很清晰...现在了解问题出在什么地方了..2次调用函数....导致指针异常...
回复 使用道具 举报
王溢君 来自手机 中级黑马 2013-1-26 12:19:39
地板
黄金龙 发表于 2013-1-26 11:34
解析的很清晰...现在了解问题出在什么地方了..2次调用函数....导致指针异常... ...

调调用一次就下移一位啦
回复 使用道具 举报
苏克 中级黑马 2013-1-26 13:08:00
7#
read()方法是调用一次,指针下移一针。你的第一个循环每个循环调用了两次read(),也就是一个用与判断条件,一个用于打印。当你输入的字符是奇数的时候,就回吧-1打印出来,偶数的时候,就不会,但是数要少一半。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马