Java项目实战开发Day16 2020-04-10

内容

1.文件简介
2.File类使用
3.IO流

一.文件简介

1.文件是什么东西

文件:可以是目录(平常理解的文件夹),也可以是具体的文件(文本、图片、音频、视频等等)

2.文件的操作

1.创建文件
2.判断文件是否存在
3.写入相应的数据
注意:File没有具体的读取和写入的方法,数据的读取和写入通过IO流操作)
4.删除

3.目录的操作

1.创建目录(文件夹)
2.判断目录是否存在
3.对目录进行相应操作(往目录中copy文件等)
4.删除目录

二.File类使用

1.注意点

①File创建出的对象,可以指向指定的一个文件。这个被指向的文件可以存在,也可以不存在。当该文件不存在时,new File(“文件路径”)不会创建这个文件
②File有专门创建文件和目录的方法。分别是createNewFile()mkdir()
③可理解为:File是 文件和目录 路径名的抽象表示形式

2.File使用示例(针对文件)

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){
  
        //1.让file对象指向指定的一个文件(有可能存在,也有可能不存在)
        File file = new File("C:\\Users\\刘金豪\\Desktop\\temp");
        //new File并不会创建这个文件
        
        //2.判断文件是否存在
        if(!file.exists()) {
            //3.创建文件(这段程序在此之前不会真正创建一个文件)
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

            
    }

}

3.File使用示例(针对目录)

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){
  
        File file = new File("C:\\Users\\刘金豪\\Desktop","newFile");
        
        if(file.exists()) {
            return;
        }
        try {
            //创建目录
            file.mkdir();
        }catch(NullPointerException e) {
            e.printStackTrace();
        }
        

            
    }

}

4.删除文件

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){
  
        //1.得到这个文件
        File parent = new File("C:\\\\Users\\\\刘金豪\\\\Desktop");
        File file = new File(parent,"file");
        
        if(file.exists()) {
            file.delete();
        }
 
            
    }

}

5.File中的常用方法

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){
  
        //1.得到这个文件
        File file = new File("C:\\Users\\刘金豪\\Desktop\\newFile");
        
        //2.判断是文件还是目录
        if(file.isDirectory()) {
            System.out.println("是目录");
        }       
        if(file.isFile()) {
            System.out.println("是文件");
        }
        
        //3.1查看当前目录的所有内容(列出来所有文件的名称)
        String[] fileNameList = file.list();
        for(String name:fileNameList) {
            System.out.println(name);
        }
        //3.2文件过滤
        String[] fileNameListAccept = file.list(new FilenameFilter() {

            @Override
            public boolean accept(File arg0, String arg1) {
                //返回true,即满足条件,当前文件就会被过滤出来
                //如果返回false,则不满足条件,就不会被过滤出来
                //arg0是文件夹的路径,arg1是文件的名称
                File f = new File(arg0,arg1);
                
                if(f.isFile()) {
                  return true;
                }
                return false;
            }

        });
        for(String name:fileNameListAccept) {
            System.out.println(name);
        }
        
        //3.3得到file中的文件,并且输出绝对路径(与3.2有相通之处)
        File[] files = file.listFiles();
        for(File f:files) {
            System.out.println(f.getAbsolutePath());
        }
    
            
    }

}

输出结果

文件1
文件2
文件1
文件2
C:\Users\刘金豪\Desktop\newFile\文件1
C:\Users\刘金豪\Desktop\newFile\文件2

三.IO流

1.IO流简介

输入流和输出流不是绝对的,而是相对于内存来说的,再准确一点来说就是相对于内存中正在运行的程序来说的,更精确一点就是相对于正在运行的进程来说的。
输出:内存 -> 外部(硬盘/网络/打印机等外部设备)
输入:外部(硬盘/网络/打印机等外部设备) ->内存

2.举例

比如我们常用的复制粘贴,假如把桌面的东西再复制到桌面上,那么会经过:硬盘(也就是这里的桌面)上的目标文件通过输入流到内存,再通过输出流到硬盘(也就是这里的桌面)

3.数据的储存方式(字节和字符)

有两种:

1.以字节形式存储 比如:图片、视频、音频、exe(二进制,点开看不懂)
2.以字符形式存储 比如:文本(点开能看懂)
这两种数据存储形式不一样,那么读取的方式就不同。如果是二进制文件,那么就需要用字节流读取。如果是文本,那就可以用字符流读取

4.字节流和字符流

字节输入输出流继承结构图

字符输入输出流继承结构图

①字节输入输出流是InputStream 和 OutputStream。这两个都是抽象类
字符输入输出流是 Reader 输出是Writer。这两个也是抽象类
②具体实现类
字节流的输入流FileInputStream 输出流FileOutputStream
字符流输入流 FileReader输出流FileWriter
③注意:当使用IO流时,不需要的资源一般需要自己手动释放(关闭文件)

5.流的形象理解

可以把流当作水流的通路,创建流就是拧开水龙头,这个时候水就可以从源头顺着水管流到需要的地方(这里的水就类似Java中的数据,水流的通道即水管就是Java中的流)到时候水流够了之后就需要关闭水龙头(也就是关闭流)
向文件中写入文本

