Java IO类的整理

路径的书写

  • 绝对路径:一个完整的路径,以盘符开头,例如F:/aaa.txt。
  • 相对路径:一个简化的路径,不以盘符开头,例如/aaa.txt//b.txt。

1、路径是不区分大小写
2、路径中的文件名称分隔符windows使用反斜杠“\”或者是“/”。

1.File类

1.1File类的作用

File类 主要是描述目录的和文件对象的属性功能,但是不能对文件进行读写操作
File类主要用于文件和目录的创建、查找和删除等操作。

1.2File类的构造方法file类的构造方法

  • 最常用的构造方法还是直接用String写入文件的路径
  • 文件的路径不存在时,在编译期并不报错,也就是说,在构造方法时的不会检验文件的路径是否正确,只会在运行时有FileNotFindException异常
//创建一个文件对象
File file1=new File("f:/Java/文件/169.txt");

1.3对文件及目录属性的常操作

判断操作

 	File file1 = new File ("d:/a.txt")
	"文件是否存在:"+file1.exists();返回boolean值
	"文件是否可读:"+file1.canRead();返回boolean值
	"文件是否可写:"+file1.canWrite();返回boolean值
	"是否是文件:"+file1.isFile();返回boolean值
	"是否是绝对路径:"+file1.isAbsolute();返回boolean值
    "是否是隐藏文件:"+file1.isHidden();返回boolean值
    "是否是文件夹:"+file1.isDirectory();返回boolean值
    

获取操作

	public String getName();获取文件名/目录名
	public long length();获取文件的长度(字节)/目录长度
	public String getAbsolutePath();获取文件的绝对路径
	public String getParent();获取文件的父目录(上一级目录)
	public String getPath();文件/目录构造路径
	public long lastModified();最后一次被修改的时间(结果是最后修改的时间到1970年1月1日00:00:00的毫秒数)
lastModified()的使用配合Data对像来使用

   File f1=new File("Test.java"); 
   System.out.println(new Date(f1.lastModified())); 
   
   //返回的是Wed May 02 21:05:40 CST 2007

目录和文件的创建

public boolean mkdirs();创建指定目录,若上级目录不存在,会一同创建
public boolean mkdir();创建指定目录,若上级目录不存在,目录创建失败

--在File中不能通过调用构造方法来创建文件
public boolean createNewFile();创建指定文件

   //检验文件是否创建完成
	System.out.println(f2.getAbsolutePath()+"是否存在:"+f2.exists());

创建文件时的注意

  • 文件的目录必须是正确的,否则会返回IOException异常
  • 在所创文件的目录下必须保证文件是唯一的,也就是在同类型的文件下文件不能重名。

目录和文件的删除

--删除目录/文件时一定要确保目录/文件下没有内容,否则删除失败
public boolean delete();删除目录/文件

文件的重命名

		//将文件169.txt重新命名为83.txt
		File file1=new File("f:/Java/文件/169.txt");
		File file2=new File("f:/Java/文件/83.txt");
		file1.renameTo(file2);

我们要使这个方法成功必须满足两个条件:
1.file2不存在,也就是file2并没有真的创建
2.file1 存在
满足这两个条件才会成功执行;
如果满足执行条件:先创建一个rname 对应文件,然后将old内容复制到其中,最后将原来的old文件删除;
如果不满足执行条件:上述内容都不会实现;
异常
1.SecurityException - 如果安全管理器存在,并且其 SecurityManager.checkWrite(java.lang.String)方法拒绝对旧的或新的路径名的写入访问
2.NullPointerException - 如果参数 dest是 null

		通过重命名可以实现文件的移动
		File file3=new File("f:/Java/文件/83.txt");
		File file4=new File("f:/Java/83.txt");
		System.out.println(file3.renameTo(file4));
		返回结果是:true

1.file1必须存在,且file2不存在
2.移动后的目录中不可出现类型和命名都一致的文件
3.移动前后文件的命名必须相同

1.4目录的遍历

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
package chapter14;

