Java文件与流

文件

文件管理通过java.io包下.file类

作用:

1、文件属性
2、文件检查
3、文件删除
4、不包含对其文件内容的处理

File类的构造

语法:

File f =new  File(String path)
path:选中文件路径

例如:
先在E盘中创建一 .txt文件,
创建FileDome类

File f =new File("E:/iodemo.txt");

方法


例如:
创建新文件

        File f =new File("E:/iodemo01.txt");
        
        try {
            boolean b=f.createNewFile();
            System.out.println(b);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

盘中对应路径查看:


常用方法:

f.exists()判断文件是否存在
f.delete()删除文件,不可恢复性删除

概念: 流(Stream)代表程序中数据的流通

数据流:是一串连续不断的数据的集合

java中分为

1、输入流:流入 到计算机内存数据
2、输出流:流出 计算机内存数据

1、按照处理单位分为:

1、字节流
2、字符流

2、按照功能分为:

1、节点流(低级流)
2、处理流(高级流)
   速度不同:低级流 < 高级流

文件读取

字节流

创建FileInput类,读取上面iodemo.txt文件
iodemo.txt内容

helo word!
my name is wangjilong 
tell: 210-455214

创建FileInput类

public static void main(String[] args) {
        read1();

}
    //通过java   io读取文件数据
    public static void read1() {
        //找到文件
        File f= new File("E:/iodemo.txt");
        //文件字节输入流
        FileInputStream fis=null;
        try {
            //搭建管道 
            fis = new FileInputStream(f);
             //读取数据
            System.out.print((char)fis.read());//char强行转换类型,不然读取的是accii表  h对应值104
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

输出:
h

读取了一次,所以只有 h

修改读取数据部分代码,循环读取

//读取数据
           for (int i = 0; i < f.length(); i++) {
               System.out.print((char)fis.read());
           }

或者:
           while (true) {
               int s=0;
               if ((s=fis.read())!=-1) {
                   System.out.print((char)s);
               } else {
                   break;
               }
           }

输出:
helo word!
my name is wangjilong 
tell: 210-455214

注意:

 该方法无法读取 汉字 ;

read()方法:

此方法输入流中读取一个数据字节,如果已经达到文件末尾,则返回-1(表示读取完成)
容器创建

为了减少内存处理负担,可以先将文件读取到缓存器内,然后一次性读出,避免单个字节的吞吐。

在上面的代码上添加read2方法

public static void read2() {
        File f= new File("E:/iodemo.txt");
        //文件字节输入流
        FileInputStream fis;
        
        try {
             fis=new FileInputStream(f);
             //创建容器
             byte[] b= new byte[1024];
             //读入容器
             int length=fis.read(b);
             
             System.out.println(length);//返回读取文件内容的个数
             System.out.println(new String(b,0,length));//string构造
             
             
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

输出
54
helo word!
my name is wangjilong 
tell: 210-455214

关于上述代码中的String构造解释:
public String(byte[] bytes,int offset,int length)

    byte[] bytes:原数组 字符的数字形式 需要转成字符串
    int offset:初始位置 在byte的那个下标位置开始截取
    int length:截取的长度

同理这时候可以对文件中的 汉字进行读取,在.txt文件中添加汉字试一试读取

当前代码读取量只有1024,面对更大 的文件需要去循环多次读取

修改后

public static void read2() {
        File f= new File("E:/iodemo.txt");
        //文件字节输入流
        FileInputStream fis;
        
        try {
             fis=new FileInputStream(f);
             //创建容器
             byte[] b= new byte[1024];
             while ((fis.read(b))!=-1) {
                //读完返回-1
                 System.out.println(new String(b));
            }   
 
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

注意:
如果汉字出现乱码,需要修改编码格式为ANSI格式

文件拷贝和复制

拷贝和文件需要用 流 来完成
(生动形象的图解一下)


创建俩个txt文件,一个为空文件即可

我这里创建了 少年闰土.txt(作源文件)和 少年闰土copy.txt(目标文件空文件)

public static void main(String[] args) {
        //文件拷贝
        File f1=new File("E:/少年闰土.txt");//源文件
        File f2=new File("D:/少年闰土copy.txt");//目标文件
        
        //字节输入流
        FileInputStream fis=null;
        //字节输出流
        FileOutputStream fos=null;  
        try {
             fis =new FileInputStream(f1);
             fos =new  FileOutputStream(f2);
             byte[] b=new byte[1024];
             int length=0;
             while ((length=fis.read(b))!=-1) {
                fos.write(b, 0,length);
            }
             System.out.println("拷贝成功");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            
        }finally {
            try {
                fos.close();//关闭流
            } catch (Exception e2) {
                // TODO: handle exception
            }
        }

运行,在目标文件中查看拷贝后的文件内容

注意:当 write 方式没有写入时无法完成,则强制写入

fos.flush()
向文件中添加内容

向iodemo01.txt文件中写入内容

File f= new File("E:/iodemo01.txt");
        FileOutputStream fos;
        try {
             fos=new FileOutputStream(f);
             byte[] b=new byte[100];
             //写入内容
             String str ="今年我想买个劳";
             //将字符串转换成byte数组
             b=str.getBytes();
             fos.write(b);
             System.out.println("输入完成");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

运行,在路径中找到该文件查看。

如果需要继续添加内容,不覆盖以前的内容,在 f, 后加true就行

fos=new FileOutputStream(f,true);

字符流

2字节 ,字符输入流Reader, 字符输出流 writer

File f=new File("E:/iodemo02.txt");
        FileWriter fw = null ;
        try {
            fw =new FileWriter(f,true);
            String str = "我还想买个红旗";
            fw.write(str);
            System.out.println("完成");
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                fw.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
字符流的拷贝

选定一个文件先完成读取,然后再写入到另一个文件,就完成了一个拷贝

        File f1=new File("E:/iodemo02.txt");
        File f2 =new File("E:/iodemo02copy.txt");
        
        
        FileWriter fw = null ;
        FileReader fr=null;
         
        try {
            fr =new FileReader(f1);
            fw =new FileWriter(f2);
            
            char[] c= new char[1024];
            int length=0;
            while ((length=fr.read(c))!=-1) {
                fw.write(c,0,length);
            }
            System.out.println("完成");
        }
        catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                fw.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

关于高级流和处理流

高级流的使用需要先创建低级流,高级流可以更快的完成操作,节约时间

  public static void main(String[] args) {
        File f1=new File("E:/iodemo01.txt");//源文件
        File f2=new File("E:/iodemo011.txt");//目标文件
        //低级字节输入流
        FileInputStream fis=null;
        //高级字节输入流
        BufferedInputStream bis=null;
        
        //低级字节输出流
        FileOutputStream fos =null;
        //高级字节输出流
        BufferedOutputStream bos=null;
        
        try {
            fis = new FileInputStream(f1);
            bis =new BufferedInputStream(fis);
            fos =new FileOutputStream(f2);
            bos =new BufferedOutputStream(fos);
            
            byte[] b =new byte[2048];
            int length=0;
            while ((length=bis.read(b))!=-1) {
                bos.write(b,0,length);
                bos.flush();
            }
            System.out.println("ok!!!!!");
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            
            try {
                bis.close();
                bos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }   
    }

高级流和低级流放在同一类下,我们来作一个对比

public class BufferFileCopy {
    public static void main(String[] args) {
        
        //记录开始时间
        long begin =System.currentTimeMillis();
//      Files();
        buff();
        long end = System.currentTimeMillis();
        double time = (end-begin)/1000;
        System.out.println("执行过程时间为"+time);
    }
    //高级流文件拷贝
    public static void buff() {
        File f1=new File("E:/02.JavaSE核心技术/D-参考资料/01.zip");//源文件
        File f2=new File("E:/02.JavaSE核心技术/D-参考资料/01高级.zip");//目标文件
        //低级字节输入流
        FileInputStream fis=null;
        //高级字节输入流
        BufferedInputStream bis=null;
        
        //低级字节输出流
        FileOutputStream fos =null;
        //高级字节输出流
        BufferedOutputStream bos=null;
        
        try {
            fis = new FileInputStream(f1);
            bis =new BufferedInputStream(fis);
            fos =new FileOutputStream(f2);
            bos =new BufferedOutputStream(fos);
            
            byte[] b =new byte[2048];
            int length=0;
            while ((length=bis.read(b))!=-1) {
                bos.write(b,0,length);
                bos.flush();
            }
            System.out.println("ok!!!!!");
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            
            try {
                bis.close();
                bos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    //低级流文件拷贝
    public static void Files() {
        File f1=new File("E:/02.JavaSE核心技术/D-参考资料/01.zip");//源文件
        File f2=new File("E:/02.JavaSE核心技术/D-参考资料/01低级.zip");//目标文件
        
        //字节输入流
        FileInputStream fis=null;
        //字节输出流
        FileOutputStream fos=null;  
        try {
             fis =new FileInputStream(f1);
             fos =new  FileOutputStream(f2);
             byte[] b=new byte[1024];
             int length=0;
             while ((length=fis.read(b))!=-1) {
                fos.write(b, 0,length);
            }
             System.out.println("拷贝成功");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            
        }finally {
            try {
                fos.close();//关闭流
            } catch (Exception e2) {
                // TODO: handle exception
            }
        }
    }

}

这里需要一个大一点的文件,我这里用的文件大小为389,952kb、

先执行低级流


再执行高级流



可以看出高级流的耗时明显小于低级流耗时

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

推荐阅读更多精彩内容

  • 前言 Java中使用IO(输入输出)来读取和写入,读写设备上的数据、硬盘文件、内存、网络......,根据数据的走...
    luckee阅读 2,329评论 0 0
  • Java里面,将IO流体系按操作方式分类,可分为字节流和字符流。相关类结构图如下: 字节流相关的基类是InputS...
    zackyG阅读 1,996评论 0 1
  • 1. 流 Stream Java中(绝大部分编程语言类似)文件一般不是单独处理,而是视为输入输出(I/O)设备的一...
    entro阅读 1,843评论 0 7
  • 目标 文件与目录管理 流 文件读写(字节流 字符流) 对象序列化 文件与目录管理 前置任务 前置需要了解的知识 1...
    A建飞_dedf阅读 185评论 0 0
  • 目标 文件与目录管理 流 文件读写(字节流 字符流) 对象序列化 文件与目录管理 前置任务 前置需要了解的知识1、...
    wqjcarnation阅读 630评论 0 2