日期:2014-05-20  浏览次数:20893 次

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就得了。