整理《疯狂java编程》15章
IO流分为输入流(InputStream)和输出流(OutputStream)两类
按流所处理的数据类型又可以分为字节流和字符流(用于处理Unicode字符数据)两类
字节流主要是由 InputStream和OutputStream作为基类,而字符流主要是由 Reader和Writer作为基类的
节点流(低级流) 和
处理流(高级流):
JAVA使用处理流来包装节点流式一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出功能,这就允许Java应用程序采用相同的代码,透明的方式来访问不同输入\输出设备的数据流。所以处理流也叫做包装流
下图说明相关体系:
文件类:(File):
提供文件操作功能(File可以创建,删除等操作对文件或目录,但是要访问文件内容,就必须用到输入/输出流)
1.创建File类对象:
File f;
f = new File("Test.java");
f = new
File("E:\\ex\\","Test.java");
2.将目录也当作文件处理File类中提供了实现目录管理功能的方法:
File path = new
File("E:\\ex\\");
File f = new File(path, "Test.java");
方法:
f.getName():返回文件名
temp.dat
f.getParent():返回文件所在目录名
data
f.getPath():返回文件路径
data\temp.dat
f.getAbsolutePath():返回绝对路径
…\data\temp.dat
f.exists():文件是否存在
f.canWrite(),
f.canRead():文件是否可写、读
f.isFile(),
f.isDirectory():是否为文件或目录
f.lastModified(), f.length(),
f.delete():文件的最后修改日期、长度;删除文件
f.mkdir(),
f.list():创建一个目录;列出目录下所有的文件
几个例子说明:
1 /** 2 * FileInputStream 测试 3 * @ClassName: fileTest_1 4 * @Description: 5 * @author xingle 6 * @date 2014-4-15 下午3:12:54 7 */ 8 public class fileTest_1 { 9 public static void main(String[] str) throws IOException{ 10 File f = new File("E:\\test.txt"); 11 FileInputStream fis = new FileInputStream(f); 12 byte[] buf = new byte[32]; 13 int hasRead = 0; 14 while((hasRead=fis.read(buf))>0){ 15 System.out.println(new String(buf,0,hasRead)); 16 } 17 if(fis!=null){ 18 fis.close(); 19 } 20 } 21 }
1 /** 2 * FileReader 测试 3 * @ClassName: 4 * @Description: 5 * @author xingle 6 * @date 2014-4-15 下午2:24:12 7 */ 8 public class fileTest_2 { 9 public static void main(String[] args) throws IOException { 10 File f = new File("E:\\test.txt"); 11 12 FileReader fr = new FileReader(f); 13 char[] cbuf = new char[32]; 14 int hasRead = 0; 15 try { 16 while((hasRead = fr.read(cbuf))>0){ 17 System.out.println(new String(cbuf, 0, hasRead)); 18 } 19 } catch (IOException e) { 20 e.printStackTrace(); 21 }finally{ 22 if(fr!=null){ 23 fr.close(); 24 } 25 } 26 } 27 }
1 /** 2 * FileOutputStream 测试 3 * @ClassName: fileTest_3 4 * @Description: 把一个文件的所有内容写到另外一个文件中 5 * @author xingle 6 * @date 2014-4-15 下午2:45:25 7 */ 8 public class fileTest_3 { 9 public static void main(String[] args) throws IOException { 10 FileInputStream fis = null; 11 FileOutputStream fos = null; 12 try{ 13 File fi = new File("E:\\test.txt"); 14 fis = new FileInputStream(fi); 15 File fo = new File("E:\\testout.txt"); 16 //覆盖写入 17 fos = new FileOutputStream(fo); 18 //追加写入 19 //fos = new FileOutputStream(fo,true); 20 //判断是否存在该文件 21 if (!fo.exists()) { 22 System.out.println("file is not exist"); 23 fi.createNewFile(); 24 } 25 int hasRead = 0; 26 byte[] buf = new byte[32]; 27 while((hasRead=fis.read(buf))>0){ 28 fos.write(buf, 0, hasRead); 29 } 30 }catch(IOException e){ 31 e.printStackTrace(); 32 }finally{ 33 if(fis!=null){ 34 fis.close(); 35 } 36 if(fos!=null){ 37 fos.close(); 38 } 39 } 40 } 41 }
1 /** 2 * 浏览当前目录下的所有文件和目录 3 * @ClassName: fileTest_4 4 * @Description: 5 * @author xingle 6 * @date 2014-4-15 下午3:31:22 7 */ 8 public class fileTest_4 { 9 public static void main(String[] args){ 10 File f1 = new File(""); 11 String path = f1.getAbsolutePath(); 12 System.out.println("当前路径:"+path); 13 File f = new File(path); 14 File[] fileLs = f.listFiles(); 15 16 for(int i=0;i<fileLs.length;i++){ 17 if(fileLs[i].isDirectory()){ 18 System.out.println( "目录-- " + fileLs[i].getName()); 19 } 20 else{ 21 System.out.println("文件--"+fileLs[i].getName()); 22 } 23 } 24 } 25 }
1 /** 2 * 文件过滤 3 * @ClassName: 打印.txt结尾的文件名 4 * @Description: 5 * @author xingle 6 * @date 2014-4-15 下午4:32:45 7 */ 8 public class fileTest_5 { 9 public static void main(String[] args){ 10 File f = new File("E:\\filetest"); 11 String[] files = f.list(new MyFilter()); 12 for(String name:files){ 13 System.out.println(name); 14 } 15 } 16 } 17 18 class MyFilter implements FilenameFilter{ 19 @Override 20 public boolean accept(File dir, String name) { 21 return name.endsWith(".txt"); 22 } 23 24 }
过滤流—缓冲流