6.字符输出流使用示例(其余与此类似)

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){
        //1.准备需要写入的数据
        String text = "hello";//这个已经在内存中存在了
        
        //2.决定是选择字符流还是字节流(是相当于输出)   
        FileWriter fw = null;
        try {
            //是把内存中的文本内容写到磁盘中,所以选择字符输出流
            fw = new FileWriter("C:\\Users\\刘金豪\\Desktop\\temp");
            
            //开始写入数据
            fw.write(text);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {          
            //3.关闭流
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
         
    }

}

注意:凡是实现了closeable接口的类都可以在try(){
}的()里面创建对象
好处:当try代码块执行完毕或者有异常的时候,系统会自动关闭对应的对象

7.1使用字节输入输出流完成图片复制粘贴(一次性读取一个字节)

知识点
①在des里面也要写上图片的名称。如果复制的不是图片,也需遵守此规则。
②read()不加参数就是一次读取一个字节,当然也可以加参数,后面代码会有介绍。当读取完毕时,返回-1

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){

        //1.保存图片地址和拷贝到的地址
        String src = "C:\\Users\\刘金豪\\Desktop\\mmexport1566548991556.jpg";
        String des = "C:\\Users\\刘金豪\\Desktop\\newfile\\mmexport1566548991556.jpg";//注意这里,要再写一个jpg
        
        try (//2.将图片读取到内存中(输入流),因为是图片,所以是字节流
            FileInputStream fis = new FileInputStream(src);
            
            //3.将内存中的图片写到磁盘中(字节输出流)
            FileOutputStream fos = new FileOutputStream(des);
            ){

            //每次获取的一个字节
            int b = 0;          
            while(true) {
                //4.从输入流里面获取数据,写入到输出流
                b = fis.read();//read不加参数是一个字节一个字节读取
                //一个字节一个字节地写入内存
                //读完了就返回-1
                
                //判断是否读取完毕
                if(b == -1) {
                    break;
                }
                
                //5.一个字节一个字节地读出去
                fos.write(b);
                
            }
            
        } catch (Exception e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    
        
            
    }

}

7.2一次性读取多个字节

知识点:read的参数一般是数组,如果加了参数,就直接把数据读入这个参数里面了

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){

        String src = "C:\\Users\\刘金豪\\Desktop\\mmexport1566548991556.jpg";
        String des = "C:\\Users\\刘金豪\\Desktop\\newfile\\mmexport1566548991556.jpg";//注意这里,要再写一个jpg
        
        try (FileInputStream fis = new FileInputStream(src);
            
            FileOutputStream fos = new FileOutputStream(des);
            ){

            //字节数组,用于保存一次性读取的多个数据
            byte[] buffer = new byte[1024];//通常定义1024个字节
            
            int len = 0;            
            while(true) {
                //4.从输入流里面获取数据,写入到输出流
                len = fis.read(buffer);
                
                //判断是否读取完毕
                if(len == -1) {
                    break;
                }
                
                //5.一个字节一个字节地读出去
                fos.write(buffer);//数据读入buffer里面了
                
            }
            
        } catch (Exception e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    
        
            
    }

}

8.1使用字符流完成文本复制粘贴

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){

        String src = "C:\\Users\\刘金豪\\Desktop\\temp";
        String des = "C:\\Users\\刘金豪\\Desktop\\newfile\\temp";
        
        try(FileReader fr = new FileReader(src);
            FileWriter fw = new FileWriter(des);){
            while(true) {
                int ch = fr.read();
                if(ch == -1) {
                    break;
                }
                fw.write(ch);
            }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
        
            
    }

}

8.2一次性读取多个字符(和字节流的基本一样)

import java.io.*;
import java.util.*;

public class 测试程序   {                                                                                                             
           
    
    public static void main(String[] args){

        String src = "C:\\Users\\刘金豪\\Desktop\\temp";
        String des = "C:\\Users\\刘金豪\\Desktop\\newfile\\temp";
        
        try(FileReader fr = new FileReader(src);
            FileWriter fw = new FileWriter(des);){
            
            char[] buffer = new char[1024];
            while(true) {
                int len = fr.read(buffer);
                if(len == -1) {
                    break;
                }
                fw.write(buffer);
            }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
        
            
    }

}

总结

相比第一次学文件和IO流,这一次非常清晰。捋顺了它们之间的关系,总之收获颇丰。

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

推荐阅读更多精彩内容

  • 五、IO流 1、IO流概述 (1)用来处理设备(硬盘,控制台,内存)间的数据。(2)java中对数据的操作都是通过...
    佘大将军阅读 507评论 0 0
  • 1、IO流 1.1、概述 之前学习的File类它只能操作文件或文件夹,并不能去操作文件中的数据。真正保存数据的是文...
    Villain丶Cc阅读 2,667评论 0 5
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序运行的过程中,可能需要对一些设备进...
    征程_Journey阅读 957评论 0 1
  • tags:io categories:总结 date: 2017-03-28 22:49:50 不仅仅在JAVA领...
    行径行阅读 2,174评论 0 3