黑马程序员技术交流社区

标题: 有一些问题不是很明白,求解惑~~~~~~~~! [打印本页]

作者: 梦里听传说    时间: 2014-8-30 17:48
标题: 有一些问题不是很明白,求解惑~~~~~~~~!
public  String myReadLine()throws IOException
        {
       
                FileReader lin=new FileReader();
                StringBuilder rq=new StringBuilder();
                        int a=0;
                        while ((a = lin.read())!=-1)
                        {
                                if (a='\r')                         //疑惑就在这里,我写到这就不是很明白了,变量a是int型的 怎么能用来和字符比较
                                        continue;
                                if (a='\n')
                                        return rd.toString();
                                rd.append((char)a);         //到这的时候为什么又能代表字符呢(虽然强转成char了),int类型不是只能放整数吗?(虽然强转成char了)疑惑就这在,求高人指点
                        }


作者: dftgg    时间: 2014-8-30 18:00
如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,例如\r

   char c='c';     int i=c;     System.out.println("output:"+i);

输出:output:99;


作者: 梦里听传说    时间: 2014-8-30 18:04
dftgg 发表于 2014-8-30 18:00
如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,例如\r

   char c='c';     in ...

谢谢,有点明白了
作者: 曾小贤OL    时间: 2014-8-30 18:28
我感觉你这个代码有问题,你没有吧lin传入缓冲区中
作者: 梦里听传说    时间: 2014-8-30 18:37
曾小贤OL 发表于 2014-8-30 18:28
我感觉你这个代码有问题,你没有吧lin传入缓冲区中

只是代码截取了一部分
//模拟一个带行号的缓冲区对象
import java.io.*;
class dhh
{
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
        public static void main(String[] args)
        {
                LineNumberReader dq=null;
                //MyLineNumberReader dq=null;
                try
                {
                        dq=new LineNumberReader(new FileReader("d://JAVA知识整理.txt"));
                        //dq=new MyLineNumberReader(new FileReader("d://JAVA知识整理.txt"));
                        String str=null;
                        while ((str=dq.readLine())!=null)
                        {
                                sop(dq.getLineNumber());
                                //sop(str);
                        }
                }
                catch (IOException e)
                {
                }
        }
       
}
//开始模拟带行号的缓冲区
class MyLineNumberReader extends Reader
{
        private Reader r;
        MyLineNumberReader(Reader r)
        {
                this.r=r;
        }
        public  String readLine()throws IOException
        {
                /*第一种
                BufferedReader ls=new BufferedReader(r);

                return ls.readLine();
                */
                //第二种
                StringBuilder rq=new StringBuilder();
                        int a=0;
                        while ((a = r.read())!=-1)
                        {
                                if (a=='\r')
                                {
                                        continue;
                                }
                                if (a=='\n')
                                {
                                        return rq.toString();
                                }
                                else
                                        rq.append((char)a);
                        }
                return null;
        }
       
public  int myGetLineNumber()throws IOException
        {
               



                return 0;
        }
        public void close()throws IOException
        {
                r.close();
        }
        public int read(char[] cbuf, int off, int len)throws IOException
        {
                return r.read(cbuf,off,len);
        }


}

这是全部代码 还没写完,那个问题已经搞明白了 ,汗还是给忘了
作者: 【灰太狼】    时间: 2014-8-30 20:24
哥们,又是你啊~
我给你解释一下把,read()方法,返回值是读到字符的ASCII码,如果读到了末尾,就返回-1,表示后面没有了,不用再读了。
------------------------------------------------
while ((a = lin.read())!=-1)
这行表示一个循环,只要返回值不是-1,即没有读到结尾,就一直读
---------------------------------------------------
if (a='\r')   //疑惑就在这里,我写到这就不是很明白了,变量a是int型的 怎么能用来和字符比较
这里是java的一个基础语法,char,byte,short类型在运算后都会自动提升为int类型。这是java类型的自动提升。int和类型和char类型比较,char类型会自动提升为int,即把‘\r’转换为他的ASCII码(int类型)。
------------------------------------------------------
rd.append((char)a);         //到这的时候为什么又能代表字符呢(虽然强转成char了),int类型不是只能放整数吗?(虽然强转成char了)疑惑就这在,求高人指点

你读出来的ASCII码,是int型,如果你直接rd.append(a);那你就是把你读出来的字符的ASCII码写进去了,显然不是我们的效果,我们要的是字符,那就要把ASCII码在转换成字符,就是把int类型再转换回char类型,所有就用到了强制类型转换,在a前面加上(char).就有了    rd.append((char)a);

就是这样。

作者: ximi    时间: 2014-8-30 20:28
【灰太狼】 发表于 2014-8-30 20:24
哥们,又是你啊~
我给你解释一下把,read()方法,返回值是读到字符的ASCII码,如果读到了末尾,就返回-1, ...

这个回答很详细啊
作者: 梦里听传说    时间: 2014-8-31 10:52
【灰太狼】 发表于 2014-8-30 20:24
哥们,又是你啊~
我给你解释一下把,read()方法,返回值是读到字符的ASCII码,如果读到了末尾,就返回-1, ...

太感谢了,回答真详细,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2