import java.io.File;

public class TestFileRoots {

	public static void main(String[] args) {
		// 获取根目录
		File[] roots = File.listRoots();
		//遍历输出
		for(int i=0;i<roots.length;i++) {
			System.out.println(roots[i]);
		}
		
		//获取一个指定文件夹下的所有文件名
		File folder = new File("f:/Java");
		//获取文件夹下的文件列表
		File[] files = folder.listFiles();
		//遍历输出
		for(int i=0;i<files.length;i++) {
			System.out.println(files[i]);
		}
	}
}
结果
f:\Java\JDK8.rar
f:\Java\Practice
f:\Java\二级考试
f:\Java\二级考试.zip
f:\Java\图片
f:\Java\图片.zip
f:\Java\文件

listFiles在获取指定目录下的文件或者文件夹时必须满足下面两个条件
1,指定的目录必须存在
2,指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException异常。

2. IO

2.1 IO类的作用

IO是是针对具体文件的操作类,主要是实现文件的输入和输出。

IO的分类(1)

  1. 流向的分类:

不管是输入和输出都是相对于你自己的程序来说的。
- 输出流:实现对文件的写的操作,将内容写入你的文件就是输出。
- 输入流:实现对文件的读的操作,将内容从你的文件读取到现在的程序中来就是输入。
*通常形况下输出和输入是成双成对的。

  1. 文件类型的分类

-字节流:以字节为单位的文件,后缀:.dat等
-字符流:以字符为单位的文件,后缀:.txt等

我们必须明确一点的是,一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
只是字符流文件在输入输出时有多一个编码的过程。文件中保存的本质还是字节。字节文件的小率比字字符文件高。

在这里插入图片描述
比如向字符和字节文件中输入199这个数字

  • 字节流文件:是读取文件内容的类型,再分配空间,将199转换为16进制的c7输出到文件字节流文件中。
  • 字符流文件:将199分成’1’,‘9’,'9’的字符,将各个字符转换成二进制,再为各个字符分配空间,分别输出到字符流文件中。

IO的分类(2)

文件类型对应的父类

输入流输出流
字符流InputWriterOutputWriter
字节流InputStreamOutputStream

2.3 IO的流

除了基本的输入输出流之外:

  • 需要转换—— 转换流 InputStreamReader 、OutputStreamWriter
  • 需要高效—— 缓冲流Bufferedxxx
  • 多个源—— 序列流 SequenceInputStream
  • 对象序列化—— ObjectInputStream、ObjectOutputStream
  • 保证数据的输出形式—— 打印流PrintStream 、Printwriter
  • 操作基本数据,保证字节原样性——DataOutputStream、DataInputStream

文件读写工作的3个步骤(大象与冰箱):

  1. 打开文件的输入流和输出流(打开冰箱)
  2. 读写文件(放入/拿出大象)
  3. 关闭文件(关闭冰箱)

2.4文本文件

在这里插入图片描述

2.4.1(FileWriter)

2.4.1.1 构造方法
		try {
 			//创建一个FileWriter对象
			FileWriter out = new FileWriter("f:/Java/文件/d.txt");
			FileWriter out = new FileWriter("f:/Java/文件/d.txt",true);//追加方式写入
			
			File file1 = new File("f:/Java/文件/d.txt");
			FileWriter out = new FileWriter(file1);
			File file1 = new File("f:/Java/文件/d.txt");
			FileWriter out = new FileWriter(file1,true);//追加方式写入
			}
		catch(IOException e) {
			e.printStackTrace();
		}
  • 指定的文件可以不存在,文件不存在可以自动创建,但是文件的目录必须存在,目录不存在时异常IOException
  • 该语句会产生IOException异常,写的时候要加异常监控,或在方法头抛出异常

true的追加

  • 当没有写true时,每次向文件中写入内容就会覆盖以前的内容
  • 当写了true追加方法时,每次就是在文件的存在的后面继续添加内容,并不会覆盖。
