PrintWriter和PrintStream有什么区别?

nivaini 2005-01-29 04:41:06
CORE JAVA第六版上说,
PrintStream类型的对象在用于Print和Println方法时和PrintWriter表现一样,
但和PrintWriter不一样的是PrintStream 可以通过write(int)和write(byte[])方法来发送原始字节

这就是说PrintStream比PrintWriter还强了?那要PrintWriter有什么用?
...全文
2300 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
shan1119 2005-02-02
  • 打赏
  • 举报
回复
dd
bboonnee 2005-02-02
  • 打赏
  • 举报
回复
PrintStream操作byte,PrintWriter操作Unicode字符,
night__cat 2005-02-02
  • 打赏
  • 举报
回复
PrintStream主要操作byte流,而PrintWriter用来操作字符流。读取文本文件时一般用后者。
singinthesky 2005-02-02
  • 打赏
  • 举报
回复
----------那为什么PrintStream还会乱码呢?
据我理解PrintStream一次读8bit的话,如果遇到汉字(一个汉字占16bit),就可能会出现乱码。
nivaini 2005-02-02
  • 打赏
  • 举报
回复
非常感谢lhj(努力加油) ,我学到了很多东西
lhj 2005-02-02
  • 打赏
  • 举报
回复
那为什么PrintStream还会乱码呢?你的“你好”,按照byte传入,没有经过映射,这样在有些机器上就可能出现乱码。或者说你传入了按照字节编码的“你好”,显示的地方按照unicode来解码,则完全可能出现乱码。
不然你可以试试 不用String来构造一个 “你好”的字节数数组,然后试试看。
lhj 2005-02-02
  • 打赏
  • 举报
回复
×××××××××××××××××××××××××××××××××××××××××××
比如这个:
System.out.println("aa");
和这个:
PrintWriter out = new PrintWriter(System.out);
out.println("aa");
out.flush();

他们的内部实现有什么不同呢?
PrintWriter是一次写16bit,而PrintStream是一次写8bit吗?
那么我在DOS里看到的"aa",第一个不是Unicode,第二个是Unicode???
×××××××××××××××××××××××××××××××××××××××××××

你在dos里面看到aa,都是ascii码,你的源代码首先根据系统的编码,保存成java文件,编译的时候,“aa”会被转码成为UTF格式,就是unicode text fomat。在println后,操作系统的显示会在把UTF转换成本地的字符编码显示给你看。

如果 你把aa换成GBK的“你好”这样编译后,你换到一台繁体中文的电脑上执行后就可以显示繁体的“你好”,这样才显示处java和unicode的优越性,不知楼主是否能明白了。


×××××××××××××××××××××××××××××××××××××××××××

请问Stream和Writer只是处理方式上的不同吗?他们处理的最终结果还是相同的吧?
那为什么PrintStream还会乱码呢?

还有,JAVA内部存储字符是用Unicode,而操作系统不是Unicode,是不是Java的PrintWriter/Stream还有个功能是要把Unicode转换成操作系统的字符格式呢?

就这两点疑问了,谢谢,大家不要给我讲Reader和Writer的原理了,只要直接回答我的问题就可以了,谢谢

×××××××××××××××××××××××××××××××××××××××××××

不同的国家有不用的语言,有不同的字符集,操作系统内部有些就是采用unicode,只不过呈现给最终用户看到的一定是你能够看明白的编码而已,java内部存储的unicode最终要显示就要转化为各个国家的字符集,只要这些字符集能够映射到unicode,就可以在不同的字符集之间转化。最简单的就是26个英文字母,所有字符集都有映射,这样英文到处都不会出现乱码,而中文则在无中文字符集的机器上显示为?号。

lhj 2005-02-02
  • 打赏
  • 举报
回复
×××××××××××××××××××××××××××××××××××××××××××
回复人: nivaini(nivaini) ( ) 信誉:100 2005-1-31 9:28:26 得分: 0

可我还不明白啊,操作系统用的又不是Unicode,总不能把字节流输出给操作系统吧???
×××××××××××××××××××××××××××××××××××××××××××

我不知道所有的操作系统用什么,不过Windows我看过资料,它的API内部都是用Unicode的。

nivaini 2005-02-01
  • 打赏
  • 举报
回复
请问Stream和Writer只是处理方式上的不同吗?他们处理的最终结果还是相同的吧?
那为什么PrintStream还会乱码呢?

