A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 等风来_________ 中级黑马   /  2014-3-16 22:13  /  832 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

操作流的步骤(重点)
File类本身是与文件操作有关,但是如果要想操作内容则必须使用字节流或字符流完成,但是不管是使用何种的输入输出流,其基本的操作原理是一样的(以文件流为准):
一、使用File类找到一个文件对象,得到IO操作的源或目标
二、通过字节流或字符流的子类创建对象,(得到IO操作的通道)
三、进行读或写的操作,(IO操作)
四、关闭输入/输出,(打完收工,注意节约资源,关掉)
由于流的操作属于资源操作,所以在操作的最后一定要关闭以释放资源。
其实上面的流操作步骤可以联系生活中的例子:比如想把水井里的水弄到家里的大水缸去,怎么搞呢?
1.找到水井在哪里;2.找根管子一头接在水井里,一头接在家里的大水缸里;3.打开管子上的龙头,放水;4.水放满了,关掉水龙头.
计算机访问外部设备,要比直接访问内存慢得多,若我们每一次write方法调用都是直接写到外部设备(比如磁盘上的一个文件),CPU就要花费更多的时间去等待外部设备;我们可以开辟一个内存缓冲区,程序每一次的write方法都是写到这个内存缓冲区中,只有这个缓冲区装满了之后,系统才将这个缓冲区的内容一次集中写到外部设备.
我的总结:
好处:1.有效提高了CPU的使用率;2.write方法并没有马上真正写入到外部设备,我们还有机会回滚部分写入的数据;
Eg

  1. //构建输入流,读进来,输出到控制台!

  2. import java.io.FileInputStream;
  3. import java.io.InputStream;

  4. public class Demo4 {
  5. public static void main(String[] args) throws Exception {
  6. //第一步:创建源!
  7. String filename = "6.4";//这个文件是在工作空间里面,没有后缀名!
  8. //第二步:创建管道!
  9. InputStream ips = new FileInputStream(filename);
  10. //第三步:操作!
  11. byte []buff = new byte[1024];
  12. int len;//定义缓冲区
  13. while((len = ips.read(buff)) != -1){
  14. System.out.println(new String(buff,0,buff.length));//输出到控制台!此时的输出流就是打印流!
  15. System.out.println("==========================================");//打印下,看哪里在1024。1024的地方被隔开了
  16. }
  17. //第四步:关闭资源(字符流必须关闭资源,因为它中间有缓冲区!对于字节流可以不用关闭,但是还是建议写上,习惯!)
  18. ips.close();
  19. }
  20. }
复制代码


输出:就将文件6.4中的数据打印到了控制台!
字节流和字符流
二者仅仅是操作单位不一样。
InputStreamReader所有输入流的基类,他们都是抽象类,本身不能创建实例,但是他们是所有输入流的模板。
一般来说处理字符或字符串时使用字符流,处理字节或二进制对象时应使用字节流;
备注:字符流必须关闭资源,因为它中间有缓冲区!而字节流不需要!但是一般都会(最后)关闭资源!
字节流
字节流主要是操作byte(字节)的类型数据:
字节输出流:OutputStream
字节输入流:InputStream
字符流
Java中的字符是Unicode编码,是双字节的,1个字符 等于 2个字节;
使用字节来处理字符文本就不太方便了,此时可以考虑使用字符流;
字符流主要是操作char的类型数据:
字符输出流:Writer
字符输入流:Reader
字节流和字符流的区别
字节流和字符流在使用上的代码结构都是非常类似的,但是其内部本身也是有区别的,因为在进行字符流操作的时候会使用到缓冲区(内存中),而字节流操作的时候是不会使用到缓冲区的。
在输出的时候,OutputStream类即使最后没有关闭内容也可以输出。但是如果是Writer的话,则如果不关闭,最后一条内容是无法输出的,因为所有的内容都是保存在了缓冲区之中,每当调用了close()方法就意味着清空缓冲区了。那么可以证明字符流确实使用了缓冲区:
字节流:程序 文件
字符流:程序 缓冲区(内存中) → 文件
如果现在字符流即使不关闭也可以完成输出的话,则必须强制性清空缓冲区:
方法:public void flush() throws IOException
我的总结:
两者相比,肯定使用字节流更加的方便,而且在程序中像图片、MP3等都是采用字节的方式的保存,那么肯定字节流会比字符流使用的更广泛。
但是需要说明的是,但是如果要是想操作中文的话,字符流肯定是最好使的。(字节流的话可能会出现乱码(一个汉字分成了两份)!)
Eg

  1. //字符流读出来,这时候就不会出现乱码的情况,在进行文字操作的时候最好使用字符流!

  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.io.Reader;

  7. public class Demo6 {
  8. public static void main(String[] args) {
  9. File src = new File("6.4");
  10. read(src);
  11. }
  12. public static void read(File src){
  13. Reader r = null;
  14. try {
  15. r = new FileReader(src);
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. }
  19. char []c = new char[1024];
  20. int len;
  21. try {
  22. while((len = r.read(c)) != -1){
  23. System.out.println(new String(c,0,c.length));//打印到控制台
  24. }
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. try {
  29. r.close();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马