文件和IO流

一、文件File类

表示系统内存中的一个文件或目录。

1 创建File对象

//创建File对象
File file1 = new File("D:\\test\\abc.txt");//linux
File file2 = new File("D:/test/abc.txt");//window

File file3 = new File("D:/test/", "abc.txt");//目录+文件名
File file4 = new File("D:/test/");//目录
File file5 = new File(file4, "abc.txt");

2 文件操作

函数名称 作用
length() 文件字节个数
getName() 文件名
lastModified() 查询上次修改的时间的毫秒值
canRead() 文件能否读取
canWrite() 文件能否写入
exits() 文件是否存在
createNewFile() 创建文件到磁盘中,并返回创建结果
delete() 删除文件,并返回删除结果
isFile() 是文件吗,磁盘存在时才能判断
mkdir() 创建单级文件夹
mkdirs() 创建多级文件夹
isDirectory() 是文件夹吗,由文件的创建方法决定
length() 文件字节个数
delete() 删除文件夹,只能删除空文件夹
list() 获取当前目录下的所有文件名字符串数组
listFiles() 获取当前目录下所有的File对象

3 相对路径和绝对路径

绝对路径和物理路径就是从磁盘的根目录开始出发,逐步追加文件夹的名称和文件名称。比如:“D:/test/abc.txt”
相对路径就是从中间某个文件夹开始出发。例如:“/text/abc.txt”

file.getAbsolutePath();//获取绝对路径
file.getCanonicalPath();//获取规范路径名

使用main方法时,文件路径在src路径下,junit运行时,在工程文件目录下面。

二、IO流

1 概念

IO流,即输入输出流,表示数据的传输。

2 分类

  • 流向划分:输入流、输出流。参照物是内存,或者程序。
    • 输入流:从磁盘读取到内存中
    • 输出流:将数据从内存中写入到磁盘
  • 根据传输单位划分:字节流、字符流。
    • 字节流
    • 字符流

3 IO流的超类

名称 作用
InputStream 字节输入流的超类
OutputStream 字节输出流的超类
Reader 字符输入流的超类
Writer 字符输出流的超类

4 FileInputStream/FileOutputStream实现类

  • FileOutputStream文件字节输出流
    输出时,文件若不存在会自动创建。
@Test
public void test(){
	//1.创建对象
	FileOutputStream fos = new FileOutputStream(new File("D:/test/fos.txt"));
	FileOutputStream fos = new FileOutputStream("D:/test/fos.txt");//传文件路径
	FileOutputStream fos = new FileOutputStream("D:/test/fos.txt",true);//追加写入
	//2.写出数据到文件中
	fos.write(97);//向文件中写入一个字符a
	byte[] bytes = "hello中国".getBytes();
	fos.write(bytes);//
	fos.write(bytes,0,3);//hel
	//3.关闭流
	fos.close();
}
  • FileInputStream是文件字节输入流
    文件不存在时进行读取会抛出异常,读到末尾时会返回-1,表示无数据可读。
@Test
public void test(){
	//1.创建对象
	FileInputStream fis = new FileInputStream("D:/test/fis.txt");
	//2.写出数据到文件中
	int b = fis.read();
	System.out.println(b);

	//读取一个字节数组
	byte[] bytes = new byte[4];
	int len = fis.read(bytes);
	System.out.println(len);
	System.out.println(new String(bytes));//字节数组转为字符串
	
	int len = fis.read(bytes);
	System.out.println(len);
	System.out.println(new String(bytes,0,len));//字节数组转为字符串
	
	//3.关闭流
	fos.close();
}
  • 文件字节流复制文件
@Test
public void test1() throw IOException{
	//创建输入流,用于读取文件
	FileInputStream fis = new FileInputStream("D:/test/abc.txt");
	//创建输出流,用于写出数据
	FileOuputStream fos = new FileOutputStream("D:/test/abc2.txt");
	
	//循环读写字节数据
	int b;
	while((b = fis.rad())!= -1){
		//写出数据
		fos.write(b);
	}
	//关闭流
	fos.close();
	fis.close();
}
  • 文件字符输出流
@Test
public void test1() throw IOException{
	//创建字符输出流,用于写出数据
	FileWriter fw = new FileWriter("/test/abc.txt");//相对路径

	//写出字符数据
	fw.write('a');
	char[] chars = "hello您好".toCharArray();
	fw.write(chars,0,5);//写出一个字符数组
	fw.write("中国");//直接写出一个字符串,字符输出流
	
	//关闭流
	fw.close();
}
  • 文件字符输入流
@Test
public void test1() throw IOException{
	//创建字符输入流,读取数据,文件必须存在
	FileReader fr = new FileReader("/test/abc.txt");//相对路径

	//读取字符数据
	fw.write();//读取一个字符,返回-1表示结束
	char[] chars = new char[8];
	int len = fr.read(chars);//读取数据到字符数组chars中
	
	//关闭流
	fr.close();
}
  • 文件字符输入输出流复制文本文件
@Test
public void test1() throw IOException{
	//创建FileReader
	FileReader fr = new FileReader("/test/demo.java");
	//创建FileWriter
	FileWriter fw = new FileWriter("/test/demo2.java");

	//循环读取字符数据
	char[] chars = new char[1024];
	int len;
	while((len = fr.read(chars)) != -1){//读取数据
		fw.write(chars, 0, len);//写出数据
	}
	//关闭流
	fr.close();
}

注意:字符流写入后需要关闭输出流,或者调用flush方法。才能将字符写入到文件中。

你可能感兴趣的:(java)