我要崩溃了,超高分求助!关于输入输出流的具体详细的问题,烦请高人指点一二,则在下不胜感激,不对,简直是感激涕零,无以为报,生当殒首,死当结草,难报大恩之万一。
输入输出流,尤其是字符流和字节流的区别到底是什么?我看书看的都快要自杀了,还是高不清楚。究竟字符流和字节流处理文件的详细过程是怎么回事?Java用unicode来存贮字符,意思是不是说所有定义的变量,它们所引用的值在内存中都是用unicode来存贮的?那本地计算机编码又是怎么回事?比如我定义了一个int i=127;是不是说它在内存中是以0000 0000 0111 1111的形式存在?字节流既然是直接将内存中的数据写入文件,那用字节流把它写入文件之后,是不是编码仍然为0000 0000 0111 1111?而用字符流的话就变成了
0000 0001
0000 0010
0000 0111
呢?那既然这样,System.out.println(i);out是字节流PrintStream的对象,那应该属于字节流了,可是为什么这句话输到屏幕上的仍然是我们能够看懂得字符127呢?应该是乱码的呀?用字符流读取一个以前用字节流写得文件及用字节流读取一个以前用字符流写的文件,到底会有什么过程?请高手帮帮我,真是太痛苦了。回答的兄弟请注意,千万不要说什么找本书去看懂了再问这种话,我真是看不懂了。回答的好的兄弟,在下一定会尽量给出最高的分数和最大的感激。谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢!

解决方案 »

  1.   

    PrintStream中println(int i)方法这样写的
        public void print(int i) {
    write(String.valueOf(i));
        }
    int是转化为String来输出的
      

  2.   

    下面是我的理解,不对不许骂人
    我认为你的问题有两个方面
    1是 class文件本身的格式
    要想知道CLASS文件的格式及其细节,可以去看深入研究JAVA虚拟机,我正在看这个,知道的不多,不能胡说.帮不了你.
    2是你sourcecode里面的字符的格式问题
    有这样的一个流程,源代码-class文件-JVM-解析CLASS-操作系统-执行结果
    我看过网上一些关于编码方式的文章,应该就是这个意思
    主要是针对汉字的编码会引起问题,这里面涉及到了UTF-8,GB2312等常用的编码方式,我知道的就这么多,希望能够抛砖引玉
    再次重申,如果是交流,欢迎批评指正,大家注意素质,不要上来就骂人.
      

  3.   

    字节流--处理单元为1个字节,操作字节和字节数组。所有的InputStrem和OutputStream的子类都是。
    字符流--处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串
    通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联
    在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的
      

  4.   

    OutputSteamWriter构造的时候可以指定编码,如果你是使用不带编码的构造函数来构造这个writer,默认的编码为UTF-8。127的UTF-8编码是(0001 0010 0111), 相应的字符流就是你看到的那个。
      

  5.   

    你的问题回答如下:
    先要理解流的概念,所谓流就是不断的流出0或者1,所以他是乱七八糟的,那怎么办,java提供I/O流的方式对他进行格式化,比如最基本的 InputStream就是这些把01  八个一组,进行读入,也就是 恰好一个字节,所以他一次要么读8个要么不读。那么字符流当然就是一次读16个01
    。那么什么情况下用字节流,什么情况下用字符呢?一般是文本文件我们用字符流,这样快。但如果是图象这样的文件,如果是按照字符流来读写就可能会漏掉数据,具体原因是:一般的图象文件是按字节存储的,如果按字符流来处理,比如换行符(\n)就会自动过滤掉,而代表\n的那几个01在图象里面就不是什么换行,而是他的数据内容,所以遗漏就造成了。
     由此也可以看出,任何情况下我们采用字节格式化流方式都不会遗漏数据。
    至于你所说的unicode问题,什么乱码这显然是不会的,因为中间还有jvm,他给你做了很多事情,你只要在逻辑概念上理解就可以了,他在内寸里面具体怎么实现,有点复杂,比如float,就由s m e三部分组成,比较复杂。
      

  6.   

    楼上的解释不错,
    对于IO,其实我们也可以看看API的说明的
      

  7.   

    thinking in Java中讲的很清楚的,看看说不定会有收获的
      

  8.   

    我觉得字节流读出的是2进制码,但因为处理的最小的单位是byte,就好像是8位一样了
    总之从字节流读出的代码本身没有任何意义的,当你使用正确的方式取重新组织这个流才会得到想要的结果,所以不会有细节的丢失
    而字符流是当作双字节的字来读的,当读的东西不构成字的时候可能回出错,比如用字符流读图像文件或是音乐文件,再把这个流重组成图像或音乐有可能会出现错误.
    最终结论:文本类文件用字符流,其它的用字节流
      

  9.   

    这个问题确实很头痛,当初我也想了很久后来看了http://www.xxlinux.com/linux/article/development/soft/20060626/2158.html这东西明白了点
    主要是别把这个想得太复杂了。要写出去就是output,要读就是input,至于具体的方法和格式都靠自己定和实际情况了确定。
      

  10.   

    我也不明白这个问题,看了众位的回复明白了不少,thankyou