黑马程序员技术交流社区

标题: 两个打印方式的区别为什么结果是一样的/?有什么区别? [打印本页]

作者: 唐永康    时间: 2012-11-27 18:34
标题: 两个打印方式的区别为什么结果是一样的/?有什么区别?
本帖最后由 唐永康 于 2012-11-27 18:36 编辑

/*
文本文件读取方式二:
读到缓冲区,数组里面去read(char[] buf);
*/
package io.practice;
import java.io.*;
public class Demo4
{
FileReader fr;
Demo4()
{
  try
  {
   //创建文件读取流对象
   fr = new FileReader("e:\\Demo.txt");
   
   //读数据之前先做一个字符数组缓冲区,用于存储读取到的字符
   //read(char[])返回的是读到的字符个数
   char[] buf = new char[1024];
   
   for(int ch=0;(ch=fr.read(buf))!=-1;)
   {
//    System.out.println(buf);
   // System.out.println(new String(buf));
System.out.println(new String(buf,0,ch));
   
   }
  }
  catch(IOException e)
  {
   System.out.println(e.toString());
  }
  finally
  {
   if(fr!=null)
   {
    try
    {
     fr.close();
    }
    catch(IOException e)
    {
     System.out.println(e.toString());
    }
   }
  }
  
}

public static void main(String[] args)
{
  
  new Demo4();
}

}

看上面的代码,红色的三行打印在控制台上的结果是一样的,有什么区别,搞不明白。


作者: ljhheima    时间: 2012-11-27 19:05
本帖最后由 ljhheima 于 2012-11-27 19:07 编辑

我可以很老实地告诉你,它们没有区别,你爱用哪种就用哪种。
第一种是打印字符数组,字符数组和一般数组不同,它是打印数组中的字符
第二第三种方式是将数组转成字符串,一样的。
作者: 李润根    时间: 2012-11-27 19:16
第一种好像是输出数组的内存地址
第二种是把整个长度为1024的数组都输出
第三种是把数组的有效元素输出
作者: tfy    时间: 2012-12-1 00:43
三种不同的方式让我们更能深刻理解String
作者: tfy    时间: 2012-12-1 00:44
三种不同方式有时在特定的环境中可能会用到
作者: 崔洪全    时间: 2012-12-1 10:57
System.out.println(buf);
这句打印的是这个char型数组,在打印的时候,buf会自动调用toString()方法,将buf数组以字符串的方式打印出来

System.out.println(new String(buf));
这里面打印的就是一个字符串,不过不是自动调用toString()方法,而是人工调用new String(char[])的方法将数组buf转换为字符串以后再输出

System.out.println(new String(buf,0,ch));
这里面也是利用的String的构造函数new String(char[] value, int offset, int count)分配一个新的 String,它包含来自该字符数组参数的一个子数组的字符。offset 参数是子数组第一个字符的索引,count 参数指定子数组的长度。该子数组的内容已被复制;后续对字符数组的修改不会影响新创建的字符串。
参数:
value - 作为字符源的数组。
offset - 初始偏移量。
count - 长度。
这样就把buf的有效字符转换为字符串的形式后输出
作者: 崔洪全    时间: 2012-12-1 11:16
刚才的解释有点小误差,第一句错了,在此修正
System.out.println(buf);
这句打印的是这个char型数组,在打印的时候,会按顺序输出 buf 数组中的所有字符。
在这里不会自动调用toString方法。




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