转载

JAVA中的File类与IO流

java文件类以抽象的方式代表文件名和目录路径名.该类主要用于文件和目录的创建,文件的查找和文件的删除等.File对象代表磁盘中实际存在的文件和目录.

1.File的构造方法主要有:

File(File parent,String child)
复制代码

通过给定的父抽象路径名和子路径字符串创建一个新的File实例

File(String pathname)
复制代码

通过将给定路径字符串转换成抽象路径来创建一个新的File实例

File(String parent,String child)
复制代码

通过parent路径名字符串和child路径名字符串来创建一个新的File实例 2.File类中一些方法:

public String getName()  返回此抽象路径名表示的文件或目录的名称
public String getParent()  返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回null
public File getParentFile()  返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回null
public String getPath()将此抽象路径名转换为路径名字字符串
public boolean isAbsolute()  测试此抽象路径名是否为绝对路径名
public String getAbsolutePath()  返回抽象路径名的绝对路径名字符串
复制代码

更多方法可见API文档 注意:File提供的功能都是操作文件外部的能力,没有办法操作文件内部的内容,想要对文件内容进行操作,还需要流,即Stream.

2.IO流-----Stream

一个流可以理解为一个数据的序列.输入流表示从一个源读取数据,输出流表示向一个目标写数据, Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中.

1.流的分类

按照流向:

输入流 输出流

按照操作单元:

字节流:万能流:任何内容都可以转为字节,可以传输文本,图片,音频... 字符流:只能操作 纯文本数据

按照功能:

节点流: 包裹源头,实现基本功能 功能流: 对节点流增强性能,提高效率

2.字节流

先看字节流,字节流分为字节输入流和字节输出流.

  • 字节输入流:InputStream------>抽象类 此抽象类是表示字节输入流的所有类的超类
  • 字节输出流:OutputStream------>抽象类 此抽象类是表示字节输出流的所有类的超类
  • 文件字节输入流:FileInputStream----->从文件系统中的某个文件中获得输入字节
  • 文件字节输出流:FileOutputStream----->输出程序中的字节 流使用完毕,应该关闭.关闭可使用close()方法 写入时,最后应该调用flush()方法刷出流管道中剩余的数据.

下面以一次复制操作为例.对于一个复制操作应该有这样几步:

准备流,即声明且实例化文件字符流对象

读入写出数据,利用read(),write()方法实现读写

刷出,最后把管道中的数据刷出

关闭流,注意应该后打开的先关闭

示例1:

public class Test{
        public static void main(String []args){
            String src="E:/skr.txt";//源文件
            String dest="E:/skr1.txt";//复制后得到的文件
            byteCopy(src,dest);
        }
        //方法重载
        public static void byteCopy(String src,String dest){
	        byteCopy(new File(src),new File(dest));
        }
        //方法重载
        public static void byteCopy(File input,File output) {
        	InputStream in = null;//输入字节流声明
        	OutputStream os = null;//输出字节流声明
        	try {
	        	in = new FileInputStream(input);//多态
	        	os = new FileOutputStream(output);//多态
	        	//定义一个1k的字节数组,一次读取1k的数据
	        	byte[] b = new byte[1024];
	        	//当文件中没有数据时,返回-1
	        	int len=-1;
	        	while(-1!=(len=in.read(b))){//读取
		        	os.write(b,0,len);//写入
	        	}
	        	os.flush();//刷出
            } catch (FileNotFoundException e) {
		        e.printStackTrace();
	        } catch (IOException e) {
	        	e.printStackTrace();
	        } finally {
	            //后打开的流先关闭
	        	try {
		        	if (os != null) {
			        	os.close();
		        	}
		        	if (in != null) {
		    	    	in.close();
		        	}
	           	} catch (IOException e) {
		        	e.printStackTrace();
	        	}
        	}
    	}
    }
复制代码

3.字符流

字符流同样分为字符输入流和字符输出流

字符输入流:Reader--->读取字符流的抽象类

FileReader 用来读取字符文件的便捷类

字符输出流:Writer--->写入字符流的抽象类

FileReader 用来读取字符文件的便捷类

字符流只能操作纯文本的文件.

4.缓冲流

缓冲流是一个功能流,它可以增强功能,提高性能,加快读写效率.

1. 字节缓冲流:

  • BufferedInputStream 字节输入流缓冲流

  • BufferedOutputStream 字节输出流缓冲流

没有新增方法,可以发生多态使用

2. 字符缓冲流

BufferedReader  字符输入流缓冲流  新增方法:String readLine()读取一个文本行

BufferedWriter  字符输出流缓冲流  新增方法:void newLine() 写入一个行分隔符
复制代码

复制代码

3. 缓冲流的实例化与普通节点流的实例化有所不同:

以字节输入缓冲流为例看一下构造方法: BufferedInputStream(InputStream in) 复制代码 可以看到构造方法中传入的是一个字节输入流的对象 即BufferedInputStream的构造方法中传入的不再是文件的抽象路径名字符串或抽象路径名.

3.总结

我们可以利用File类中提供的方法对文件的外部进行操作,但是当我们想操作文件的内容时就需要使用Stream. 在java中有大量而灵活地操作可以进行处理文件. 我们可以选择字节流或者字符流处理文件.当文件较大时,也可以使用缓冲流提高性能,增加读写效率.

原文  https://juejin.im/post/5db9a0596fb9a02081514037
正文到此结束
Loading...