2.4.1.2方法
out.write(",Hello,world!")

*void java.io.Writer.write(String str) throws IOException
只能写入字符,字符串,字符数组。

2.4.2(FileReader)

2.4.2.1构造方法
		try {
			//FileReader file1 = new FileReader("f:/Java/文件/d.txt");
			
			File file1 = new File("f:/Java/文件/d.txt");
			FileReader in = new FileReader(file1);
		}
		catch(IOException e) {
			e.printStackTrace();
		}
  • 指定的文件文件必须存在,文件不存在时异常IOException类下的FileNotFoundException异常。
2.4.2.2方法
	int i=in.read();//返回整形
	while(-1!=i) {
		char c=(char)i;//转换成char型
		System.out.print(c);//输出
		i=in.read();//继续读取
	}
  • public int read() 方法是一个一个字节的读取,当读取到末尾时返回-1,
  • 若存入的是字符’a’,则读取的是97,则需要强转为char
  • 这个语句会产生非运行期的异常IOException

2.4.3缓冲流–高效输出(BufferedWriter)

2.4.3.1构造方法
		try {
			//BufferedWrite只能使用一个write对象做参数
			//创建对象
			FileWriter fw = new FileWriter("f:/Java/文件/e.txt");
			BufferedWriter bw = new BufferedWriter(fw);
			
		}
		catch(IOException e) {
			e.printStackTrace();
		}
  • 用BufferedWrite更高效,但其构造方法只能写入Write其子类的对象
  • 指定的文件可以不存在,文件不存在可以自动创建,但是文件的目录必须存在,目录不存在时异常IOException
  • 想要实现追加,FileWriter fw = new FileWriter(“f:/Java/文件/e.txt”,true);
2.4.3.2方法
		bw.write("序号\t");
		bw.write("姓名\t");
		bw.write("学号");
		
		*void java.io.Writer.write(String str) throws IOException
		只能写入字符,字符串,字符数组。
  • public int read() 方法是一个一个字节的读取,当读取到末尾时返回-1,
  • 若存入的是字符’a’,则读取的是97,则需要强转为char
  • 这个语句会产生非运行期的异常IOException

2.4.4 缓冲流–高效输入(BufferedReader)

2.4.4.1构造方法
		try {
			//打开输入输出流
			FileReader fr = new FileReader("f:/Java/文件/e.txt");
			BufferedReader br = new BufferedReader(fr);
		}
		//异常处理
		catch(FileNotFoundException e) {
			System.out.println("文件不存在!"+e.toString());
		}
		catch(IOException e){
			e.printStackTrace();
		}
	
  • 用BufferedReader更高效,但其构造方法只能写入Write其子类的对象
  • 指定的文件文件必须存在,文件不存在时异常IOException类下的FileNotFoundException异常。
2.4.4.2方法
			//获取各行各列的数值
			String s = br.readLine();//读取文件的一行
			while(s!=null) {//只要能读取到行的内容,就一直执行
				String[] info = s.split("\t");//将列与列用\t分割,分别存入数组info中
				System.out.println(info[0]+" "+info[1]+" "+info[2]);
				s=br.readLine();//读取下一行
			}
  • public String readLine() 方法是直接读取一行,返回String
  • 这个语句会产生非运行期的异常IOException

2.4.5输出各种类型数据( PrinterWriter)

2.4.5.1构造方法
		try {
		    //PrinterWriter只能使用一个write对象做参数
			// 用PrintWriter向文本中输出数据,好处是是能够输入各种类型的数据
			PrintWriter pw = new PrintWriter("f:/Java/文件/e.txt"); 
			//PrintWriter PW = new PrintWriter("路径",true);追加方式写入
		}
		//异常处理
		catch(IOException e){
			e.printStackTrace();
		}
	
  • 用PrinterWriter可以向文本文件中输入各种类型的数据,但其构造方法只能写入Write其子类的对象
  • 指定的文件可以不存在,文件不存在可以自动创建,但是文件的目录必须存在,目录不存在时异常IOException
  • 想要实现追加,FileWriter fw = new FileWriter(“f:/Java/文件/e.txt”,true);
