Java IO 之 FileReader FileWriter 实现字符文件的复制(处理FileWriter新建文件失败的问题)
2016-11-23 09:33
911 查看
在使用FileWriter创建目标文件的时候,发现FileWriter竟然没有自动生成文件,后来自己测试一番,发现要在目录上加上斜杠即“/”,才能自动生成。
FileReader fw = new FileWriter("e:/MyAssetJob.txt");//这个就可以在e盘目录下正常生成文件
FileReader fw = new FileWriter("e:MyAssetJob.txt");//这个就不会在e盘目录下生成文件
也许是机缘巧合,我在d或者f或c盘的时候,代码是正常的,文件可以自动生成,但就是e盘就是不生成文件,我就尴尬了。
不信的可以自己测试下,也许是我电脑环境问题呢。
我又找了个电脑,测试也是cdf盘都可以自动生成文件,但是就是e盘新建失败。。。。
为什么使用缓冲区?
测试代码方法2,就是未使用缓冲区,读一个字符,就写一个字符。那么对硬盘结构有大概了解,就像老式的留声机吧,电影里都见过吧,有个磁头,在下面的大圆盘这读到一个字符,然后转半圈,然后再把读到的字符,写到大圆盘的另一个地方。这么来回的浪费时间。效率极低。
使用缓冲区,就可以先读很多,然后一起写过去。这么就节约时间。效率就提高了。
以下是复制一个字符文件的代码实现。
对比以下2种方法的差别。
忽然发现,刚刚的 fw = new FileWriter("e:MyAssetJob.txt"); 这个文件竟然创建在项目的根目录下。不是在e盘根目录下。具体如下图:
然后我debug,跟踪了一下。fw的path确实没有发生变化。
这我就看不懂了,为什么不加斜杠,这个文件会被复制到项目的跟目录下,而不是e盘的根目录下呢?难道e代表的是environment的意思?瞎猜的,不知道。。。
FileReader fw = new FileWriter("e:/MyAssetJob.txt");//这个就可以在e盘目录下正常生成文件
FileReader fw = new FileWriter("e:MyAssetJob.txt");//这个就不会在e盘目录下生成文件
也许是机缘巧合,我在d或者f或c盘的时候,代码是正常的,文件可以自动生成,但就是e盘就是不生成文件,我就尴尬了。
不信的可以自己测试下,也许是我电脑环境问题呢。
我又找了个电脑,测试也是cdf盘都可以自动生成文件,但是就是e盘新建失败。。。。
为什么使用缓冲区?
测试代码方法2,就是未使用缓冲区,读一个字符,就写一个字符。那么对硬盘结构有大概了解,就像老式的留声机吧,电影里都见过吧,有个磁头,在下面的大圆盘这读到一个字符,然后转半圈,然后再把读到的字符,写到大圆盘的另一个地方。这么来回的浪费时间。效率极低。
使用缓冲区,就可以先读很多,然后一起写过去。这么就节约时间。效率就提高了。
以下是复制一个字符文件的代码实现。
对比以下2种方法的差别。
package com.lxk.FileTest; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 复制文件:先从硬盘读到内存,在写到硬盘 */ class CopyText { public static void main(String[] args) throws IOException { fileCopyRightWay(); } /** * 用缓冲区读写,来提升读写效率。 */ private static void fileCopyRightWay() { FileWriter fw = null; FileReader fr = null; try { fr = new FileReader("D:MyAssetJob.java");//读 fw = new FileWriter("e:/MyAssetJob.txt");//写 char[] buf = new char[1024];//缓冲区 int len; while ((len = fr.read(buf)) != -1) { fw.write(buf, 0, len);//读几个写几个 } } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (fr != null) { try { fr.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } if (fw != null) { try { fw.flush(); fw.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } /** * 未用缓冲区进行读写,读一个字符就写一个字符。 */ public static void fileCopyWrongWay() throws IOException { //创建目的地。 FileWriter fw = new FileWriter("D:MyAssetJob.java"); //与已有文件关联。 FileReader fr = new FileReader("E:/MyAssetJob.java"); int ch; while ((ch = fr.read()) != -1) { fw.write(ch); } fw.close(); fr.close(); } }
忽然发现,刚刚的 fw = new FileWriter("e:MyAssetJob.txt"); 这个文件竟然创建在项目的根目录下。不是在e盘根目录下。具体如下图:
然后我debug,跟踪了一下。fw的path确实没有发生变化。
这我就看不懂了,为什么不加斜杠,这个文件会被复制到项目的跟目录下,而不是e盘的根目录下呢?难道e代表的是environment的意思?瞎猜的,不知道。。。
相关文章推荐
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
- Java 字符流实现文件读写操作(FileReader-FileWriter)
- JAVA基础再回首(二十二)——转换流概述及用法、简化写法FileWriter和 FileReader、字符缓冲流及特殊用法、字节流字符流复制文件方法总结
- 【Java.IO】I/O 字节 <-> 字符转换流 —— InputStreamReader,OutputStreamWriter(FileReader,FileWriter)
- Java 字符流实现文件读写操作(FileReader-FileWriter)
- FileReader和FileWriter字符流实现文件复制
- java 字符流实现文件读写操作(FileReader-FileWriter)
- Java day10 IO文件复制 FileReader,FileWriter
- 字符流FileWriter,FileReader、缓冲区,BufferReader,BufferWriter,IO的简单异常处理
- IO(FileWriter/FileReader)字符流:文件的写入、续写、读
- Java文件字节输入流(FileInputSream)文件字节输出流(OutputStream),字符输入输出流(FileReader/FileWriter)
- Java笔记之io——递归创建与删除多层文件夹,字符流实现文件复制
- Java IO 之 BufferedReader BufferedWriter 通过缓冲区实现字符文本文件的复制
- Java中文件字符流FileReader和FileWriter小结
- Java中IO字符流FileReader,FileWriter,缓冲流BufferedReader,BufferedWriter流,随机流
- Java基础之IO流中使用FileWriter和FileReader实现拷贝文件
- Java IO中的FileReader 和 FileWriter读写文件,和创建多级文件夹
- Java——InputStreamReader&OutputStreamWriter字符流实现文本文件复制
- 【Java.IO】I/O 字符处理流 - 之 - 内存(字符数组)操作流 - CharArrayReader, CharArrayWriter