一 流的基本概念
一个流(Stream)是一个有序的字节序列。当进行输入和输出数据操作时,数据从信息源流向目的地。流中的字节具有严格的顺序,按先进先出的要求操作。因此流式输入/输出(流式I/O)是一种顺序存取方式。
Java中的流式I/O类都在java.io包中。有各种不同的流类来满足不同性质的输入/输出需求。
按数据流向分为:输入/输出
按操作方法分为:字节(0/1)/字符流
字符流:Reader(抽象类) : (实现类)FileReader(普通输入) BufferedReader(高效输入)(缓冲)
Writer : FileWriter(普通输出) BufferedWriter(高效输出)
字节流:InputStream: FileInputStream(普通输入) BufferedInputStream(高效输入)
OutputStream:FileOutputStream(普通输出) BufferedOutnputStream(高效输出)
二 File 文件或文件夹
构造方法:
File(String pathname) //根据字符串形式的路径 File(String parent , String child) // 根据父目录与子目录 Flie(File parent , String child) //父目录是file的对象
成员方法:
创建功能://如果不存在,就创建返回true,否则就不创建,返回false creatNewFile(); //创建文件 使用时需要注意异常:路径可能错误 可用throws在方法名后抛出异常 mkdir 或 mkdirs(); //创建目录(文件夹)mkdir : make directory的缩写 //mkdir 创建单级目录 //mkdirs 创建多级目录(也可以单级目录) 判断功能: isDirectory(); //判断File对象是否为目录(文件夹) isFile(); //判断file对象是否为文件 exists(); //判断file对象是否存在的 获取功能: getAbsolutePath(); //获取绝对路径 绝对路径:以盘符开头的路径是固定死的 例如:D:/1.txt getPath(); //获取相对路径 相对路径:一般指相对于当前项目的路径 例如 1.txt getName(); //获取文件名 list(); //获取指定目录下所有文件(夹)名称数组 listFiles(); //获取指定目录下所有文件(夹)file数组 注意: list() 的返回值是 String[] 字符串数组 在输出时需要使用for 例:String[] name = file2.list(); for(String names: name){ System.out.println(names); } listFiles()的返回值是 file[] File数组 相当于返回了File对象 即可调用file方法 例:File[] files = file2.listFiles(); for (File file : files) { System.out.println(file); }
注意:
- 盘符不区分大小写。
- Java中的 " \ "有特殊作用(被称为转义字符:转义后面一个字符)所以在写路径时要写 “ \\ " 或是 “ / ”。
三 字符流读写文件
字符流读数据--按单个字符读取
创建字符流读文件对象: Reader reader = new FileReader("文件路径"); //Reader为抽象类 不能实例化 调用方法读取数据: int date = reader.read(); //读取一个字符返回该字符代表的整数,若是达到末尾则返回 -1 异常处理: throws IOExpection //也可try catch 关闭资源: reader.close(); 使用while简化 int a = reader.read(); while (a != -1){ System.out.println(a); a = reader.read(); //输出的是Unicode码值 } 注意:reader 每读取一次字符,指针向后移动一位。所以一次while里面只能读一次。
字符流读数据--按字符数组读取
创建字符流读文件对象: Reader reader = new FileReader("文件路径"); 调用方法读取数据 char[] a = new a[]; int len = reader.read(a); //读取字符到数组中,返回读取的有效字符数,读不到有效则返回-1 异常处理: throws IOException 关闭资源: reader.close(); 使用while 简化代码: char[] a = new char[1]; while ((reader.read(a) != -1)){ System.out.print(a); } 可得到全部文本
字符流写数据--按单个字符写入
创建字符流写文件对象: Writer writer = new FileWriter("路径"); 调用方法写入数据: char x = '中'; writer.write(x); 异常处理: throws IOException; 关闭资源: writer.close();
字符流写数据--按字符数组写入
创建字符流写文件对象: Writer writer = new FileWriter("路径"); 调用方法写入数据: char[] chs = {'中' , '国' ,‘好’}; writer.write(chs); 异常处理: throws IOException; 关闭资源: writer.close();
字符流写数据--按字符串写入
创建字符流写文件对象: Writer writer = new FileWriter("路径"); 调用方法写入数据: String s = " " writer.write(s); 异常处理: throws IOException; 关闭资源: writer.close();
注意:使用新对象写入文件后会将原文件内容覆盖
若想要内容不被覆盖,在构造函数时 : Writer writer = new FileWriter("路径" , true); 可实现文件追加,因为默认是false会覆盖
字符流拷贝文件--按单个字符写入
先创建字符流读文件对象: Reader reader = new FileReader("数据源文件的路径"); 再创建字符流写文件对象: Writer writer = new FileWriter(“目的地文件的路径”); 调用方法读取文件: int date = reader.read(); 调用方法写文件: writer.write("date"); //需要while循环 int len = reader.read(); while (len != -1){ writer.write(len); len = reader.read(); } 异常类处理: throws IOExpection; 关闭资源: reader.close(); writer.close(); 核心6步: 1 创建输入流对象,关联数据源文件。 2 创建输出流对象,关联目的地文件。 3 定义变量,记录读取到的内容。 4 循环读取,只要条件满足,就一直读,并将读取到的内容赋值给变量。 5 将读取到的内容,写入目的地文件。 6 资源释放。 注意:当目的地文件不存在时可自动创建。
字符流拷贝文件--按字符数组写入
先创建字符流读文件对象: Reader reader = new FileReader("数据源文件的路径"); 再创建字符流写文件对象: Writer writer = new FiLeWriter(“目的地文件的路径”); 调用方法读取文件: char[] chs = new char[2048]; //长度定义为1024的整数倍 调用方法写文件: int len; while(len = reader.read(chs) != -1){ writer.write(chs , 0 , len); } 异常类处理: throws IOExpection; 关闭资源: reader.close(); writer.close();
四 字符缓冲流读写文件
字符缓冲流拷贝文件的标准代码
先创建字符流读文件对象: Reader reader = new BufferedReader(new FileReader(“数据源文件的路径”)); 再创建字符流写文件对象: Writer writer = new BufferedWriter(new FileWriter(“目的地文件的路径”)); 调用方法读取文件: 调用方法写文件: int len = reader.read(); while (len != -1){ writer.write(len); len = reader.read(); } 异常类处理: throws IOExpection; 关闭资源: reader.close(); writer.close(); 注意:字符缓冲区的大小为16KB,底层按照字符数组读写
字符缓冲流拷贝文件的独有方法:一次读一行
BufferReader: 成员方法: public String readLine(); //一次读取一行并返回读取内容,读不到就返回null BufferWriter: 成员方法: public void newLine(); //根据当前操作系统给出对应的换行符 //使用BufferedReader声明,调用其特有方法 BufferedReader br = new BufferedReader(new FileReader("lib/1.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("lib/3.txt")); String s; while ((s = br.readLine()) != null){ bw.write(s); bw.newLine(); } br.close(); bw.close();
注意:字符流只能拷贝纯文本文件 txt
五 字节流读写文件:
字节流拷贝文件--按单个字节读写:
创建字节流读文件对象: InputStream is = new FileInputStream("文件源路径"); //InputStream为抽象类 不能实例化 创建字节流写文件对象: OutputStream os = new FileOutputStream("目的地路径"); 异常处理: throws IOExpection 使用while循环读写数据 int a; while ((a = is.read()) != -1){ os.write(); } 关闭资源: is.close(); os.close(); 注意:reader 每读取一次字节,指针向后移动一位。所以一次while里面只能读一次。
字节流拷贝文件--按字节数组读写:
创建字节流读文件对象: InputStream is = new FileInputStream("文件源路径"); //InputStream为抽象类 不能实例化 创建字节流写文件对象: OutputStream os = new FileOutputStream("目的地路径"); 异常处理: throws IOExpection 定义字节数组: byte[] b = new byte[1024]; 使用while循环读写数据 int len; while ((len = is.read(b)) != -1){ os.write(b , 0 ,len); } 关闭资源: is.close(); os.close();
六 字节缓冲流读写文件
创建字节流读文件对象: BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件源")); 创建字节流写文件对象: BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("目的地")); 异常处理: throws IOExpection 使用while循环读写数据 int a; while ((a = bis.read()) != -1){ bos.write(a); } 关闭资源: bis.close(); bos.close(); 字节缓冲区大小为8kb,底层按照字节数组读写
总结:拷贝文件txt使用字符流,其他(图片,音频,视频)使用字节流