Java 之 I/O 系列 目录
整理《疯狂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 }
过滤流—缓冲流
类BufferedInputStream和BufferedOutputStream继承FilterInputStream和FilterOutputStream,实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高该I/O流的读取效率,在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。
在读写的同时对数据缓存,这样避免每次读写数据都要进行实际的物理读写操作,在用BufferdOutputStream输出时,数据先输入缓冲区,当缓冲区满的时再写入连接的输出流,可以调用flush()来清空缓冲区。
1 /** 2 * 文件缓冲流测试 3 * @ClassName: fileTest_6 4 * @Description: 5 * @author xingle 6 * @date 2014-4-17 上午8:34:54 7 */ 8 public class fileTest_6 { 9 public static void main(String[] args){ 10 try{ 11 File fin = new File("E:\\test.txt"); 12 File fout = new File("E:\\testout.txt"); 13 BufferedInputStream bufin = new BufferedInputStream(new FileInputStream(fin), 256); 14 BufferedOutputStream bufout = new BufferedOutputStream(new FileOutputStream(fout), 256); 15 int len; 16 byte bArray[] = new byte[256]; 17 do{ 18 len = bufin.read(bArray); 19 bufout.write(bArray, 0, len); 20 System.out.println("len:"+len); 21 }while(len==256); 22 bufin.close(); 23 bufout.close(); 24 }catch (IOException e) { 25 throw new RuntimeException(); 26 } 27 } 28 }
过滤流—数据流
DataInputStream和DataOutputStream, 继承FilterInputStream和FilterOutputStream,可以用来与计算机无关的格式读写JAVA的基本数据类型以及String对象。
DataInputStream
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
readBoolean() 读一字节,非零为真
readByte() 以8位读字节
readChar() 读Unicode字符
readInt() 读整数值
writeChar(int v) 把字符写进输出流
writeLong(long v) 把长整写进输出流
writeInt(int v) 把整数写进输出流
数据输出流可以是一个已经建立好的输入数据流对象,例如网络的连结,文件等。数据流可通过如下方式建立。
DataOutputStream
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
FileInputStream fis = new FileInputStream("file1.txt");
FileOutputStream fos = new FileOutputStream("file2.txt");
DataInputStream dis = new DataInputStream(fis);
DataOutputStream dos = new DataOutputStream(fos);
1 /** 2 * 过滤流—数据流 :DataInputStream 和 DataOutputStream 测试 3 * @ClassName: fileTest_7 4 * @Description: 5 * @author xingle 6 * @date 2014-4-17 下午5:53:03 7 */ 8 public class fileTest_7 { 9 public static void main(String[] args) throws IOException{ 10 FileOutputStream fos = new FileOutputStream("D:\\test\\2.txt"); 11 DataOutputStream dos = new DataOutputStream(fos); 12 try{ 13 dos.writeBoolean(true); 14 dos.writeByte((byte)123); 15 dos.writeChar('J'); 16 dos.writeDouble(3.1415926); 17 dos.writeFloat(2.71f); 18 dos.writeInt(1234556); 19 dos.writeLong(998877665544332211L); 20 dos.writeShort((short) 11223); 21 }finally{ 22 dos.close(); 23 } 24 FileInputStream fis = new FileInputStream("D:\\test\\2.txt"); 25 DataInputStream dis = new DataInputStream(fis); 26 try{ 27 System.out.println("\t " + dis.readBoolean()); 28 System.out.println("\t " + dis.readByte()); 29 System.out.println("\t " + dis.readChar()); 30 System.out.println("\t " + dis.readDouble()); 31 System.out.println("\t " + dis.readFloat()); 32 System.out.println("\t " + dis.readInt()); 33 System.out.println("\t " + dis.readLong()); 34 System.out.println("\t " + dis.readShort()); 35 }finally{ 36 dis.close(); 37 } 38 } 39 40 }