IO2:FileInputStream/FileOutputStream--java28(02/23/2016)

InputStream 和 Reader 是所有输入流的基类。
InputStream(典型实现:FileInputStream)

int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
Reader(典型实现:FileReader)
int read()
int read(char [] c)
int read(char [] c, int off, int len)
程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。

package com.atguigu.java;

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

import org.junit.Test;
/*
 * 1.流的分类
 * 按照数据流向的不同:输入流、输出流
 * 按照处理数据的单位的不同:字节流 字符流(处理的文本文件)
 * 按照角色的不同:字节流(直接作用于文件) 处理流
 * 2.IO的体系      
 * 抽象基类     节点流(文件流)          缓冲流
 * InputStream      FileInputStream            BufferedInputStream
 * OutputStream FileOutputStream         BufferedOutputStream
 * Reader           FileReader                    BufferedReader
 * Writer           FileWriter                      BufferedWriter
 */
public class TestFileInputOutputStream {
    //调用下面的复制方法,并计算复制时间
    @Test
    public void testCopyFile(){
        long start = System.currentTimeMillis();//毫秒
        String src = "C:\\Users\\xiaotinh\\Desktop\\03.jpg";
        String dest = "C:\\Users\\xiaotinh\\Desktop\\04.jpg";
        copyFile(src, dest);
        long end = System.currentTimeMillis();
        System.out.println("花费时间为:"+ (end - start));
    }
    
    //实现文件复制的方法,加了参数的方法具有通用性
    public void copyFile(String src,String dest){
        //1.提供读入、写出的文件
        File file1 = new File(src);
        File file2 = new File(dest);
        //2.提供相应的流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try{
            fis = new FileInputStream(file1);
            fos = new FileOutputStream(file2);
            //3.实现文件的复制
            byte[] b = new byte[20];
            int len;
            while((len = fis.read(b)) != -1){
                //fos.write(b);错误写法 fos.write(b,0,b.length)是一样的
                fos.write(b, 0, len);//写b里面的东西;从0开始;len是长度
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            if(fos!= null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!= null){//fis和fos的关闭可以并列进行,因为都处于finally中,最后都会执行
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }   
        }
        
    }
    
    
    //从硬盘读取一个文件,并写入到另一个位置。(相当于文件的复制)
    @Test
    public void testFileInputOutputStream(){
        //1.提供读入、写出的文件
        File file1 = new File("hello.txt");
        File file2 = new File("hello3.txt");
        //2.提供相应的流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try{
            fis = new FileInputStream(file1);
            fos = new FileOutputStream(file2);
            //3.实现文件的复制
            byte[] b = new byte[20];
            int len;
            while((len = fis.read(b)) != -1){
                //fos.write(b);错误写法 fos.write(b,0,b.length)是一样的
                fos.write(b, 0, len);//写b里面的东西;从0开始;len是长度
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            if(fos!= null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!= null){//fis和fos的关闭可以并列进行,因为都处于finally中,最后都会执行
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }   
        }
            
    }
    
    
    //FileOutputStream
    @Test
    public void testFileOutputStream(){
        //1.创建一个File对象,标明要写入的文件位置
        //输出的物理文件可以不存在,当执行过程中,若不存在,会自动创建。若存在,会将原有的文件覆盖。
        File file = new File("hello2.txt");
        //2.创建一个FileOutputStream的对象,将file的对象作为形参传递给FileOutputStream的构造器中
        FileOutputStream fos = null;
        try{
            fos = new FileOutputStream(file);
            //3.写入操作
            fos.write(new String("I love China I love the World!").getBytes());
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            //4.关闭输出流
            if(fos != null){
                try{
                    fos.close();
                }catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    @Test
    public void testFileInputOutputStream3(){
        FileInputStream fis = null;
        try {
            File file = new File("hello.txt");
            fis = new FileInputStream(file);
            byte[] b = new byte[5];//读取到的数据要写入的数组
            int len;//每次读到byte中的字节的长度
            while((len = fis.read(b)) != -1){
//              for (int i = 0; i < len; i++) {//不可以写成b.length,否则输出abcdefgcde
//                  System.out.print((char)b[i]);
//              }
                
                String str = new String(b, 0, len);
                System.out.print(str);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(fis!= null){//可以判断fis不为空时,才执行.close()
                try {
                    fis.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
                
            }
    }
    
    
    //使用try-catch的方式处理如下的异常更合理!
    //因为throw是遇到问题就抛出,下面的程序便不再执行,所以无法释放打开的珍贵的流资源
    //而try-catch则会在抓到异常以后,继续执行,而将.close放到finally中,则必然会被关闭
    @Test
    public void testFileInputOutputStream2(){
        //2.创建一个FileInputStream类的对象
        FileInputStream fis= null;
        try {
            //1.创建一个File类的对象
            File file = new File("hello.txt");
            fis = new FileInputStream(file);
            //3.调用FileInputStream的方法,实现file问价的读取
            int b;
            while((b = fis.read()) != -1){
                System.out.print((char)b);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
        //4.关闭相应的流
        try {
            fis.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }//因为流的资源并不是java虚拟机的资源,不会自动回收,需要显示关闭
        }
}

    //从硬盘存在的文件中,读取其内容到程序中。使用FileInputStream
    //要读取的文件一定要存在,否则抛FileNotFoundException
    @Test
    public void testFileInputOutputStream1() throws Exception{
        //1.创建一个File类的对象
        File file = new File("hello.txt");
        //2.创建一个FileInputStream类的对象
        FileInputStream fis = new FileInputStream(file);
        //3.调用FileInputStream的方法,实现file问价的读取
        /*
         * read():读取文件的一个字节。 当执行到文件结尾时,返回-1.abcdefg
         */
//      int b = fis.read();
//      while(b != -1){
//          System.out.print((char)b);
//          b = fis.read();
//      }或者
        int b;
        while((b = fis.read()) != -1){
            System.out.print((char)b);
        }
        //4.关闭相应的流
        fis.close();//因为流的资源并不是java虚拟机的资源,不会自动回收,需要显示关闭
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • 1.流的分类 (1)输入输出流输入输出是针对程序运行的内存而言的输入流的基类:InputStream,Reader...
    ql2012jz阅读 569评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序运行的过程中,可能需要对一些设备进...
    征程_Journey阅读 943评论 0 1
  • 拖更了好几天了,现在突然有点找不回写东西的感觉,惭愧不已,希望能用双手把内心的杂草一根一根拔起,重新回到之前的感觉...
    扫地_阅读 193评论 5 6
  • 第一次见你是在大一刚开学不久的篮球比赛上,我们女生负责拉拉队,为班级男生加油!还记得当时你们班穿着西红柿...
    partlove阅读 571评论 3 3