黑马程序员技术交流社区

标题: IO流day18和day19有几个不是很明白。 [打印本页]

作者: 王德升    时间: 2012-7-5 17:59
标题: IO流day18和day19有几个不是很明白。
一:

import java.io.*;
class FileReader
{
        public static void main(String[] args)
        {
                FileReader fr = null;

                try
                {
                        fr = new FileReader("nihao.txt");

                        char[] c = new char[1024];//1024又是怎么定义的?求详细,
                                        //上次了问了不是很清楚,希望详细点。谢谢


                        int num = 0;

                        while((num = fr.read(c))!=-1)
                        {
                                System.out.println(new String(c,0,num));
                        }
                }

                catch(IOException e)
                {
                        System.out.println("catch:"+e.toString());//throw new IOException("出错了");我这里这样抛为什么不对啊,该怎么抛。
                }

                finally
                {
                        try
                        {
                                if(fr!=null)
                                        fr.close();
                        }

                        catch(IOException e)
                        {
                                System.out.println("catch:"+e.toString());//这里的new String是将数组c变成字符串,
                                                        //为什么这么new,是String的构造函数?

                        }
                }
        }
}

二:

public static void copy_1()throws IOException
        {
                //创建目的地。
                FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");

                //与已有文件关联。
                FileReader fr = new FileReader("RuntimeDemo.java");

                int ch = 0;

                while((ch=fr.read())!=-1)
                {
                        fw.write(ch);
                }
               
                fw.close();
                fr.close();

        }

这是day18将C盘一个文本文件复制到D盘。
首先要明确目的地,这跟我可以理解的因为要先有目的地然后才可以复制过去,
可是下面day19通过缓冲区复制一个文件,为什么它没有先明确目的而是先创建了
与文件关联的流,这是为什么???


/*
通过缓冲区复制一个.java文件。

*/
import java.io.*;

class  CopyTextByBuf
{
        public static void main(String[] args)
        {
                BufferedReader bufr = null;
                BufferedWriter bufw = null;

                try
                {
                        bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
                        bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));

                        String line = null;

                        while((line=bufr.readLine())!=null)
                        {
                                bufw.write(line);
                                bufw.newLine();
                                bufw.flush();

                        }
                }
                catch (IOException e)
                {
                        throw new RuntimeException("读写失败");
                }
                finally
                {
                        try
                        {
                                if(bufr!=null)
                                        bufr.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("读取关闭失败");
                        }
                        try
                        {
                                if(bufw!=null)
                                        bufw.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("写入关闭失败");
                        }
                }
        }
}

作者: 赵庆礼    时间: 2012-7-5 18:21
这里的new String是将数组c变成字符串,为什么这么new,是String的构造函数?
new String(c, 0, len)是构造一个新的 String对象,其字符长度为len个,。在这里是为了防止fr.read(c)在最后一次读取的时候,存入的字符并不是数组c的大小1024,而存入的字符个数len是小于1024的情况下,那么这个数组第len个之后的字符是没有被替换的,是上次读取时存入的字符,当在构造String对象时,会把整个数组c中的字符全部放写入String对象,出现错所。

至于,,可是下面day19通过缓冲区复制一个文件,为什么它没有先明确目的而是先创建了
与文件关联的流,这是为什么???
其实这个也是先创建了与目的文件相关的流,
bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
这段代码的是把FileWriter创建的匿名对象走位参数传递给了new BufferedWriter(),创建了字符输出流BufferedWriter对象,
希望这些可以帮助你
作者: 王德升    时间: 2012-7-5 18:23
赵庆礼 发表于 2012-7-5 18:21
这里的new String是将数组c变成字符串,为什么这么new,是String的构造函数?
new String(c, 0, len)是构造 ...

1024老毕说什么占多少字节阿,希望详细点啊,谢谢啦   
作者: 周刚    时间: 2012-7-5 20:54
一个个回答楼主的问题。
1:1024代表1k=2^10,因为是字符流,所以1024个字符也就是2k个字节。至于说为什么要设置1024?这是做IT的人一种职业习惯,
也是计算机喜欢的数字,呵呵。因为计算机中的硬盘盘块也是1024k的整数倍。你完全可以不设置成1024,设置成1023也可以啊,但
那样做就显得外行了。呵呵
2:你的第一个程序整个都会出问题!因为你取的类名正好叫FileReader将系统自带的FileReader给覆盖了,所以new 的时候会调用你自建的FileReaer类
会报错说没有带String类型参数的new FileReaer构造方法。帮你将类名改了一下:
import java.io.*;

class FileReader2 {
        public static void main(String[] args) {
                FileReader fr = null;

                try {
                        FileReader fr1 = new FileReader("a.txt");
                        fr = new FileReader("nihao.txt");
                        char[] c = new char[1024];// 1024又是怎么定义的?求详细,
                        // 上次了问了不是很清楚,希望详细点。谢谢

                        int num = 0;

                        while ((num = fr.read(c)) != -1) {
                                System.out.println(new String(c, 0, num));
                        }
                }

                catch (IOException e) {
                        System.out.println("catch:" + e.toString());// throw new
                                                                                                                // IOException("出错了");我这里这样抛为什么不对啊,该怎么抛。
                }

                finally {
                        try {
                                if (fr != null)
                                        fr.close();
                        }
                        catch (IOException e) {
                                System.out.println("catch:" + e.toString());// 这里的new
                                                                                                                        // String是将数组c变成字符串,
                                // 为什么这么new,是String的构造函数?

                        }
                }
        }
}
输出结果如下:
catch:java.io.FileNotFoundException: a.txt (系统找不到指定的文件。)

异常输出也很合理,因为我盘上确实没有这个文件

3:  
bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
  bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
上面这两句也是先指明了起始地和目的地啊,只是将代码浓缩了一下。可以分解如下:
FileReader fr = new FileReader("BufferedWriterDemo.java");
BufferedReader bufr = new BufferedReader(fr);

FileWriter fw = new FileWriter("bufWriter_Copy.txt");
BufferedWriter bufw = new FileWriter(fw);
显然,是设置了复制的源地址和目的地的!





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