dataOutputStream 对应writeutf outputstream 对应于write
定义一个buf把: 用buf存放输入流然后放到字符串里
//读--从客户端读数据
InputStream in = s.getInputStream(); byte buf[] = new byte[1024]; in.read(buf); System.out.println("read info: "+new String(buf));
http://www.yiibai.com/java/io/dataoutputstream_writeutf.html
首先电脑有两种UTF,分别是UTF8和UTF16,UTF8占据的内存小,所以网络程序一般是UTF8,这里的writeUTF(),主要用来把你的的文件内容以UTF8的形式传入管道,进行传输,希望对你有用
http://blog.csdn.net/xkwong/article/details/6450040
这是dataOutputStream 的方法~~使用utf-8编码 其实就是从unicode变过来的,utf8编码把其中的ASC编码变成1个字节,其他其他字符2到3个字节!因为dataInput(output)Stream 属于字节流,所以用这个编码可以把其他形式的转化过来
- writeUTF(String str);
- write(int b) ;
- writeBytes(String s) ;
- 这几个方法可以传的参数不一样。
- writeUTF和writeBytes都可以传String类型的参数,而write就不行了。
- public final void writeUTF(String str)
- throws IOException以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
- 首先,通过 writeShort 方法将两个字节写入输出流,表示后跟的字节数。该值是实际写出的字节数,不是字符串的长度。根据此长度,使用字符的 UTF-8 修改版编码按顺序输出字符串的每个字符。如果没有抛出异常,则计数器 written 增加写入输出流的字节总数。该值至少是 2 加 str 的长度,最多是 2 加 str 的三倍长度。
- String readUTF()
- throws IOException读入一个已使用 UTF-8 修改版格式编码的字符串。readUTF 的常规协定是:该方法读取使用 UTF-8 修改版格式编码的 Unicode 字符串的表示形式;然后以 String 的形式返回此字符串。
- 首先读取两个字节,并使用它们构造一个无符号 16 位整数,构造方式与 readUnsignedShort 方法的方式完全相同。该整数值被称为 UTF 长度,它指定要读取的额外字节数。然后成组地将这些字节转换为字符。每组的长度根据该组第一个字节的值计算。紧跟在某个组后面的字节(如果有)是下一组的第一个字节。
- 如果组的第一个字节与位模式 0xxxxxxx(其中 x 表示“可能为 0 或 1”)匹配,则该组只有这一个字节。该字节被左侧补零,转换成一个字符。
- 如果组的第一个字节与位模式 110xxxxx 匹配,则该组只由字节 a 和另一个字节 b 组成。如果没有字节 b(因为字节 a 是要读取的最后一个字节),或者字节 b 与位模式 10xxxxxx 不匹配,则抛出 UTFDataFormatException。否则,将该组转换成字符:
- (char)(((a& 0x1F) << 6) | (b & 0x3F))
- 如果组的第一个字节与位模式 1110xxxx 匹配,则该组由字节 a 和另外两个字节 b 和 c 组成。如果没有字节 c(因为字节 a 是要读取的最后两个字节之一),或者字节 b 或字节 c 与位模式 10xxxxxx 不匹配,则抛出 UTFDataFormatException。否则,将该组转换成字符:
- (char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F))
- 如果组的第一个字节与模式 1111xxxx 或模式 10xxxxxx 匹配,则抛出 UTFDataFormatException。
- 如果在执行整个过程中的任意时间到达文件末尾,则抛出 EOFException。
- 在通过此过程将每个组转换成字符后,按照从输入流中读取相应组的顺序,将这些字符收集在一起,形成一个 String,然后该字符串将被返回。
- 可以使用 DataOutput 接口的 writeUTF 方法写入适合此方法读取的数据。
DataOutputStream的writeUTF()方法与OutputStreamWriter的write()区别!
http://blog.csdn.net/liangrockman/article/details/5740275
- import <a href="http://lib.csdn.net/base/java" class='replace_word' title="Java 知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>.io.DataOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
- public class FileTest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- File file = new File("G://DataOutputStream.txt");
- File file2 = new File("G://OutputStreamWriter.txt");
- try {
- //file.createNewFile();
- DataOutputStream output = new DataOutputStream(new FileOutputStream(file));
- output.writeUTF("a");
- output.writeUTF("b");
- file2.createNewFile();
- OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file2));
- writer.write("a");
- writer.write("b");
- writer.flush();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- /*for(File f:file.listRoots()){
- System.out.println(f);
- }*/
- }
- }
两个方法写出的16进制码分别是
DataOutputStream的writeUTF():00 01 61 00 01 62
OutputStreamWriter的write():61 62
经个人分析,writeUTF()写出一个UTF-8编码的字符串前面会加上2个字节的长度标识,已标识接下来的多少个字节是属于本次方法所写入的字节数。
而write()方法按照常理,直接写出UTF-8编码后的字符。
http://blog.csdn.net/dengyunze/article/details/160648
正在用JAVA写一段连接MSN服务器的代码,但是发现怎么给MSN服务器发送命令消息,结果都只有一个,那就是没有响应,随后Socket连接被关闭。
发送消息的代码如下:
public void send(String cmd)
{
try{
DataOutputStream dos = new DataOutputStream(sock_.getOutputStream());
dos.writeUTF(cmd);
}catch(Exception ex)
{
System.out.println("MSNPConnection::send fail, " + ex.getMessage());
}
}
刚开始以为给服务器发送的命令格式错了,于是把所有发送的数据包都截下来分析。在截包中发现一个奇怪的现象,在我发送的每个命令前都多出了两个字节,而且很明显是一个数字,于是开始领悟,莫非是writeUTF在其中搞怪?
翻开JDK的文档,直接搜索writeUTF函数的说明,发现以下文字:
writeUTF
public void writeUTF(String str) throws IOException
- Writes two bytes of length information to the output stream, followed by the Java modified UTF representation of every character in the string。
天啦,果然是被耍了,原来writeUTF会在开头自以为是的加上长度信息。