黑马程序员技术交流社区

标题: IO中的小问题。<已解决> [打印本页]

作者: 王德升    时间: 2012-6-11 11:10
标题: IO中的小问题。<已解决>
本帖最后由 王德升 于 2012-6-20 09:07 编辑

import java.io.*;

class FileReaderTest
{
        public static void main(String[] args)throws IOException
        {
                FileReader fr = new FileReader("FileWriterDemo.java");

                char[] cha = new char[1024];// 1.
               
                int num = 0;

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

//1.这里听老毕说的一个字母是2个字节,什么1K什么的,这里的1024是什么意思,
   希望具体点,谢谢。


//第二段代码。

/*
import java.io.*;

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

                try
                {
                        BufferedReader br = new BufferedReader(new FileReader("BufferedReaderDemo.java"));
                        BufferedWriter bw = new BufferedWriter(new FileWriter("copyBF.java"));
               
                        String line = null;

                        while((line=br.readLine())!=null)

                                bw.write(line);

                                bw.newLine();

                                bw.flush();
                }

                catch(IOException e)
                {
                        System.out.println(e.toString());
                }

                finally
                {
                        try
                        {
                                if(fr!=null)
                                        fr.close();
                        }
                        catch(IOException e)
                        {
                                System.out.println(e.toString());
                        }        

                        try
                        {
                                if(fw!=null)
                                        fw.close();
                        }
                        catch(IOException e)
                        {
                                System.out.println(e.toString());
                        }
                }
        }
}
*/



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

*/
import java.io.*;

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

                try
                {
                        bufr = new BufferedReader(new FileReader("FileReaderDemo.java"));
                        bufw = new BufferedWriter(new FileWriter("copyBF.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)//1.
                                        bufr.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("读关闭失败");
                        }
                        try
                        {
                                if(bufw!=null)//2.
                                        bufw.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("写关闭失败");
                        }
                }
        }
}


//无论是老师写的还是我写的打印出来的为什么都没有换行呢,?
//1.和2.处为什么加个if(bufw!=null)判断后才关闭流呢?
//为什么下面的代码不需要判断呢?

import java.io.*;

class FileWriterDemo2
{
        public static void main(String[] args)
        {        
                FileWriter fw = null;               

                try
                {
                        fw = new FileWriter("demo.txt");

                        fw.write("ccc");

                        
                }

                catch(IOException e)
                {
                        System.out.println(e.toString());
                }

                finally
                {        
                        try
                        {
                                fw.close();//这里怎么没有判断呢?
                        }
                        
                        catch(IOException e)
                        {
                                System.out.println(e.toString());
                        }
                }
        }
}


作者: 何拴绪    时间: 2012-6-11 11:37
char 类型在内存中分配两个字节,char[] ch = new char[1024]  就是在内存中分配1024*2 个字节,就是2KB。
作者: 杨康    时间: 2012-6-11 11:57
我来回答一下,如果哪里说的不对,请指教。
1,一个英文字符在内存中是占2个字节的;1k=1024个字节,所以老师用[1024]来用缓冲区为了是方便控制复制文件的大小。
2,为什么加个if(bufw!=null)判断后才关闭流呢?这是为了防止try里面给bufw赋值时发生异常赋值不成功后bufw的值就为null了,因为finally语句里面的代码一定会执行所以当try里面的赋值发生异常时赋值不成功,bufw值为null时那么bufw.close()方法再执行就没有意义了,所以需要判断。
3,你说的那个FileWriter里面其实也是需要判断的。可能只是老师当时讲的时候还没有讲到这点,所以当时没有加上判断吧。

作者: 付信榕    时间: 2012-6-11 12:12
//1.这里听老毕说的一个字母是2个字节,什么1K什么的,这里的1024是什么意思,
   希望具体点,谢谢。
1,一个字母在ASCII里是一个字节的,字符char才是两个字节,
    2,1kB = 1024 B 这是计算机的存储容量的单位转换。计算机常用B(字节)作为最小单位
      常用有:     8 b(位) =1 B(字节)     1kB = 1024 B    1MB=1024KB    1GB=1024MB
        3,1024意思就是定义一个大小为1KB的字符数组  
//无论是老师写的还是我写的打印出来的为什么都没有换行呢,?
//1.和2.处为什么加个if(bufw!=null)判断后才关闭流呢?
//为什么下面的代码不需要判断呢?
  1,我测试了你的代码,我复制到的copyBF.txt是有换行的。不是代码的问题,是自己操作方面的问题吧
   2,加不加if(bufw!=null)对两个代码的功能都没有影响。加了if(bufw!=null)就可以在bufw关联的文件不存在时,不会执行关流(执行的话会抛异常),所以就可以减少一次抛异常。

作者: 孙峰    时间: 2012-6-11 12:13
       第一个问题::首先要知道:一个字符占两个字节。 这里char[] cha = new char[1024]; 定义的字符数组,数组长度为1024,那么也就是1024x2个字节。 再应该知道:1k就是1024字节。 那么存放该数组的文件就是2K了。
      第二个问题:为啥要判断 不为null,因为如果为null的时候,说明前面的 字符流缓冲区的操作发生异常,没有正确的建立或者读取,这时候再进行 缓冲区的操作是没有意义的。
      第三个问题:应该都是要判断下的
作者: 郑传庆    时间: 2012-6-11 12:36
第一个问题就像楼上解答的那样。
第二个问题:1.和2.处加个if(bufw!=null)判断是指,如果bufw有数据,就是不等于空,就执行if里面的语句。FileWriterDemo2类里面的finally里面不管有没有异常都会执行。就是指:当你向demo.txt里面写完数据后就关闭。至于为什么不判断,那是因为在第一个try语句里面FileWriter fw = new FileWriter("demo.txt");不管这个文件是不是存在都会重新创建并复写。也就是说这个fw就一定不为空。你也可以在finally里面把fw 设置为空,在来打印判断一下。当然最后自己还是得总结一下
               




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