既然LZ梳理IO流对象,这里我也学习学习,补通java文件流读写文件需要注意的几点....
1.Reader/Writer 读写二进制文件有问题 下面我写个代码示例下- <div class="blockcode"><blockquote>public void copy{
- File src = new File("d:"+File.separator+"a.txt");
- File dst = new File("d:"+File.separator+"b.txt");
- BufferedReader in = null;
- BufferedWriter out = null;
- try {
- in = new BufferedReader(new FileReader(src));
- out = new BufferedWriter(new FileWriter(dst));
- String line = null;
- while((line = in.readLine()) != null) { // 一行一行的读取文件a.txt
- out.write(line+"/r/n"); //把读取的数据写入到b.txt
- } // 问题就这这里,需要注意,若文件a.txt 是ASCII编码格式,则内容能够正确读取,若文件是二进制,读写后的文件与读写前的文件
- }catch (Exception e) { // 有很大的区别,我把 readLine() 改写 read(char[]) 仍然不能正确读写二进制文件,下面又是需要注意的几点,看代码实例
- e.printStackTrace();
- }finally {
- if(in != null) {
- try {
- in.close(); //关闭流
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- if(out != null) {
- try {
- out.close(); //关闭流
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
复制代码 2. read[byte[] b,int offset,int length] ,注意offset 不是指全文件的全文,是字节数组b的偏移量,相当于c语言的文件指针
现在晓得Reader/Writer不能读取二进制文件,Reader/Writer是字符流,只能用BufferInputStream/BufferOutputStream
上面的代码改了 一下,请看....- public void copy{
- File src = new File("d:"+File.separator+"a.txt");
- File dst = new File("d:"+File.separator+"b.txt");
- BufferedInputStream in = null;
- BufferedOutStream out = null;
- try {
- in = new BufferedInputStream(new FileReader(src));
- out = new BufferedOutputStream(new FileWriter(dst));
- byte[] b=new byte[1024];
- int offset=0;
- int length=-1;
- while((length=in.read(b,offset,1024))!=-1) { // 一行一行的读取文件a.txt,每次读取1024字节,然后写入1024字节
复制代码 3. 在用length=(read,b,0,1024) 读取数据时候,应该使用write(b,0,length)来写最好 上面修改部分代码
int len=-1;
byte[] b=new byte[10];
while((len=in.read(b))!=-1){
out.wirte(b,0,len);
}
4. flush() 和 close
写入缓冲区后,很多内容停留在内存里,而不是在文件里,数据有可能丢失,再用close()中调用flush(),文件一旦写完后关闭文件流close().
|