以拷贝图片为例子,演示异常处理的代码: 拷贝一张图片


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class Demo1 {
 
   public static void main(String[] args) throws IOException {
    //找到目标文件
     File inFile = new File("C:\\Users\\Lenovo\\Pictures\\Camera Roll\\1.jpg");
    File destFile = new File("C:\\Users\\Lenovo\\Pictures\\Camera Roll\\2.jpg");
    //建立数据的输入输出通道
    FileInputStream fileInputStream = new  FileInputStream(inFile);
    FileOutputStream fileOutputStream = new FileOutputStream(destFile);
    //每新创建一个FileOutputStream的时候,默认情况下FileOutputStream 的指针是指向了文件的开始的位置。 每写出一次,指向都会出现相应移动。
    //建立缓冲数据,边读边写
    byte[] buf = new byte[1024];
    int length = 0 ;
    while((length = fileInputStream.read(buf))!=-1){ //最后一次只剩下了824个字节
     fileOutputStream.write(buf,0,length); //写出很多次数据,所以就必须要追加。
    }
    //关闭资源 原则: 先开后关,后开先关。
    fileOutputStream.close();
    fileInputStream.close();
  }
}


异常处理:关闭执行后面的代码,并将异常抛给调用对象


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo1 { public static void main(String[] args){
//找到目标文件
File inFile = new File("C:\\Users\\Lenovo\\Pictures\\Camera Roll\\1.jpg");
File destFile = new File("C:\\Users\\Lenovo\\Pictures\\Camera Roll\\2.jpg");
//建立数据的输入输出通道
FileInputStream fileInputStream;
try {
fileInputStream = new FileInputStream(inFile);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream(destFile);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
//每新创建一个FileOutputStream的时候,默认情况下FileOutputStream 的指针是指向了文件的开始的位置。 每写出一次,指向都会出现相应移动。
//建立缓冲数据,边读边写
byte[] buf = new byte[1024];
int length = 0 ;
try {
while((length = fileInputStream.read(buf))!=-1){ //最后一次只剩下了824个字节
try {
fileOutputStream.write(buf,0,length);
} catch (IOException e) {
throw new RuntimeException(e);
} //写出很多次数据,所以就必须要追加。
}
} catch (IOException e1) {
// TODO Auto-generated catch block
throw new RuntimeException(e1);
}
finally { //关闭资源 原则: 先开后关,后开先关。
if(fileOutputStream!=null) {
try {
fileOutputStream.close();
System.out.println("关闭成功");
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
fileInputStream.close();
System.out.println("关闭成功");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
}

 

这样做虽然代码更长了,但是可以更好的处理异常使得代码更加灵活

读取文件数据使用缓冲数组读取效率更高,所以缓冲输入字节流对象,让我们可以更高效率读取文件。
 
输入字节流体系:
  InputStream  输入字节流的基类       是抽象类
    FileInputStream 读取文件数据的输入字节流
    BufferedInputStream 缓冲输入字节流缓冲输入字节流的出现主要是为了提高读取文件数据的效率。   
其实该类内部只不过是维护了一个8kb的字节数组而已。

注意: 凡是缓冲流都不具备读写文件的能力

使用BufferedInputStream的步骤 :
   1. 找到目标文件。
   2. 建立数据 的输入通道
   3. 建立缓冲 输入字节流流
   4. 关闭资源

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo2 { public static void main(String[] args) throws IOException {
readTest2();
} public static void readTest2() throws IOException{
File file = new File("F:\\a.txt"); FileInputStream fileInputStream= new FileInputStream(file);
BufferedInputStream bufferedInputStream= new BufferedInputStream(fileInputStream);
bufferedInputStream.read(); FileOutputStream fileOutputStream= new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream= new BufferedOutputStream(fileOutputStream);
fileOutputStream.write(null); int content = 0 ;
while((content = fileInputStream.read())!=-1){
System.out.print((char)content);
} bufferedInputStream.close();
}
}

Q:FileInputStream和BufferedInputStream 都一次只读一个字节为什么后者效率会高

A:BufferedInputStream的Read方法维护了一个8kb的缓冲数组,他会一次性读入8kb并且放在内存中,然后再从内存中一个字节一个字节读取,所以快。FileInputStream是从硬盘中一个字节一个字节读取的所以慢

 

输出字节流
  OutputStream  所有输出字节流的基类  抽象类
    FileOutputStream 向文件 输出数据 的输出字节流
    Bufferedoutputstream  缓冲输出字节流    BufferedOutputStream出现的目的是为了提高写数据的效率。
  内部也是维护了一个8kb的字节数组而已。
 
使用BufferedOutputStream的步骤:
    1. 找到目标文件
    2. 建立数据的输出通道

BufferedOutputStream 要注意的细节
    使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中,如果需要把数据真正的写到硬盘上面,需要
       调用flush方法或者是close方法、 或者是内部维护的字节数组已经填满数据的时候。

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo3 { public static void main(String[] args) throws IOException { File file = new File("F:\\1.jpg"); FileOutputStream fileOutputStream = new FileOutputStream(file); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); bufferedOutputStream.write("hello world".getBytes()); //bufferedOutputStream.flush();
bufferedOutputStream.close();
}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo4 { public static void main(String[] args) throws IOException {
File inFile = new File("F:\\1.jpg");
File outFile = new File("E:\\2.jpg");
FileInputStream fileInputStream = new FileInputStream(inFile);
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int content = 0;
while((content = bufferedInputStream.read())!=-1){
bufferedOutputStream.write(content);
bufferedInputStream.close();
bufferedOutputStream.close();
}
}
}

Day 15:缓冲输入输出常用方法和小练习的更多相关文章

  1. Day 17:缓冲输出字符流和用缓冲输入输出实现登录、装饰者设计模式

    输出字符流 Writer  所有输出字符流的基类,  抽象类. FileWriter 向文件输出字符数据的输出字符流. BufferedWriter 缓冲输出字符流        缓冲输出字符流作用: ...

  2. 15.Selenium+Python滑动解锁小案例

    1.代码实现 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChai ...

  3. 第1-5章 慕课网微信小程序开发学习笔记

    第1章 前言:不同的时代,不同的Web --微信小程序商城构建全栈应用 http://note.youdao.com/noteshare?id=a0e9b058853dbccf886c1a890594 ...

  4. KVO的使用二:常用方法及小技巧

    (文章及代码接上一篇) options详解: KVO的注册方法中有一个options枚举,用来确定观察者的接收消息方法接收的信息,那么具体有什么关联呢?下面通过一段代码来验证是如何关联的.依次选择op ...

  5. 【java】学习路径41-使用缓冲输入输出复制文件

    结论:Buffered+数组 这种方式速度是最快的. public void testBufferedIO(String source,String target){ BufferedInputStr ...

  6. mysql的缓冲查询和非缓冲查询

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

  7. Monyer.cn黑客小游戏

    花了一天的时间,Monyer给大家带来了一个有趣的东东——拥有15个关卡的黑客小游戏. 入口http://monyer.com/game/game1 因为一直以来都是大家跟我一起学习网络技术嘛,所以这 ...

  8. php 非缓冲查询

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

  9. php+mysql非缓冲查询(如何循环大数组)

    另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直 ...

随机推荐

  1. ubuntu 12.04 配置vsftpd 服务,添加虚拟用户,ssl加密

    1.对于12.04的vsftpd 有一些bug,推荐安装版本vsftpd_2.3.5-1ubuntu2ppa1_amd64.debapt-get install python-software-pro ...

  2. vue使用H5实现滚动到页面底部时加载数据

    使用原生vue实现瀑布流,发现无法实现小程序那种滚动到地步触发加载效果,只能自己研究了 实现效果: 实现代码: 首先添加监听滚动事件 mounted() { window.addEventListen ...

  3. Jquery设置完颜色后hover不生效的解决办法

    执行完代码后发现写在样式表中的hover效果失效,改了好几遍差点重新写函数,后来发现很简单,是优先级的问题,css()中的内容覆盖了之前的样式 只需要在样式后写!important即可解决! .fil ...

  4. 39数组中只出现一次的数字+判断的时候一定加上括号,&的优先级低于!=

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.     思路:记住位运算的基本操作,与或非,异或,异或是两个数相同则为0,不同为1,理解为加法运 ...

  5. 简单模拟IOC容器:返回对象并能抛出异常

    本次要求:已知com.zzj.vo包下分别有Tiger.lion.Elephant三个Java源文件,请据此实现以下功能:①.自定义一个名为Component的注解,要求该注解只能用于类且代码运行时该 ...

  6. sqli-labs level 2

    来到第第二关 首先在后面添加一个 单引号看下报错信息 发现这里多多了一个引号  尝试去掉单引号看下回显结果   :    and 1=2 可以发现这里不需要添加单引号进行闭合,可以直接控制,所以接下来 ...

  7. Product of Polynomials

    题意:多项式相乘,合并同类项后输出每一项的系数. 题目链接:https://www.patest.cn/contests/pat-a-practise/1009 分析:注意合并后系数为0,这一项就不存 ...

  8. CC26XX开发

    [CC26XX开发] 2016-01-26 [CC2650 入门] CC2650 sensortag入门 http://processors.wiki.ti.com/index.php/CC2650_ ...

  9. 新手小白如何向GitHub上提交项目

    首先你得注册一个自己的GitHub账号,注册网址:https://github.com/join 创建一个新的项目,填写项目名称,描述 创建完成之后,跳转到下面的页面,下面红框中的网址要记住,在后面上 ...

  10. bug-解决微信页面input键盘不回弹问题

    pageReturn () { this.$refs.phoneValue.blur(); this.$refs.verifyCode.blur(); setTimeout(() => { wi ...