Java文件操作
2016-04-13 11:23
501 查看
一、File对象(找到指定的文件所在的路径)
File对象不涉及文件读写操作,更贴切的来说File对象的含义应该是FilePath,它指定了文件的路径。
File对象通过mkdir()方法创建一个文件目录,通过createNewFile()来创建文件。
File 的构造方法需要指明文件所在的路径,有绝对路径和相对路径。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/09/62d826a0dc38d3ecefda65d58b4a333c)
相对路径具有很多的优良特性。
二、文件字节输入、输出流
FileInputStream、FileOutputStream,其构造方法均以文件或指定的文件路径为参数,建立指向输入、输出文件的输入流、输出流。
FileInputStream对象通过read方法顺序的读取文件,read()方法可以读单个字节,也可以将其读入到一个byte数组中。
FileOutputStream对象通过write方法以字节为单位向绑定的文件写数据,write方法可以写单个字节,也可以以byte数组为单位向目的文件写。
文件操作要注意即使的close()。
示例:
三、文件字符输入、输出流
文件字节输入、输出流以字节为单位读写数据不能很好的操作Unicode字符,因为有的编码不止占一个字节,要是再使用文件字节输入、输出流的话就会造成“乱码”问题。由此引入文件字符输入、输出流,FileReader、FileWriter,以字符为单位读写数据。
FileReader对象的read方法使用字符数组读数据;FileWriter对象的write方法使用字符数组写数据。
除了像文件字节输入、输出流一样需要及时close()文件外,对于FileWriter对象,还有一个flush()方法。因为Writer(FileWriter继承自Writer)流,write方法将数据首先写入到缓冲区,每当缓冲区溢出时,缓冲区的内容被自动写入到目的地,如果关闭流,缓冲区中的内容会被立刻写入到目的地。流调用flush方法可以立刻冲洗当前缓冲区,即将当前缓冲区的内容写入到目的地。
四、缓冲流
尽管FileReader、FileWriter流以字符为单位读写数据,但是它不能读取一行。
BufferReader、BufferWriter类创建的对象称为缓冲输入、输出流,二者的源和目的地必须分别是FileReader、FileWriter流(即构造参数)。
BufferReader对象通过readLine()方法读取文本行;BufferWriter对象通过write(String s)方法将字符串s写到指定文件。此外,BufferWriter对象通过newLine()方法向目的地文件写入一个换行符。
将BufferReader和BufferWriter称为上层流,把它们指向的字符流称为底层流。Java采用缓存技术将上层流和底层流连接。底层字符输入流首先将数据读入缓存,BufferReader流再从缓存中读取数据;BufferWriter流将数据写入缓存,底层字符输出流会不断地将缓存中的数据写入到目的地。当BufferWriter流调用flush()方法刷新缓存或调用close()方法关闭时,即使缓存没有溢出,底层流也会立刻将缓存的内容写入到目的地。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/09/96cae0f292bc35f662682efd8bc4f1b8)
在编写代码时,只需关闭上层流。那么底层流就会自动关闭。
缓冲流以行为单位读取,具有更强的读写能力,实际应用广。
note :
1.不论是用那种方式去读、写文件,当任务完成后,都应当即使关闭文件,考虑到并发多线程的资源问题。尽管Java中当程序结束后会自动关闭所有打开的流,但在程序中应该显示的关闭哪些被打开的流。
2.文件的读、写操作是可能会抛出异常的,所以对于文件的操作要放到try-catch语句块中进行。另外,一旦try中发现了异常,就会立即转向catch部分。
File对象不涉及文件读写操作,更贴切的来说File对象的含义应该是FilePath,它指定了文件的路径。
File对象通过mkdir()方法创建一个文件目录,通过createNewFile()来创建文件。
File 的构造方法需要指明文件所在的路径,有绝对路径和相对路径。
相对路径具有很多的优良特性。
二、文件字节输入、输出流
FileInputStream、FileOutputStream,其构造方法均以文件或指定的文件路径为参数,建立指向输入、输出文件的输入流、输出流。
FileInputStream对象通过read方法顺序的读取文件,read()方法可以读单个字节,也可以将其读入到一个byte数组中。
FileOutputStream对象通过write方法以字节为单位向绑定的文件写数据,write方法可以写单个字节,也可以以byte数组为单位向目的文件写。
文件操作要注意即使的close()。
示例:
public static void outputFile(File src){ System.out.println("输出"+src.getName()+"文件如下:"); System.out.println("*********************"); int n = -1; byte[] container = new byte[1000]; try { FileInputStream inFile = new FileInputStream(src); while((n=inFile.read(container))!=-1){ String line = new String(container,0,n); System.out.print(line); } inFile.close(); } catch (Exception e) { // TODO: handle exception System.err.println("Wrong Message:"+e.getMessage()); } } //将从文件src中的内容读入到文件des中 public static void src2des(File src,File des){ //中间需要一个转换,用一个"容器",从src中取出一个unit,然后放入到des中 int n = -1; byte[] container = new byte[1000]; try { des.createNewFile(); FileOutputStream outFile = new FileOutputStream(des,false); FileInputStream inFile = new FileInputStream(src); while((n=inFile.read(container))!=-1){ outFile.write(container, 0, n); } inFile.close(); outFile.close(); } catch (Exception e) { // TODO: handle exception System.out.println("Error in src2des:"+e.getMessage()); } }
三、文件字符输入、输出流
文件字节输入、输出流以字节为单位读写数据不能很好的操作Unicode字符,因为有的编码不止占一个字节,要是再使用文件字节输入、输出流的话就会造成“乱码”问题。由此引入文件字符输入、输出流,FileReader、FileWriter,以字符为单位读写数据。
FileReader对象的read方法使用字符数组读数据;FileWriter对象的write方法使用字符数组写数据。
除了像文件字节输入、输出流一样需要及时close()文件外,对于FileWriter对象,还有一个flush()方法。因为Writer(FileWriter继承自Writer)流,write方法将数据首先写入到缓冲区,每当缓冲区溢出时,缓冲区的内容被自动写入到目的地,如果关闭流,缓冲区中的内容会被立刻写入到目的地。流调用flush方法可以立刻冲洗当前缓冲区,即将当前缓冲区的内容写入到目的地。
public static void outputFile(File src){ System.out.println("输出"+src.getName()+"文件如下:"); System.out.println("*********************"); int n = -1; char[] buffer = new char[1000]; try { FileReader inFile = new FileReader(src); while((n=inFile.read(buffer))!=-1){ String line = new String(buffer,0,n); System.out.print(line); } inFile.close(); } catch (Exception e) { // TODO: handle exception System.err.println("Wrong Message:"+e.getMessage()); } } //将从文件src中的内容读入到文件des中 public static void src2des(File src,File des){ //中间需要一个转换,用一个容器,从src中取出一个unit,然后放入到des中 int n = -1; char[] buffer = new char[100]; try { des.createNewFile(); FileWriter outFile = new FileWriter(des,true); FileReader inFile = new FileReader(src); while((n=inFile.read(buffer))!=-1){ outFile.write(buffer, 0, n); } outFile.flush(); inFile.close(); outFile.close(); } catch (Exception e) { // TODO: handle exception System.out.println("Error in src2des:"+e.getMessage()); } }
四、缓冲流
尽管FileReader、FileWriter流以字符为单位读写数据,但是它不能读取一行。
BufferReader、BufferWriter类创建的对象称为缓冲输入、输出流,二者的源和目的地必须分别是FileReader、FileWriter流(即构造参数)。
BufferReader对象通过readLine()方法读取文本行;BufferWriter对象通过write(String s)方法将字符串s写到指定文件。此外,BufferWriter对象通过newLine()方法向目的地文件写入一个换行符。
将BufferReader和BufferWriter称为上层流,把它们指向的字符流称为底层流。Java采用缓存技术将上层流和底层流连接。底层字符输入流首先将数据读入缓存,BufferReader流再从缓存中读取数据;BufferWriter流将数据写入缓存,底层字符输出流会不断地将缓存中的数据写入到目的地。当BufferWriter流调用flush()方法刷新缓存或调用close()方法关闭时,即使缓存没有溢出,底层流也会立刻将缓存的内容写入到目的地。
在编写代码时,只需关闭上层流。那么底层流就会自动关闭。
缓冲流以行为单位读取,具有更强的读写能力,实际应用广。
public static void outputFile(File src){ System.out.println("输出"+src.getName()+"文件如下:"); System.out.println("*********************"); int n = -1; char[] buffer = new char[1000]; try { FileReader inFile = new FileReader(src); while((n=inFile.read(buffer))!=-1){ String line = new String(buffer,0,n); System.out.print(line); } inFile.close(); } catch (Exception e) { // TODO: handle exception System.err.println("Wrong Message:"+e.getMessage()); } } //将从文件src中的内容读入到文件des中 public static void src2des(File src,File des){ //中间需要一个转换,用一个容器,从src中取出一个unit,然后放入到des中 int n = -1; char[] buffer = new char[100]; try { des.createNewFile(); FileWriter outFile = new FileWriter(des,true); FileReader inFile = new FileReader(src); BufferedReader in = new BufferedReader(inFile); BufferedWriter out = new BufferedWriter(outFile); String line = null; while((line=in.readLine())!=null){ out.write(line); out.newLine(); } out.flush(); in.close(); out.close(); } catch (Exception e) { // TODO: handle exception System.out.println("Error in src2des:"+e.getMessage()); } }
note :
1.不论是用那种方式去读、写文件,当任务完成后,都应当即使关闭文件,考虑到并发多线程的资源问题。尽管Java中当程序结束后会自动关闭所有打开的流,但在程序中应该显示的关闭哪些被打开的流。
2.文件的读、写操作是可能会抛出异常的,所以对于文件的操作要放到try-catch语句块中进行。另外,一旦try中发现了异常,就会立即转向catch部分。
相关文章推荐
- [Java] 匿名内部类
- LeetCode Power of Three JAVA
- [Java] 内部类的用法
- Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
- Java中,当表单含有文件上传时,提交数据的如何读取(感谢作者分享)
- java notify() 线程协作
- 用java写简单的web服务器,在宿舍提供视频播放
- org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
- 深入研究java.lang.Runtime类
- Java学习·eclipse换主题颜色
- Spring4.1 cache 应用
- Spring4搭建+REST在Spring上搭建
- eclipse安装svn插件集合(第四种亲测)
- java序列化和反序列化
- 推荐eclipse插件Properties Editor
- 【java项目实战】Servlet详解以及Servlet编写登陆页面(二)
- Java中List集合被大家忽略的一个问题
- java 获取classpath下文件多种方式
- java中删除list重复元素
- java.lang.OutOfMemoryError: GC overhead limit exce