专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java常用io文件流的基本使用

Java常用io文件流的基本使用

更新时间:2020-06-01 16:15:13 来源:动力节点 浏览1833次

所谓的IO即Input(输入)/Output(输出),当软件与外部资源(例如:网络,数据库,磁盘文件)交互的时候,就会用到IO操作。而在IO操作中,最常用的一种方式就是流,也被称为IO流。IO操作比较复杂,涉及到的系统调用比较多,相对操作内存而言性能很低。然而值得兴奋的是,Java提供了很多实现类以满足不同的使用场景,这样的实现类有很多,我只挑选些在日常编码中经常用到的类进行说明,本节主要介绍和文件操作相关的流,下面一起来瞧瞧吧。

Java常用io文件流的基本使用

FileOutputStream&FileInputStream字节流

File只是能操作文件或文件夹,但是并不能操作文件中的内容,要想操作文件的内容就需要使用文件IO流,其操作文件的内容主要有两种方式:以字节的方式和以字符的方式。而该小节主要讲以字节文件流的形式操作文件内容,以字符文件流的方式操作我留到下一小节进行说明。

在Java中以字节流的形式操作文件内容的类主要是FileOutputStream和FileInputStream。分别是OutputStream(字节输出流)和InputStream(字节输入流)抽象基类的子类。下面以图片的复制来展示下该流的用法。

File sourceFile = new File("sourceFile.jpg"); 
File destFile = new File("destFile.jpg");
FileInputStream fis=null; // 读取源文件的流
FileOutputStream fos = null; // 输出到目标文件的流
try {
 fis = new FileInputStream(sourceFile);
 fos = new FileOutputStream(destFile);
 byte[] bytes= new byte[1024];
 int len = 0;
 while((len=fis.read(bytes))!=-1) {
 fos.write(bytes, 0, len);
 }
}
catch(IOException ex) {}
finally {
 try { fis.close();} catch(IOException ex) {} 
 try { fos.close();} catch(IOException ex) {} 
}

在使用FileOutputStream和FileInputStream的过程中需要注意的地方:

FileInputStream所要操作的文件必须存在,否则就会抛出异常。而FileOutputStream写入的目的文件则不需要存在,当不存在时会被创建,存在的时候会被覆盖,也可以使用FileOutputStream造函数的第二个参数,来实现追加文件内容。

在使用FileInputStream读取字节的时候,当读取到字节的末尾,再继续读取,无论多少次都会返回-1,而返回值len表示本次读取了多少个字节。通常情况下每次读取1024个字节,可以达到空间和时间的平衡。但是具体情况也是需要具体分析的。

字节流是不存在缓冲区的,所以不需要使用flush操作刷新缓冲区,字节的读取和写入都是通过操作系统来实现的。

只要是流就是需要关闭的,无论是否在异常情况下都需要关闭流,防止占用系统资源,导致其他程序无法对该文件进行操作。但是在关闭流的时候也有可能会报异常,所以也需要try...catch。

FileOutputStream和FileInputStream主要用来操作字节表现形式的文件,例如图片,可执行程序等。当然操作字符表现形式的文件也是没有问题的,只不过这么干不规范。

OutputStreamWriter&InputStreamReader

这小节主要讲以字符流的形式操作文件,在Java中对应操作的主要类为OutputStreamWriter和InputStreamReader。有时候又称它们为转换流,具体原因一会在说,先看一个例子。

File sourceFile = new File("sourceFile.txt");
File destFile = new File("destFile.txt");
 
FileInputStream fis= new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(destFile); 
InputStreamReader reader=null;
OutputStreamWriter writer=null;
try {
 reader= new InputStreamReader(fis,"utf-8");
 writer =new OutputStreamWriter(fos,"gbk");
 char[] cbuf =new char[1024];
 int len=0;
 while((len=reader.read(cbuf))!=-1) {
 System.out.println(String.copyValueOf(cbuf,0,len));
 writer.write(cbuf, 0, len);
 }
}
catch(IOException ex) {
 try{reader.close();}catch(IOException ex) { }
 try{writer.close();}catch(IOException ex) { }
}

上述示例主要实现了一个文件的复制,与字节流的使用方式不同的是,字符流的构造函数需要传递字节流和编码格式。这是因为操作文件内容都是以字节的形式来操作的。字符输入流根据编码表对字节流读取的字节转义成字符,同时也说明了传递编码表格式参数的重要性。如果被读取文件编码格式是UTF-8且不传递这个参数,那么这个参数为操作系统的默认编码表(对于Windows而言是GBK),如果默认的编码表与UTF-8不同(与系统编码表格式相同,可不传递此参数),在转义为字符的过程中就会出现问题。假如文件内容为“好”,在UTF-8中对应的字节为-10-20-30。那么就以系统的默认编码表来转义,假如默认为GBK,“好”字的编码为-50-60,由原来3个字节表示汉字,现在变成了2个字节表示汉字,又由于编码表不兼容,所以导致出现乱码。而在使用字符输出流的时候,将字符按照编码表参数转化为字节后再写入对应编码格式的文件中去。如果输出的内容是以追加的方式,那么需要保证前后两个输出文件内容的编码格式一样,否则也会出现乱码。假如之前的输出文件是GBK格式,你使用字符输出流输出的字符格式为UTF8并追加到文件中去,这个时候乱码就产生了。综上过程,也就知道大家为什么又称FileOutputStream和InputStreamReader为转换流了。

传递给字符流的字节流不需要单独的进行关系,在字符流关闭的时候会调用字节流的close()方法。

Java常用io文件流的基本使用

以上就是动力节点java培训机构的小编针对“Java常用io文件流的基本使用”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>