Java IO流总结(二)-示例
1.使用文件操作的9大方法完成文件的判断
判断文件或目录是否存在 : exits() 返回值boolean型
* 判断是否是文件: isFile() boolean
* 判断是否是目录: isDiectory() boolean
* 返回此对象表示的文件的相对路径: getPath() String
* 返回此对象表示的文件的绝对路径: getAbsolutePath() String
* 返回此对象表示的文件或目录的名称: getName() String
* 删除此对象指定的文件或目录: delete() boolean
* 创建名称的空文件(不是文件夹): createNewFile() blloean
* 返回文件的长度 单位为字节,如果文件不存在,则返回0L :length() long
1 package cn.filetest; 2 3 import java.io.File; 4 import java.util.Scanner; 5 6 public class TestFileMethods { 7 8 /**案例1,使用文件操作的9大方法完成文件的判断 9 * @param args 10 * 判断文件或目录是否存在 : exits() 返回值boolean型 11 * 判断是否是文件: isFile() boolean 12 * 判断是否是目录: isDiectory() boolean 13 * 返回此对象表示的文件的相对路径: getPath() String 14 * 返回此对象表示的文件的绝对路径: getAbsolutePath() String 15 * 返回此对象表示的文件或目录的名称: getName() String 16 * 删除此对象指定的文件或目录: delete() boolean 17 * 创建名称的空文件(不是文件夹): createNewFile() blloean 18 * 返回文件的长度 单位为字节,如果文件不存在,则返回0L :length() long 19 */ 20 public static void main(String[] args) { 21 try { 22 fileClassMeth(); 23 } catch (Exception e) { 24 e.printStackTrace(); 25 } 26 } 27 28 public static void fileClassMeth() throws Exception{ 29 30 //将异常抛出,由调用者处理!!! 31 //1.实例化对象,指定判断的路径 32 File file = new File("aa\\bb\\3.txt"); 33 //2.判断1.txt是否存在 exits() 34 if(file.exists()) { 35 if(file.isDirectory()) { 36 //判断如果是目录,输出当前路径是文件夹 37 System.out.println("当前路径是文件夹"); 38 } else { 39 System.out.println("当前路径是文件"); 40 System.out.println("当前文件存在"); 41 System.out.println("文件的绝对完整路径:" + file.getAbsolutePath() + file.getName()); 42 System.out.println("文件名为:" + file.getName()); 43 System.out.println("文件的相对路径:" + file.getPath()); 44 System.out.println("文件的上一级目录:" + file.getParent()); 45 System.out.println("文件的长度:" + file.length()); 46 } 47 System.out.println("请按1完成删除操作:"); 48 Scanner input = new Scanner(System.in); 49 if(input.nextInt() ==1) { 50 boolean bool = file.delete(); 51 if(bool) { 52 System.out.println("删除成功"); 53 } 54 } 55 56 } else { 57 System.out.println("当前文件不存在"); 58 //3.当文件不存在,创建文件 59 boolean bool = file.createNewFile(); 60 if(bool) { 61 System.out.println("创建文件成功"); 62 } 63 } 64 65 66 } 67 }
2.字节流的读写操作:
FileInputStream fin = new FileInputStream("D:\\temp\\aa.txt");
byte[] b = new byte[fin.available()]; // fin.available() 可读取的字节数
fin.read(b); // 从内容索引号为1的位置读取2个字符并保存在字节数组b中,读取第一个字节数据并转换为该字节数据的ASCII码
FileOutputStream fo = new FileOutputStream("D:\\temp\\b.txt",true); // true:追加, false :覆盖
fo.write(b);
1 package cn.filetest; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 public class TestFileMthods1 { 8 9 /** 10 * 案例1 字节流的读写操作 字节流的读: int asz = fin.read(); 11 * 12 */ 13 public static void main(String[] args) { 14 fileReaderMehtod1(); // main()方法直接调用本类静态方法 15 } 16 17 public static void fileReaderMehtod1() { 18 FileInputStream fin = null; 19 FileOutputStream fo = null; // 为了能够在该静态方法任何位置访问,放在try语句外面 20 try { 21 // 1.实例化输入流,指向 1.txt文件,该文件必须事先存在!否则抛出fileNotFoundException 22 fin = new FileInputStream("D:\\temp\\aa.txt"); 23 /*FileInputStream类的构造方法FileInputStream(String name) 24 * 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定 */ 25 System.out.println("可读取字节个数为:" + fin.available()); // 2.定义一个字节数组(中转数组) 26 byte[] b = new byte[fin.available()]; // fin.available() 可读取的字节数 27 // 3.从输入流指向的地址1.txt中读取字节,存储在字节数组中 28 // 读取一个字节到字节数组b中;fin.read()则是读取第一个字节数据并转换为该字节数据的ASCII码 29 fin.read(b); // 从内容索引号为1的位置读取2个字符并保存在字节数组b中 30 // 4.输出每个字节,输出结果是字母对应的ASCII码!!!!!fin.read(b)返回的是int类型!!!但写入的文件中会正常显示,而不是显示ASCII码 31 for (byte c : b) { 32 System.out.print(c + "-" + (char) c + "\n"); 33 } 34 // 5.将字节输出到指定的路径下: 35 fo = new FileOutputStream("D:\\temp\\b.txt",true); // true:追加, false :覆盖 36 fo.write(b);// 将字符数组b中的字节写入2.txt中 37 System.out.println("\n写入成功"); 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } finally {// 6.关闭输入输出流 41 try { 42 if (fo != null) { 43 fo.close(); 44 } 45 if (fin != null) { 46 fin.close(); 47 } 48 } catch (IOException e) { 49 e.printStackTrace(); 50 } 51 52 } 53 } 54 55 }
3.BufferedReader 、 BufferedWriter、 FileReader、FileWriter
(1)BufferedReader类是Reader类的子类,它与FileReader类的区别在于BufferedReader带有缓冲区,可以先把一批数据读到缓冲区,接下来的读操作都是从缓冲区内获取数据,避免每次都从数据源读取数据进行字符换货,从而提高读取操作的效率:
BufferedReader br2 = new BufferedReader(new FileReader(new File("D:\\temp\\aa.txt")));
String line = br.readLine(); // BufferedReader类的readLine()方法返回一个字符串!!!每执行该语句一次,读取一行的内容
(2)BufferedWriter类把一批数据写到缓冲区,当缓冲区写满时,再把缓冲区的数据写到字符输出流中,可以避免每次都执行物理写操作,提高输入输出操作的效率
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("D:\\temp\\2.txt")));
bw.write("ddd");
bw.flush(); // 刷新缓冲区写入
1 package cn.filetest; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileNotFoundException; 7 import java.io.FileReader; 8 import java.io.FileWriter; 9 import java.io.IOException; 10 import java.io.Reader; 11 import java.io.Writer; 12 13 public class TestFileMethod2 { 14 15 /** 16 * BufferedReader 17 * BufferedWriter 18 * FileReader 19 * @param args 20 */ 21 public static void main(String[] args) { 22 charReader(); 23 BufReader(); 24 charWriter(); 25 } 26 27 /** 28 * 字符流的写(写入磁盘上的文件中) 29 */ 30 public static void charWriter() { 31 // 1.定义一个写入接口变量,将其子类FileWriter对象实例化 32 Writer wr = null; 33 BufferedWriter bw = null; 34 // 2.实例化一个文件写入类的子类 35 try { 36 File fi = new File("D:\\temp\\2.txt"); 37 wr = new FileWriter(fi); // 创建一个FileWriter对象; 写入目的源为2.txt 38 bw = new BufferedWriter(wr); // 创建一个BufferedWriter对象 39 // 3.写入的内容 40 wr.write(97); // 将AISIC码值为97的字符(a)写入2.txt 41 wr.write("你好"); 42 wr.write(48);// 写入0 43 bw.write("ddd"); 44 char[] zf = { 'a', 'b', '1' }; 45 wr.write(zf); // 写入字符数组 46 bw.flush(); // 刷新缓冲区,才能写入 47 System.out.println("写入成功"); 48 } catch (IOException e) { 49 e.printStackTrace(); 50 } finally { 51 if (wr != null) { 52 try { 53 wr.close();// 关闭流 54 } catch (IOException e) { 55 e.printStackTrace(); 56 } 57 } 58 } 59 60 } 61 62 /** 63 * BufferedReader 64 */ 65 public static void BufReader() { 66 // 1.导入IO包 67 // 2.定义Reader接口的引用变量,只能实例化其子类对象FileReader 68 Reader reader = null; 69 BufferedReader br = null; 70 try { 71 // 3.实例化读取器 72 File fi = new File("D:\\temp\\aa.txt"); 73 reader = new FileReader(fi); 74 // 创建一个使用默认大小输入缓冲区的缓冲字符输入流对象br,将reader读取到的内容放在该缓冲区对象中。 75 br = new BufferedReader(reader); // 使用字符流类BufferedReader和FileReader读取文本文件 76 // 4.字符流,需要存储在一个字符数组中,定义一个字符数组 77 String line = br.readLine(); // BufferedReader类的readLine()方法返回一个字符串!!!每执行该语句一次,读取一行的内容 78 while (line != null) { 79 System.out.println("line:" + line); 80 line = br.readLine(); // 每执行该语句一次,读取一行的内容 81 } 82 } catch (Exception e) { 83 e.printStackTrace(); 84 } finally { 85 try { 86 if (reader != null) { 87 reader.close(); 88 } 89 if (br != null) { 90 br.close(); 91 } 92 } catch (IOException e) { 93 e.printStackTrace(); 94 } 95 } 96 97 } 98 99 /** 100 * 字符流的读:FileReader 101 */ 102 public static void charReader() { 103 // 1.导入IO包 104 // 2.定义Reader接口的引用变量,只能实例化其子类对象FileReader 105 Reader reader = null; 106 StringBuffer sbu = new StringBuffer();// 存放到StringBuffer里面 107 try { 108 // 3.实例化读取器 109 File fi = new File("D:\\temp\\aa.txt"); 110 reader = new FileReader(fi); 111 // 4.字符流,需要存储在一个字符数组中,定义一个字符数组 112 char[] ch = new char[(int) fi.length() - 2]; 113 // 5.读取字符到字符数组中 114 reader.read(ch); 115 sbu.append(ch);// 追加 116 System.out.println("追加后的字符串为:" + sbu); 117 } catch (Exception e) { 118 e.printStackTrace(); 119 } finally { 120 try { 121 if (reader != null) { 122 reader.close(); 123 } 124 } catch (IOException e) { 125 e.printStackTrace(); 126 } 127 } 128 129 } 130 131 }
4.二进制文件读写 : DataInputStream、DataOutputStream
1 package cn.filetest; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 9 public class TestFileMethods3 { 10 11 /** 12 * @param args 13 */ 14 public static void main(String[] args) { 15 dataFileMethod(); 16 } 17 18 public static void dataFileMethod() { 19 // 1、实例化二进制输入流 20 FileInputStream fis = null; 21 DataInputStream dts = null; 22 // 2、实例化文件和二进制输出流 23 FileOutputStream fou = null; 24 DataOutputStream dos = null; 25 // 3、实例化对象 26 try { 27 fis = new FileInputStream("D:\\java\\Animal.class"); 28 dts = new DataInputStream(fis); 29 30 fou = new FileOutputStream("d:/java/aaa.class"); 31 dos = new DataOutputStream(fou); 32 // 4、读取并写入 33 int temp; 34 while ((temp = dts.read()) != -1) { 35 dos.write(temp);// 把每次读取的二进制数据循环写入到文件中 36 } 37 } catch (Exception e) { 38 e.printStackTrace(); 39 } finally { 40 try { 41 if (dts != null) { 42 dts.close(); // 关闭输入流 43 } 44 if (dos != null) { 45 dos.close(); // 关闭输出流 46 } 47 if (fis != null) { 48 fis.close(); 49 } 50 if (fou != null) { 51 fou.close(); 52 } 53 } catch (IOException e) { 54 e.printStackTrace(); 55 } 56 } 57 58 } 59 }