2.4.5.2方法
				Student s1 = new Student("001","孤尽",48);
				Student s2 = new Student("002","承越",38);
				Student s3 = new Student("003","承旭",28);
				
				//编写表头
				pw.print("编号\t");
				pw.print("姓名\t");
				pw.println("年龄");
		
				//调用对象的toString方法,将字符串写入文件中
				pw.println(s1);
				pw.println(s2);
				pw.println(s3);
				
				//写字符串
				pw.print("004");
				pw.print("右旋");
				pw.println(18);
  • print() 和println() 简单的区别是println()光标会移到下一行,类似实现换行功能
  • 可输出的值:
    在这里插入图片描述
  • 这个语句会产生非运行期的异常IOException

2.4.6 输入各种类型数据(Scanner)

2.4.6.1构造方法
		try {
			Scanner input =new Scanner(new File("f:/Java/文件/e.txt"));
		}
		//异常处理
		catch(IOException e){
			e.printStackTrace();
		}
	
  • java.util.Scanner类用来读取基本数据类型和字符串>
  • 指定的文件文件必须存在,文件不存在时异常IOException
2.4.6.2方法
			while (input.hasNext()) {
				String id = input.next();//
				.next()方法能够从指定文件中读取用分隔符分隔的各种类型的数据,
					默认情况下是空格
				String name = input.next();
				int age = input.nextInt();
				//打印输出
				System.out.println(id+" "+name+" "+age);
		}
  • public boolean hasNext() 判断文件中是否还有下一行,如果有,则返回true,没有则返回false。
  • public String next()/ public int nextInt()方法是读取一行中的对应的列。
    在这里插入图片描述
  • 指定的文件可以不存在,文件不存在可以自动创建,但是文件的目录必须存在,目录不存在时异常IOException

2.5二进制文件

在这里插入图片描述

2.5.1(FileOutputStream)

2.5.1.1 构造方法
		try {
 			//创建一个FileWriter对象
			FileOutputStream out = new FileOutputStream("f:/Java/文件/d.dat");
			FileOutputStreamout = new FileOutputStream("f:/Java/文件/d.dat",true);
			//追加方式写入
			
			File file1 = new File("f:/Java/文件/d.dat");
			FileOutputStream out = new FileOutputStream(file1);
			File file1 = new File("f:/Java/文件/d.dat");
			FileOutputStream out = new FileOutputStream(file1,true);//追加方式写入
			}
		catch(IOException e) {
			e.printStackTrace();
		}
  • 指定的文件可以不存在,文件不存在可以自动创建,但是文件的目录必须存在,目录不存在时异常IOException

true的追加

  • 当没有写true时,每次向文件中写入内容就会覆盖以前的内容
  • 当写了true追加方法时,每次就是在文件的存在的后面继续添加内容,并不会覆盖。
2.5.1.2方法
out.write(int i)

*void java.io.FileOutputStream.write(int b) throws IOException
只能写入int型数据。
  • 将i的最低1个字节输出到文件,其他3个字节舍弃。
    *int型数据分配的空间是4个字节

2.5.2(FileInputStream)

2.5.2.1构造方法
		try {
			//FileInputStream fis = new FileInputStream("f:/Java/文件/d.dat");
			
			File file1 = new File("f:/Java/文件/d.dat");
			FileInputStream in = new FileInputStream(file1);
		}
		catch(IOException e) {
			e.printStackTrace();
		}
  • 指定的文件文件必须存在,文件不存在时异常IOException类下的FileNotFoundException异常。
2.5.2.2方法
         int i=in.read();
		 while(i!=-1){//当读到文件的最后一个字节时,返回-1;
			 System.out.println(i);
			 i=in.read();//读取下一个字节
		 }
  • public int read() 方法是一个一个字节的读取,当读取到末尾时返回-1,
  • 这个语句会产生非运行期的异常IOException

