1、IO流:用来处理设备之间的数据传输(文件复制,上传文件和下载文件)
2、IO流分类:
(1)输出流(FileWriter): A、往文件中写数据,传递一个文件名称 a、构造方法:FileWriter(String fileName) b、成员方法:void write(String str);void fiush();void close() B、输出流写数据的步骤: a、创建输出流对象;(调用系统资源创建了一个文件;创建输出流对象;把输出流对象指向文件) b、调用输出流对象的写数据的方法; c、释放资源 C、FileWriter写数据的方法: a、void write(String str):写一个字符串数据 b、void write(String str,int index,int len):写一个字符串中的一部分数据 c、void write(int ch):写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值,如'a',97 d、void write(char[ ] chs):写一个字符数组数据 e、void write(char[ ] chs,int index,int len):写一个字符数组数据的一部分数据 例: package com.itheima; import java.io.FileWriter; import java.io.IOException; public class FileWriterTest { public static void main(String[] args) throws IOException { FileWriter fw=new FileWriter("b.txt"); //void write(String str):写一个字符串数据 fw.write("abcde"); //void write(String str,int index,int len):写一个字符串中的一部分数据 fw.write("abcde",0,5); //void write(int ch):写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值,如'a',97 fw.write('a'); fw.write(97); //void write(char[] chs):写一个字符数组数据 char[] chs={'a','b','c','d','e'}; fw.write(chs); //void write(char[] chs,int index,int len):写一个字符数组数据的一部分数据 fw.write(chs,2,3); //释放资源 fw.close(); } } 注意: a、相对路径:相对当前项目而言的,在项目的根目录下(例:a.txt) b、绝对路径:以盘符开始的路径(例:d:\\ a.txt)(2)输入流(FileReader): A、往文件中读数据到控制台,传递一个文件名称 a、构造方法: FileReader(String fileName) b、成员方法:int read();int read(char[ ] cbuf):一次读一个字符数组的数据,返回的是实际读取字符的个数 例: package com.itheima; import java.io.FileReader; import java.io.IOException; public class FileReaderDemo2 { public static void main(String[] args) throws IOException { //创建输入流对象 FileReader fr=new FileReader("fr2.txt"); //调用输入流对象的读数据方法 //int read(char[] cbuf):一次读一个字符数组的数据,返回的是实际读取字符的个数 /* * char[] chs=new char[5]; * //第一次读数据 * int len=fr.read(chs); * System.out.println("len:"+len); * System.out.println(new String(chs,0,len)); * //第二次读数据 * len=fr.read(chs); * System.out.println("len:"+len); * System.out.println(new String(chs,0,len)); * //第三次读数据 * len=fr.read(chs); * System.out.println("len:"+len); * System.out.println(new String(chs,0,len)); */ //char[] chs=new char[5]; char[] chs=new char[1024];//这里可以是1024及其整数倍 int len; //1、fr.read(chs);//2、len=fr.read(chs); //3、len!=-1 while((len=fr.read(chs))!=-1){ System.out.println(new String(chs,0,len)); } //释放资源 fr.close(); } } B、输入流读数据的步骤: a、创建输入流对象 b、调用输入流对象的读数据的方法 c、释放资源 注意: (1)读数据首先要看文件是否存在,如果报错java.io.FileNotFoundException: fr.txt (系统找不到指定的文件),则在该项目下创建一个file文件 (2)读数据/写数据都要导入相应的包,并抛出异常 *close()和flush()方法的区别: (1)flush():刷新缓冲区,流对象还可以继续使用; (2)close():先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用了
3、实现数据的换行:
(1)windows:\r\n; (2)linux:\n; (3)mac:\r *数据的追加写入:FileWriter(String fileName,boolean append)
4、输入/输出缓冲流:
(1)BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供各个字符、数组和字符串的高效写入 (2)BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现各个字符、数组和行的高效读取 (3)缓冲流读取数据的两种方式: a、一次读写一个字符: 例: int ch; while((ch=br.read())!=-1) { System.out.print((char)ch); } b、一次读写一个字符数组: 例: char[] chs=new char[1024]; int len; while((len=br.read(chs))!=-1) { System.out.print(new String (chs,0,len)); } 注意:在创建一个输出缓冲流对象时,后面一定要记得加new FileWriter,如:BufferedWriter bw=new BufferedWriter(new FileWriter("bw.txt"))
5、缓冲流的特殊功能:
(1)BufferedWriter void newLine():写一个换行符,这个换行符由系统决定 (2)BufferedReader String readLine():一次读取一行数据,但不读取换行符
6、复制文本文件的5种案例:
package com.itheima; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyFileDemo { public static void main(String[] args) throws IOException { //创建输入流对象 /* * FileReader fr=new FileReader("FileWriterDemo.java"); //创建输出流对象 FileWriter * fw=new FileWriter("Copy.java"); //一次读写一个字符数据 int ch; * while((ch=fr.read())!=-1){ fw.write(ch); } * * //一次读写一个字符数组 char[] chs=new char[1024]; int len; * while((len=fr.read(chs))!=-1){ fw.write(chs,0,len); } * * //释放资源 fw.close(); fr.close(); } } */ /* * method1("FileWriterDemo.java","Copy.java");//需要修改5个地方 * method2("FileWriterDemo.java","Copy.java"); * method3("FileWriterDemo.java","Copy.java"); * method4("FileWriterDemo.java","Copy.java"); * method5("FileWriterDemo.java","Copy.java"); */ String srcFileName="FileWriterDemo.java"; String destFileName="Copy.java"; method1(srcFileName,destFileName);//只需要修改一个地方 method2(srcFileName,destFileName); method3(srcFileName,destFileName); method4(srcFileName,destFileName); method5(srcFileName,destFileName); } //缓冲流:一次读写一个字符串 public static void method5(String srcFileName,String destFileName) throws IOException { //创建输入缓冲流对象 BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ; //创建输出缓冲流对象 BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ; //一次读写一个字符串 String line; //1、br.readLine() //2、line=br.readLine() //3、line!=null while((line=br.readLine())!=null) { bw.write(line); bw.newLine(); bw.flush(); } //释放资源 bw.close(); br.close(); } //缓冲流:一次读写一个字符数组 public static void method4(String srcFileName,String destFileName) throws IOException { //创建输入缓冲流对象 BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ; //创建输出缓冲流对象 BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ; //一次读写一个字符数组 char[] chs=new char[1024]; int len; while((len=br.read(chs))!=-1){ bw.write(chs,0,len); } //释放资源 bw.close(); br.close(); } //缓冲流:一次读写一个字符 public static void method3(String srcFileName,String destFileName) throws IOException { //创建输入缓冲流对象 BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ; //创建输出缓冲流对象 BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ; //一次读写一个字符 int ch; while((ch=br.read())!=-1){ bw.write(ch); } //释放资源 bw.close(); br.close(); } //基本流:一次读写一个字符数组 public static void method2(String srcFileName,String destFileName) throws IOException { //创建输入流对象 FileReader fr=new FileReader (srcFileName); //创建输出流对象 FileWriter fw=new FileWriter(destFileName); //一次读写一个字符数组 char[] chs=new char[1024]; int len; while((len=fr.read(chs))!=-1){ fw.write(chs,0,len); } //释放资源 fw.close(); fr.close(); } //基本流:一次读写一个字符 public static void method1(String srcFileName,String destFileName) throws IOException { //创建输入流对象 FileReader fr=new FileReader (srcFileName); //创建输出流对象 FileWriter fw=new FileWriter(destFileName); //一次读写一个字符 int ch; while((ch=fr.read())!=-1){ fw.write(ch); } //释放资源 fw.close(); fr.close();}
}