请看下面这道程序:
import java.io.*;public class Test { public static void main(String[] args) {
int i;
FileInputStream fin = null;
FileOutputStream fout = null;
try {
try {
fin = new FileInputStream("ReadFileExample.doc");
} catch (FileNotFoundException e) {
System.out.println("Input File Not Found");
} try {
fout = new FileOutputStream("CopyFileExample.doc");
} catch (FileNotFoundException e) {
System.out.println("Error Opening Output File");
} while (fin.available() > 0) {
i = fin.read();
System.out.println("i=" + i);
fout.write(i);
} /*
 * byte[] buffer = new byte[4096]; fin.read(buffer);
 * fout.write(buffer); fin.close(); fout.close();
 */ } catch (IOException e) {
System.out.println("File Error");
}
}}1、while循环语句中的read()方法返回的整型值到底代表的是什么,它跟.doc里面的内容是什么关系啊?为什么可以直接用在write(i)方法中?write(i)又是什么意思?2、为什么用/*   */之间的语句代替while循环语句就是不可行的呢?

解决方案 »

  1.   

    1:返回的是每次读取操作的实际读出字节数,write方法是写操作
    2:/*  */之间的语句限定死了读取的大小为4Kb,这样如果源文件超过4KB读取和写入的只是一部分文件建议看《Think in Java》第二版
      

  2.   

    1、read方法是读入内容,你的doc文件内容是按照一个字节一个字节存储的,读入的就是这些字节的内容,也就是第一次读取文件的第一个字节,第二次调用read方法读取文件的第二个字节,依次类推。write方法的作用是将数据写入流中。
    2、因为文件的字节数比4096,也就是4K要大,你如果真的想这样读的话可以这样写:
       
            int len = fin.available();  //获得初始情况下流中数据个数
             byte[] buffer = new byte[len];
            fin.read(buffer);
            fout.write(buffer);
            fin.close();
            fout.close();   建议去阅读一下我BLOG连载的《Java编程那些事儿》的IO部分,会对你有比较大的帮助的。
      

  3.   

    1.
    read() 读一个字节,没啥实际意义
    write(i)写一个字节,没实际意义
    2.
    read(buffer)不是按照你的buffer的大小去读的,
    buffer的大小只能决定一次读取的最大长度,并不是实际读取的长度
    read(buffer)的返回值才是实际读出来的长度,所以你还是要用while循环的
      

  4.   

    补充楼上:
    read读取一个字节,可以通过(char)read()将读出的字节转换为字符型.关于doc文件,建议用poi去读取.poi专门是生成及处理word和excel的工具.
      

  5.   

    以下是我摘自Java Doc上的原话。
    返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。下一次调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此数量个字节不会发生阻塞,但读取或跳过的字节可能小于该数。 
    即是估计的字节数,不是准确的,楼上这样说,是不恰当的。
    注释部分应该这样写:byte[] buffer = new byte[4096]; 
    int readLen = fin.read(buffer); // 读入缓冲区的字节总数,有可能比你设置的缓冲区小
    fout.write(buffer, 0, readLen); // 把读取到的缓冲区数据写入文件
    fin.close(); 
    fout.close();