2.5.3复制文件

package chapterStream;

import java.io.*;

public class CopyPNG {

	//复制图片文件
	public static void main(String[] args){
		try {
			//创建输入流,读取文件
			FileInputStream in=new FileInputStream("f:/Java/文件/a.png");
			//创建输出流,复制文件
			FileOutputStream out=new FileOutputStream("f:/Java/文件/b.png");
			//读取文件的第一个字节
			int i=in.read();
			//只要能读到字节,就循环
		    while(i!=-1){
				out.write(i);//向输入流中输出字节
				i=in.read();//读取下一个字节
			}
			//关包
			in.close();
			out.close();
			System.out.println("文件复制成功!!!");
		}
		catch(FileNotFoundException e) {//找不到文件的异常处理
			e.printStackTrace();
		}
		catch(IOException e){//异常处理
			e.printStackTrace();
		}
	}

}

2.5.4 字符流到字节流的桥梁(OutputStreamWriter)

2.5.4.1 构造方法
		try {
		    //OutputStreamWriter只能使用一个OutputStream对象做参数
			FileOutputStream fos = new FileOutputStream("f:/Java/文件/utf.dat")
 			OutputStreamWriter out = new OutputStreamWriter(fos);
 			BufferedWriter bw=new BufferedWriter(out);
 			//若不添加字符集,则用默认字符集
 			
			FileOutputStream fos = new FileOutputStream("f:/Java/文件/utf.dat")
 			OutputStreamWriter out = new OutputStreamWriter(fos,"UTF-8");
 			BufferedWriter bw=new BufferedWriter(out);
 			//指定字符集
			}
		catch(IOException e) {
			e.printStackTrace();
		}

为了达到最高的效率,可以将FileOutputStream类内装在BufferedWriter类中

  • OutputStreamWriter是字符流到字节流的桥梁,是字符通过指定的字符集编码成字节,输出到指定文件中
  • 指定的文件可以不存在,文件不存在可以自动创建,但是文件的目录必须存在,目录不存在时异常IOException
    想要实现追加,FileWriter fw = new FileWriter(“f:/Java/文件/e.txt”,true);
2.5.4.2方法
bw.write("hello,world")

*void java.io.Writer.write(String str) throws IOException
只能写入字符串,字符,字符数组,int型。

2.5.5 字节流到字符号流的桥梁(IntputStreamWriter)

2.5.5.1构造方法
		try {
			FileInputStream fis = new FileInputStream("f:/Java/文件/utf.dat")
 			IntputStreamWriter in = new IntputStreamWriter(fis);
 			BufferedReader br = new BufferedReader(in);
 			//若不添加字符集,则用默认字符集
 			
			FileInputStream fos = new FileInputStream("f:/Java/文件/dat.txt")
 			IntputStreamWriter in = new IntputStreamWriter(fis,"UTF-8");
 			BufferedReader br = new BufferedReader(in);
 			//指定字符集
			}
		}
		catch(IOException e) {
			e.printStackTrace();
		}

为了达到最高的效率,可以将FileInputStream类内装在BufferedReader类中

  • InputStreamWriter是字符流到字节流的桥梁,是字节通过指定的字符集编码成字符,输入到程序中.
  • 指定的文件文件必须存在,文件不存在时异常IOException类下的FileNotFoundException异常。
2.5.5.2方法
       String s=in.readLine();
  • public String readLine() 方法是一行的读取。
  • 这个语句会产生非运行期的异常IOException

2.5.6(DateOutputStream)

与FileOutputStream方法不同的是,数据会以分配到的字节空间去输出,并不会舍去字节。

2.5.6.1 构造方法
		try {
			//DateOutputStream只能使用一个OutputStream对象做参数
			FileOutputStream fos = new FileOutputStream("f:/Java/文件/num.dat");
			DataOutputStream out = new DataOutputStream(fos);
			}
		catch(IOException e) {
			e.printStackTrace();
		}
  • DataOutputStream是字符串和基础类型编码成字节,输出到指定文件中
  • 指定的文件可以不存在,文件不存在可以自动创建,但是文件的目录必须存在,目录不存在时异常IOException
    想要实现追加,FileWriter fw = new FileWriter(“f:/Java/文件/e.txt”,true);
