我如果直接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.
}
}
}
而用下面的程序输出流中的字节,则可以正常显示字符:
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.
}
}
}
解决方案 »
- 我是菜鸟,提一个很简单的关于for循环的问题
- win7系统下用eclipse编写swing程序的问题
- 急求! actionPerformed 中的 repaint() 怎么不起作用
- 关于类中数据访问的问题
- Vector 遍历问题,这有错吗(急分手,在线)
- 我下了个JAVA SDK 1.41但不知怎么用.望好心人指点.
- 用JCREATE怎么会有这种问题?
- 在applet中使用别的开发包,是用的浏览器所在本机的还是服务器的?
- 请问java.lang.System是一个类吧??那么System.out.print()中的out充当什么角色呢?还是类???
- java的Runtime.getRuntime().exec问题
- 如何征服clone?
- 问下画图的问题。。。。
System.out是一个PrintStream类型。print方法都是通过write实现的。
很显然print方法很想Writer中的方法实际上是一个Stream,但是具有Writer的特性。
write(String.valueOf(i));
}
byte类型的不就是数字吗
但是这个参数只有低八位有效。
byte a=97;
System.out.write(a);
运行结果什么也没有,不可视,但如果a来自于流的read的结果,那么再输出就是“a”了。奇怪吧
再 System.out.flush(); 下就输出了
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()的问题。两个流连接起来,我没有什么研究,就不乱说了。留给高手做详细解释吧。
System.out.write(97);
System.out.flush();
它就显示了
那岂非我用write想输出一个数字都没有办法了?还只有用DataoutputStream才行啊,我就不明白了java为什么非要自作聪明地把ascii码变成字符。