请看下面这道程序:
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循环语句就是不可行的呢?
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循环语句就是不可行的呢?
2:/* */之间的语句限定死了读取的大小为4Kb,这样如果源文件超过4KB读取和写入的只是一部分文件建议看《Think in Java》第二版
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部分,会对你有比较大的帮助的。
read() 读一个字节,没啥实际意义
write(i)写一个字节,没实际意义
2.
read(buffer)不是按照你的buffer的大小去读的,
buffer的大小只能决定一次读取的最大长度,并不是实际读取的长度
read(buffer)的返回值才是实际读出来的长度,所以你还是要用while循环的
read读取一个字节,可以通过(char)read()将读出的字节转换为字符型.关于doc文件,建议用poi去读取.poi专门是生成及处理word和excel的工具.
返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。下一次调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此数量个字节不会发生阻塞,但读取或跳过的字节可能小于该数。
即是估计的字节数,不是准确的,楼上这样说,是不恰当的。
注释部分应该这样写:byte[] buffer = new byte[4096];
int readLen = fin.read(buffer); // 读入缓冲区的字节总数,有可能比你设置的缓冲区小
fout.write(buffer, 0, readLen); // 把读取到的缓冲区数据写入文件
fin.close();
fout.close();