2.5.6.2方法
			out.writeUTF("Java");//字符串型数据
			out.writeDouble(52.2);//浮点型数据
			out.writeBoolean(false);//布尔型数据
			out.writeInt(66);//整型数据

           *能写入字符串,字符,字符数组,基本数据类型,布尔值。

2.5.7 (DateInputStream)

DateInputStream的读取思路
因为DateInputStream的输出方式是按分配到的字节空间输出在文件中
而每个数据类型分配到的字节空间各不相同,所以这就便于DateInputStream
通过字节空间去读取数据。

2.5.7.1构造方法
		try {
			FileInputStream fis = new FileInputStream("f:/Java/文件/num.dat");
			DataInputStream in = new DataInputStream(fis);
			}
		}
		catch(IOException e) {
			e.printStackTrace();
		}
  • 指定的文件文件必须存在,文件不存在时异常IOException类下的FileNotFoundException异常。
2.5.7.2方法
			System.out.println(in.readUTF());
			System.out.println(in.readDouble());
			System.out.println(in.readBoolean());
			System.out.println(in.readInt());
			......
  • 向字节文件中读取数据,读取顺序和写入顺序一致
  • public String readUTF()返回字符串
  • 这个语句会产生非运行期的异常IOException

DataInputStream用异常来判断是否读取到文件的最后一行

			try {
				while(true) {
					System.out.print(in.readInt());
				}
			}
			catch (EOFException e) {//如果输入流到达末尾,则异常
				System.out.print("文件到达末尾。");
			}

输出文件中的内容的前提是文件中只有int型数据,因为readInt()和writeInt()要对应

2.5.8 对象输出流(ObjectOutputStream)

2.5.8.1 构造方法
		try {
			//ObjectOutputStream只能使用一个OutputStream对象做参数
			FileOutputStream fos = new FileOutputStream("f:/Java/文件/num.dat");
			ObjectOutputStream oot = new ObjectOutputStream(fos);
			}
		catch(IOException e) {
			e.printStackTrace();
		}
  • ObjectOutputStream是对象输出到指定文件中
  • 指定的文件可以不存在,文件不存在可以自动创建,但是文件的目录必须存在,目录不存在时异常IOException
    想要实现追加,FileWriter fw = new FileWriter(“f:/Java/文件/e.txt”,true);
2.5.8.2方法
		//实例对象
		Student stu = new Student("001","张三",20);
		//向文件中写入
		oot.writeObject(stu);

           *只能写入对象(对象的引用量)

实例化的类必须要有接口Serializable

  • Serializable接口中没有定义抽象方法,也没有定义常量
package chapterStream;

import java.io.Serializable;

public class Student implements Serializable{//类实现implements Serializable接口则可以向文件中写入对象
	//设置私有成员变量
	private String id;
	private String name;
	private int age;
	
	//定义有参的构造方法
	Student (String id,String name,int age){
		this.age=age;
		this.id=id;
		this.name=name;
	}
	
	//重写tostring方法
	public String toString() {
		return id+"\t"+name+"\t"+age;
	}
}

2.5.9 对象输入流(ObjectInputStream)

2.5.9.1构造方法
		try {
			FileInputStream fis = new FileInputStream("f:/Java/文件/num.dat");
			ObjectInputStream oit = new ObjectInputStream(fis);
			}
		}
		catch(IOException e) {
			e.printStackTrace();
		}
  • 指定的文件文件必须存在,文件不存在时异常IOException类下的FileNotFoundException异常。
2.5.9.2方法
		stu = (Student)oit.readObject();//从文件中读取文件,并要强转为student类
  • 这个语句会产生非运行期的异常IOException
  • 在读取对象时会有异常ClassNotFoundException
    **DataInputStream
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值