java io中的初学者问题,求教!

weidu23 2013-10-20 09:14:07
首先请看个错误程序:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;


public class te{
public static void main(String[] args) {
try {
DataOutputStream o = new DataOutputStream(new FileOutputStream("f.txt"));
o.writeBytes("love");
DataInputStream in = new DataInputStream(new FileInputStream("f.txt"));
int i ;
int j = 0 ;
byte [] x = new byte[1024] ;
for(j=0 ;(i = in.readChar()) != -1 ; j++){
x[j] = (byte) i ;
}
byte[] dest = new byte[j];
System.arraycopy(x, 0, dest, 0, j);
System.out.println(new String(dest));
} catch (Exception e) {
e.printStackTrace();
}
}
}


这个程序报错,错误地点在16行!也就是for(j=0 ;(i = in.readChar()) != -1 ; j++) ,
可是,我把这句错误的一句改成:for(j=0 ;(i = in.read()) != -1 ; j++),程序就正确了!
显然,这个read() \ readChar()有关!
---------------------
我对readChar()唯一的映像来自Java API:读2个字节获得一个char字符,仅此而已!

---------------
请问:
1、 为什么我把readChar()改成了read()程序就对了?
2、 请科普下readChar()的用法注意事项。
谢谢!求教之 ...
...全文
368 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
teemai 2013-10-20
  • 打赏
  • 举报
回复
readChar: char readChar() throws IOException 读取两个输入字节并返回一个 char 值。设 a 为第一个读取字节,b 为第二个读取字节。返回的值是: (char)((a << 8) | (b & 0xff)) 此方法适用于读取用接口 DataOutput 的 writeChar 方法写入的字节。 返回: 读取的 char 值。 抛出: EOFException - 如果此流在读取所有字节之前到达末尾。 IOException - 如果发生 I/O 错误。 ======================== read: public final int read(byte[] b) throws IOException 从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾 (end of file) 或抛出异常之前,此方法将一直阻塞。 如果 b 为 null,则抛出 NullPointerException。如果 b 的长度为 0,则不读取字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有字节可用,则返回值 -1;否则至少读取一个字节并将其存储到 b 中。 将读取的第一个字节存储到元素 b[0] 中,将下一个字节存储到 b[1] 中,依此类推。读取的字节数至多等于 b 的长度。设 k 为实际读取的字节数;这些字节将存储在从 b[0] 到 b[k-1] 的元素中,b[k] 到 b[b.length-1] 的元素不受影响。 read(b) 方法与以下方法的效果相同: read(b, 0, b.length) 覆盖: 类 FilterInputStream 中的 read 参数: b - 存储读取数据的缓冲区。 返回: 读入缓冲区的字节总数;如果因为已经到达流末尾而没有更多的数据,则返回 -1。 抛出: IOException - 如果不是因为流位于文件末尾而无法读取第一个字节;该流已关闭并且底层输入流在关闭后不支持读取操作;发生其他 I/O 错误。 另请参见: FilterInputStream.in, InputStream.read(byte[], int, int) ========== ps,这样的问题直接看API就得了。
Lenr 2013-10-20
  • 打赏
  • 举报
回复
readChar()返回来一个char类型的值,你把char类型直接赋值给int类型,会出现类型转换异常
a465606179 2013-10-20
  • 打赏
  • 举报
回复
你把上面那! 不等于-1去掉就行了啊
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...

62,620

社区成员

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

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