java IO 流

IO流主要是涉及数据源和目标源之间的数据传送和书写。比如网络数据的获取,文件的下载和上传,文件拷贝,控制台的输入输出。


javaIo.PNG

File

file是一个文件对象类,这个对象类不仅代表我们常规上的文件,还能代表目录对象。所以就会涉及要判断file是文件还是目录。file 方法相对简单。

主要涉及api 如下:

    file.getAbsolutePath()//获取绝对路径的文件地址
    file.getName()// 获取文件名称
    file.getParentFile()// 获取父级文件
    file.isDirectory() //是否是目录
    file.isFile()// 是否文件
    file.length()// 文件长度
    file.listFiles() //列出子文件
    file.listFiles(FilenameFilter filenameFilter) // 根据过滤器 返回符合的文件集合
    file.canWrite();// 是否可写
    file.canRead(); // 是否能读
    file.createNewFile();// 创建新文件
    file.delete();// 删除文件
    file.exists();// 文件是否存在

递归

使用递归的形式,打印各个文件的路径很常见。

    /**
     * 递归打印所有根目录下的文件
     * @param dir
     */
    public void printPath(File dir) {

        final File[] files = dir.listFiles();
        if (files == null || files.length == 0) {
            return;
        }
        for (File file : files) {
            Log.d(TAG, "printPath: " + file.getAbsolutePath());

            if (file.isDirectory()) {

                printPath(file);
            }
        }
    }

 /**
     * 使用过滤器过滤所有文件夹下.png的文件
     * @param dir
     */
    public void printFilterFile(File dir) {

        final File[] filters = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".png");
            }
        });
        if (filters != null &&filters.length > 0) {
            for (File file : filters) {
                Log.d(TAG, "printPath: " + file.getAbsolutePath());
            }
        }

        for (File file : dir.listFiles()) {

            if (file.isDirectory()) {

                printFilterFile(file);
            }
        }

    }

RadomAccessFile

RadomAccessFile是一个独立的类,继承Object,实现了DataOutPut,DataInput接口,适用于已知大小组成的文件,可以使用seek直接定位到文件的具体位置,比如可以用于多线程断点下载,可以从指定的位置输入数据。你可以理解为它是一个文件的容器,支持读取文件和写入文件的操作。当它创建的时候,需要传入mode,一种是读(r),一种是读写(rw),不支持只写操作。也可以通过length()获取文件大小。

常用的api:

readLine()
seek(pos)
skipBytes(n)
write(bytes)
length()
close()

字节流:

InputStream OutputStream(输入流和输出流)

他们是抽象类,只能继承,定义自己的子类。InputStream代表从数据源读取数据,所以常用的操作方法是read,OutputStream是写入到目标地,所有常用的操作是write。字节流顾名思义就是字节数据,字节数据能表达任何数据,这也是和字符流不一样的地方。字符流只能读取文本文件。它们常用的子类有以下对象。

ByteArrayInputStream ByteArrayOutputStream

字节数组流,内部还有一个缓冲区,提高读写效率。能表示多种数据类型,文件类型,网络类型,控制台。

ObjectInputStream ObjectOutputStream

对象类型的IO流,多用于序列化对象(把对象的数据写入到磁盘上),和反序列对象(把磁盘上的数据写入的对象上,也就是内存级别的对象)

/**
     * 序列化对象和反序列化
     */
    public void serializ2Obj(){
        final User kk = new User("kk", 11);
        try 
            //------------------------序列化对象---------------------------------
            final File file = new File("/storage/emulated/0/user.tmp");
            if (!file.exists()){
                file.createNewFile();
            }
            final ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));

            objectOutputStream.writeObject(kk);

            //------------------------反序列化对象---------------------------------

            final FileInputStream fileInputStream = new FileInputStream(new File("/storage/emulated/0/user.tmp"));
            final ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            final Object readObject = objectInputStream.readObject();
            Log.d(TAG, "serializ2Obj: "+((User)readObject).toString());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

FileInputStream FileOutputStream

文件类型流,主要用于读写文件使用。

 public void copyFile(){
        final File file = new File("/storage/emulated/0/user.tmp");
        final File outfile = new File("/storage/emulated/0/copyuser.tmp");
        if (!outfile.exists()){
            try {
                outfile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        try {
            final FileInputStream fileInputStream = new FileInputStream(file);
            final FileOutputStream fileOutputStream = new FileOutputStream(outfile);

            byte[] bytes = new byte[1023];
            int len=0;
            while ((len=fileInputStream.read(bytes))!=-1){

                fileOutputStream.write(bytes,0,len);
            }
            fileOutputStream.close();
            fileInputStream.close();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

字符流:
Reader Writer 读取 写入
读取和写入字符流的抽象类,

序列化
objectOutStream

关闭流方法

PrintStream
system.in
system.out
system.err
Scanner

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