java io中的初学者问题,求教!
首先请看个错误程序:
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()的用法注意事项。
谢谢!求教之 ...
------解决方案--------------------你把上面那! 不等于-1去掉就行了啊
------解决方案--------------------readChar()返回来一个char类型的值,你把char类型直接赋值给int类型,会出现类型转换异常
------解决方案-------------------- 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就得了。