A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 抽烟男孩 于 2013-4-11 15:39 编辑

System.in是字节流,System.out也是字节流但是System.out.println()却可以显示字符?难道PrintStream的此方法先将字节转换成字符?
今本人欲DataInputStream接收数据后显示但均失败,求解!!!
以下为代码(调用此方法输入:张三,5,结果显示乱码)
  1. class FileOperate{
  2. public void readObject() throws IOException{
  3. DataInputStream dis = null ; // 声明数据输入流对象
  4. dis = new DataInputStream(System.in) ; // 实例化数据输入流对象
  5. char temp[] = null ; // 接收姓名
  6. int len = 0 ; // 保存读取数据的个数
  7. char c = 0 ; // '\u0000'
  8. try{
  9. temp = new char[20] ; // 开辟空间
  10. len = 0 ;
  11. while( (c=dis.readChar())!=','){ // 接收内容
  12. System.out.println(c);
  13. temp[len] = c ;
  14. len ++ ; // 读取长度加1
  15. }
  16. String name = new String(temp,0,len) ; // 将字符数组变为String
  17. System.out.print(name);
  18. int score = dis.readInt() ; // 读取
  19. System.out.println(score);
  20. dis.readChar() ; // 读取
  21. }catch(Exception e){}
  22. dis.close() ;
  23. }
  24. }
  25. public class Test2 {
  26. public static void main(String args[]) throws Exception{
  27. FileOperate fop=new FileOperate();
  28. fop.readObject();;
  29. }
  30. }
复制代码
DataInputStream到底如何应用啊!求实例。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

5 个回复

倒序浏览
  1. System.in与System.out内分别含有了BufferedReader和PrintWriter这两个字符流,所以可以输入和输出字符串。而DataInputStream主要用于需要输入或输出int、double,float等数据类型;如下情况就用它:

  2. import java.io.*;

  3. public class TestDataStream {
  4.         public static void main(String[] args) {
  5.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
  6.                 DataOutputStream dos = new DataOutputStream(baos);
  7.                 try {
  8.                         dos.writeDouble(Math.random());
  9.                         dos.writeBoolean(false);

  10.                         ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
  11.                         DataInputStream dis = new DataInputStream(bais);
  12.                         System.out.println(bais.available());
  13.                         System.out.println(dis.readDouble());
  14.                         System.out.println(dis.readBoolean());
  15.                         dis.close();dos.close();
  16.                 }catch(IOException e) {
  17.                         e.printStackTrace();System.exit(-1);
  18.                 }
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
  1. public class DataStreamTest01 {
  2.         public static void main(String[] args) throws IOException
  3.         {
  4.                 // 节点流[直接关联到文件,设备]->过滤流[FilterOutputStream]->数据类型[DataOutputStream]
  5.                 DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("3.txt")));
  6.                 byte b =3;
  7.                 int i = 12;
  8.                 char ch ='a';
  9.                 float f = 3.3f;
  10.                 //写进去
  11.                 dos.writeByte(b);///字符+类型信息,而不是单一的字符值
  12.                 dos.writeInt(i);
  13.                 dos.writeChar(ch);
  14.                 dos.writeFloat(f);
  15.                
  16.                 dos.close();
  17.                 //读取出来
  18.                 DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("3.txt")));
  19.                 //按照写入顺序读取
  20.                 System.out.println(dis.readByte());
  21.                 System.out.println(dis.readInt());
  22.                 System.out.println(dis.readChar());
  23.                 System.out.println(dis.readFloat());
  24.                 dis.close();
  25.         }
  26. }
复制代码
回复 使用道具 举报
本帖最后由 熊永标 于 2013-4-11 11:47 编辑

1、DataInputStream和DataOutputStream是设计用存储基本数据类型的
2、这两个对象分别提供了读取和写入基本数据类型的方法。
如:readInt() ,writeInt(int v)等等,
new DataInputStream(System.in)接收的是键盘输入,根本就不是存入的基本数据类型,所以会失败
而DataInputStream("输入流"),接收的输入流必须是DataOutputStream写入的出流才行

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
DataInputStream 和DataInputStream 操作基本数据类型
你用他操作字符串还不出错
回复 使用道具 举报
遇到问题去查看jdk。


首先
system.out中的定义

out
public static final PrintStream out“标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
对于简单独立的 Java 应用程序,编写一行输出数据的典型方式是:

     System.out.println(data)
请参阅 PrintStream 类中的 println 方法。

这是jdk的解释,也就是说system.out是一个PrintStream对象,而printStrem是一个打印流

为什么一个字节流能输入字符呢?

去查看printStrem的源码得知

public void print(String s) {
        if (s == null) {
            s = "null";
        }
        write(s);
    }
也就是调用了

public void write(String s) {
        write(s, 0, s.length());
    }

这个方法。
而之后又调用了
public void write(String s, int off, int len) {
        try {
            synchronized (lock) {
                ensureOpen();
                out.write(s, off, len);
            }
        }

在这里调用了
Writer out;
的write方法

void write(String str, int off, int len)
          写入字符串的某一部分。


转成了字符流去输出,明白了吗??
多看看源码有好处

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马