我如果直接System.out.write一个整数值,它什么也不会输出,但如果这个整数值来自于我的一个流读取的一个字节,就会真正输出这个字节对应的字符,真奇怪啊。谁能解释一下。比如a的ascii码为97,直接输出是个空白。
而用下面的程序输出流中的字节,则可以正常显示字符:
package test;import java.net.*;
import java.io.*;
import java.security.*;
import javax.net.ssl.*;
import com.macfaq.io.*;
/**
 * Created by IntelliJ IDEA.
 * User: songzi
 * Date: 2006-4-26
 * Time: 11:25:17
 * To change this template use File | Settings | File Templates.
 */
public class HTTPSClient {
    public static void main(String[] args) {
        if (args.length==0){
            System.out.println("usage:java HTTPSClient2 host");
            return;
        }        int port=443;
        String host=args[0];        SSLSocketFactory factory=(SSLSocketFactory)SSLSocketFactory.getDefault();
        try {
            SSLSocket socket=(SSLSocket)factory.createSocket(host,port);            String [] supported=socket.getSupportedCipherSuites();
            socket.setEnabledCipherSuites(supported);
            Writer out=new OutputStreamWriter(socket.getOutputStream());
            out.write("GET http://"+host+"/ HTTP/1.1\r\n");
            out.write("Host: "+host+"\r\n");
            out.write("\r\n");
            out.flush();            BufferedReader in=new SafeBufferedReader(
                    new InputStreamReader(socket.getInputStream())
            );            String s;
            while(!(s=in.readLine()).equals("")){
                System.out.println(s);
            }            System.out.println();            String contentLength=in.readLine();
            int length=Integer.parseInt(contentLength.trim(),16);            System.out.println(contentLength);            int c;
            int i=0;
            while((c=in.read())!=-1 && i++<length){
                System.out.write(c);//这里这里这里!!!!!!!!!!!!!!!!!
            }            System.out.println();
            out.close();            in.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}

解决方案 »

  1.   

    write是Stream中的接口方法
    System.out是一个PrintStream类型。print方法都是通过write实现的。
    很显然print方法很想Writer中的方法实际上是一个Stream,但是具有Writer的特性。
      

  2.   

    我知道它是PrintStream的方法,但怎么解释我那个问题呀。
      

  3.   

    为什么要放在write之后呢,write本来就能正常显示这个字节对应的字符,我就是不明白为什么不是显示成数字了
      

  4.   

    public void print(int i) {
    write(String.valueOf(i));
        }
      

  5.   

    to treeroot:
      byte类型的不就是数字吗
      

  6.   

    往流中写入字节的接口是 write(int )
    但是这个参数只有低八位有效。
      

  7.   

    treeroot没有明白我的意思啊,我是write是写一个从流中读到的字节时可以显示为一个字符,而如果一个字节变量输出的话它肯定什么也不输出,是空白。
    byte a=97;
    System.out.write(a);
    运行结果什么也没有,不可视,但如果a来自于流的read的结果,那么再输出就是“a”了。奇怪吧
      

  8.   

    它写到缓存里了
    再 System.out.flush(); 下就输出了
      

  9.   

    哦,它毕竟是流,也得flush,但是不明白,为什么流的write方法会把数字变成字符呢?
      

  10.   

    因为写入流的会被转化成字符型,所以输出自然是97对应的字符了。而用System.out.print()实际调用的是与这个类型符合的那个方法。详细地说,比如:
    int a=97;
    char c='a';
    System.out.print(a); //调用System.out.print(int)
    System.out.print(c); //调用System.out.print(char)
    所以无论是什么类型的,用print都可以原样显示出来。
    而write方法只接受byte数组或是int,可以看出他的流内部的缓存应该是byte[]类型。int可能是为了支持unicode。那么一个整数转化被转化成字符输出,也是可以理解的了。至于一个被显示出来,一个没有被显示,这就是流是否被flush()的问题。两个流连接起来,我没有什么研究,就不乱说了。留给高手做详细解释吧。
      

  11.   

    就是flush()
    System.out.write(97);
    System.out.flush();
    它就显示了
      

  12.   

    to MajorZQ:
      那岂非我用write想输出一个数字都没有办法了?还只有用DataoutputStream才行啊,我就不明白了java为什么非要自作聪明地把ascii码变成字符。
      

  13.   

    I/O流分为两个流派read write 这个以char为核心 就是 unicode  16位 能解决编码问题 不然java凭什么在互联网上流行? input output 这个以 byte为核心  就是ascII 处理英文数字当然牛B  处理编码问题 就死定了呵呵 个人愚见