还有,JAVA内部存储字符是用Unicode,而操作系统不是Unicode,是不是Java的PrintWriter/Stream还有个功能是要把Unicode转换成操作系统的字符格式呢?

就这两点疑问了,谢谢,大家不要给我讲Reader和Writer的原理了,只要直接回答我的问题就可以了,谢谢
nivaini 2005-02-01
  • 打赏
  • 举报
回复
请问源码哪里可以下啊,我到sun的网站上转了一圈都没找到
sqlink 2005-02-01
  • 打赏
  • 举报
回复
Stream用于二进制文件(非文本)
Writer/Reader用于文本文件(虽然也是二进制,不过是按照一定的字符编码规则,不像前者)

当然Stream也可用于文本,只不过比writer/reader来的麻烦

你如果用过UltraEdit就能更好的理解,用文本模式可以读文本,用二进制(或16进制)模式显示的都是些数字
xitianjile 2005-01-31
  • 打赏
  • 举报
回复
你的满意答案是什么?
是printWriter有什么用??

通过楼上几位的回答已经得出来了。
PrintWriter在操作Unicode时候强于PrintStream.(用printStream处理的时候有可能出乱码)
nivaini 2005-01-31
  • 打赏
  • 举报
回复
非常感谢你们,可是还没有得到另我满意的答案
是不是嫌分少啊,给你们加就是了
zhxujun 2005-01-31
  • 打赏
  • 举报
回复
有源码为什么不去看呢?
loveyousomuch 2005-01-31
  • 打赏
  • 举报
回复
你可以这样理解,
PrintStream是用来操作byte,
PrintWriter是用来操作Unicode,
一般需要处理中文时用PrintWriter好了
nivaini 2005-01-31
  • 打赏
  • 举报
回复
可我还不明白啊,操作系统用的又不是Unicode,总不能把字符流输出给操作系统吧???
前面打错了
nivaini 2005-01-31
  • 打赏
  • 举报
回复
可我还不明白啊,操作系统用的又不是Unicode,总不能把字节流输出给操作系统吧???
nivaini 2005-01-31
  • 打赏
  • 举报
回复
比如这个:
System.out.println("aa");
和这个:
PrintWriter out = new PrintWriter(System.out);
out.println("aa");
out.flush();

他们的内部实现有什么不同呢?
PrintWriter是一次写16bit,而PrintStream是一次写8bit吗?
那么我在DOS里看到的"aa",第一个不是Unicode,第二个是Unicode???
tantj 2005-01-31
  • 打赏
  • 举报
回复
明白
zhangyu6050 2005-01-30
  • 打赏
  • 举报
回复
mark!
加载更多回复(4)
廖雪峰 Java 教程 Java教程 Java快速入门 Java简介 安装JDK 第一个Java程序 Java代码助手 使用IDE 使用IDE练习插件 Java程序基础 Java程序基本结构 变量和数据类型 整数运算 浮点数运算 布尔运算 字符和字符串 数组类型 流程控制 输入和输出 if判断 switch多重选择 while循环 do while循环 for循环 break和continue 数组操作 遍历数组 数组排序 多维数组 命令行参数 面向对象编程 面向对象基础 方法 构造方法 方法重载 继承 多态 抽象类 接口 静态字段和静态方法 包 作用域 classpath和jar 模块 Java核心类 字符串和编码 StringBuilder StringJoiner 包装类型 JavaBean 枚举类 BigInteger BigDecimal 常用工具类 异常处理 Java的异常 捕获异常 抛出异常 自定义异常 使用断言 使用JDK Logging 使用Commons Logging 使用Log4j 使用SLF4J和Logback 反射 Class类 访问字段 调用方法 调用构造方法 获取继承关系 动态代理 注解 使用注解 定义注解 处理注解 泛型 什么是泛型 使用泛型 编写泛型 擦拭法 extends通配符 super通配符 泛型和反射 集合 Java集合简介 使用List 编写equals方法 使用Map 编写equals和hashCode 使用EnumMap 使用TreeMap 使用Properties 使用Set 使用Queue 使用PriorityQueue 使用Deque 使用Stack 使用Iterator 使用Collections IO File对象 InputStream OutputStream Filter模式 操作Zip 读取classpath资源 序列化 Reader Writer PrintStreamPrintWriter 日期与时间 基本概念 Date和Calendar LocalDateTime ZonedDateTime DateTimeFormatter Instant 最佳实践 单元测试 编写JUnit测试 使用Fixture 异常测试 条件测试 参数化测试

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