初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂。而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见。

 

这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializable接口等等一些高级用法极其原理。

 

一、java io的开始:文件

1. 我们主要讲的是流,流的本质也是对文件的处理,我们循序渐进一步一步从文件将到流去。

2. java 处理文件的类 File,java提供了十分详细的文件处理方法,举了其中几个例子,其余的可以去

 



Java代码  

io操作总结 java java io使用_Java



1. package
2. import
3.    
4. public class
5. public static void
6.        
7.         createFile();  
8.     }  
9.    
10. /**
11.    * 文件处理示例
12.    */
13. public static void
14. new File("E:/电脑桌面/jar/files/create.txt");  
15. try{  
16. //当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
17. "该分区大小"+f.getTotalSpace()/(1024*1024*1024)+"G"); //返回由此抽象路径名表示的文件或目录的名称。
18. //创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
19. //            f.delete(); //  删除此抽象路径名表示的文件或目录
20. "文件名  "+f.getName());  //  返回由此抽象路径名表示的文件或目录的名称。
21. "文件父目录字符串 "+f.getParent());// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
22.             
23. catch
24.             e.printStackTrace();  
25.         }  
26.   }  
27. }



二、字节流:

1.字节流有输入和输出流,我们首先看输入流InputStream,我们首先解析一个例子(FileInputStream)。

 



Java代码  

io操作总结 java java io使用_Java


1. package
2. import
3. import
4. import
5. import
6. public class
7. /**
8.     * 我们写一个检测文件长度的小程序,别看这个程序挺长的,你忽略try catch块后发现也就那么几行而已。
9.     */
10. void
11. //TODO 自动生成的方法存根
12. int count=0;  //统计文件字节长度
13. null;   //文件输入流
14. try{  
15. new File("D:/David/Java/java 高级进阶/files/tiger.jpg"));  
16. /*1.new File()里面的文件地址也可以写成D:\\David\\Java\\java 高级进阶\\files\\tiger.jpg,前一个\是用来对后一个
17.            * 进行转换的,FileInputStream是有缓冲区的,所以用完之后必须关闭,否则可能导致内存占满,数据丢失。
18.           */
19. while(streamReader.read()!=-1) {  //读取文件字节,并递增指针到下一个字节
20.              count++;  
21.           }  
22. "---长度是: "+count+" 字节");  
23. catch (final
24. //TODO 自动生成的 catch 块
25.           e.printStackTrace();  
26. finally{  
27. try{  
28.              streamReader.close();  
29. catch
30. //TODO 自动生成的 catch 块
31.              e.printStackTrace();  
32.           }  
33.       }  
34.    }  
35.    
36. }



我们一步一步来,首先,上面的程序存在问题是,每读取一个自己我都要去用到FileInputStream,我输出的结果是“---长度是: 64982 字节”,那么进行了64982次操作!可能想象如果文件十分庞大,这样的操作肯定会出大问题,所以引出了缓冲区的概念。可以将streamReader.read()改成streamReader.read(byte[]b)此方法读取的字节数目等于字节数组的长度,读取的数据被存储在字节数组中,返回读取的字节数,InputStream还有其他方法mark,reset,markSupported方法,例如:

 

mark 和 reset

mark用于标记当前位置;在读取一定数量的数据(小于readlimit的数据)后使用reset可以回到mark标记的位置。

FileInputStream不支持mark/reset操作;BufferedInputStream支持此操作;

mark(readlimit)的含义是在当前位置作一个标记,制定可以重新读取的最大字节数,也就是说你如果标记后读取的字节数大于readlimit,你就再也回不到回来的位置了。

通常InputStream的read()返回-1后,说明到达文件尾,不能再读取。除非使用了mark/reset。

 

 

2.FileOutputStream 循序渐进版, InputStream是所有字节输出流的父类,子类有ByteArrayOutputStream,FileOutputStream,ObjectOutputStreanm,这些我们在后面都会一一说到。先说FileOutputStream

我以一个文件复制程序来说,顺便演示一下缓存区的使用。(Java I/O默认是不缓冲流的,所谓“缓冲”就是先把从流中得到的一块字节序列暂存在一个被称为buffer的内部字节数组里,然后你可以一下子取到这一整块的字节数据,没有缓冲的流只能一个字节一个字节读,效率孰高孰低一目了然。有两个特殊的输入流实现了缓冲功能,一个是我们常用的BufferedInputStream.)

 



Java代码  

io操作总结 java java io使用_Java



1. package
2. import
3.    
4. public class
5.    
6. public static void
7. // TODO自动生成的方法存根
8. byte[] buffer=new byte[512];   //一次取出的字节数大小,缓冲区大小
9. int numberRead=0;  
10. null;  
11. null;  
12. try
13. new FileInputStream("D:/David/Java/java 高级进阶/files/tiger.jpg");  
14. new FileOutputStream("D:/David/Java/java 高级进阶/files/tiger2.jpg"); //如果文件不存在会自动创建
15.          
16. while ((numberRead=input.read(buffer))!=-1) {  //numberRead的目的在于防止最后一次读取的字节小于buffer长度,
17. 0, numberRead);       //否则会自动被填充0
18.         }  
19. catch (final
20. // TODO自动生成的 catch 块
21.         e.printStackTrace();  
22. finally{  
23. try
24.            input.close();  
25.            out.close();  
26. catch
27. // TODO自动生成的 catch 块
28.            e.printStackTrace();  
29.         }  
30.          
31.      }  
32.   }  
33.    
34. }



 

 

3.读写对象:ObjectInputStream 和ObjectOutputStream ,该流允许读取或写入用户自定义的类,但是要实现这种功能,被读取和写入的类必须实现Serializable接口,其实该接口并没有什么方法,可能相当于一个标记而已,但是确实不合缺少的。实例代码如下:

 



Java代码  

io操作总结 java java io使用_Java


1. package
2.    
3. import
4.    
5. public class
6.    
7. /**
8.     * @param args
9.     */
10. public static void
11. // TODO自动生成的方法存根
12. null;  
13. null;  
14.        
15. try
16. new ObjectOutputStream(new FileOutputStream("D:/David/Java/java 高级进阶/files/student.txt"));  
17. new Student("gg", 22));  
18. new Student("tt", 18));  
19. new Student("rr", 17));  
20. new ObjectInputStream(new FileInputStream("D:/David/Java/java 高级进阶/files/student.txt"));  
21. for (int i = 0; i < 3; i++) {  
22.             System.out.println(objectreader.readObject());  
23.          }  
24. catch
25. // TODO自动生成的 catch 块
26.          e.printStackTrace();  
27. finally{  
28. try
29.             objectreader.close();  
30.             objectwriter.close();  
31. catch
32. // TODO自动生成的 catch 块
33.             e.printStackTrace();  
34.          }  
35.           
36.       }  
37.        
38.    }  
39.    
40. }  
41. class Student implements
42. private
43. private int
44.     
45. public Student(String name, int
46. super();  
47. this.name = name;  
48. this.age = age;  
49.    }  
50.    
51. @Override
52. public
53. return "Student [name=" + name + ", age=" + age + "]";  
54.    }  
55.     
56.     
57. }


运行后系统输出:

Student [name=gg, age=22]

Student [name=tt, age=18]


Student [name=rr, age=17]