01 IO流 RandomAccessFile File

1、File类表示目录信息
listFiles()方法用于返回一个抽象路径名数组,这些路径名表示抽象路径名的目录中的子项(文件或目录)。
File[] listFiles() 返回值是抽象路径名数组。
例:获取当前目录下的内容:

public class TestListFiles {
    public static void main(String[] args) {
        File dir =new File(".");
        File[] subs =dir.listFiles();
        for(File sub:subs ){
            System.out.println(sub);
        }
    }
}

运行结果:

.\.classpath
.\.project
.\.settings
.\bin
.\src
“.” 表示的当前目录,本例当前目录,就是当前工程下。

2、FileFilter接口 用于抽象路径名的过滤器。
此接口的实例可传递给File类的listFiles(FileFilter)方法。用于返回满足该过滤器要求的子项。
例:获取当前目录下的后缀为ings的文件(扩展为’.txt’的文件);最后遍历listFiles方法返回的数组查看目录下的内容。

package com.wang;

import java.io.File;
import java.io.FileFilter;

public class TestListFiles {
    public static void main(String[] args) {
        File dir =new File(".");
        File[] subs =dir.listFiles(new FileFilter(){
            public boolean accept(File file){
                return file.getName().endsWith("ings");
            }
        });
        for(File sub:subs ){
            System.out.println(sub);
        }
    }
}

运行结果:

.\.settings

RandomAccessFile类。

package day01;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 批量写出字节
 * 
 * @author Administrator
 *
 */
public class RandomAccessFileDemo1 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf
            = new RandomAccessFile(
                "test.txt","rw"
              );

        String str = "我爱达内苍老师!";
        /*
         *  byte[] getBytes()
         *  字符串的该方法用来将当前字符串按照
         *  当前系统默认的字符集转换为对应的字节
         *  windows默认:gbk
         *  unix默认:utf-8
         */
//      byte[] data = str.getBytes();
        /*
         * 重载的getBytes()
         * byte[] getBytes(String str)
         * 将当前字符串按照给定的字符集转换为
         * 对应的字节
         * 字符集名称不区分大小写,但通常使用大写
         * 常用的:
         * gbk:国标编码,英文1字节,中文2字节
         * utf-8:万国码,英文1字节,中文3字节
         * iso8859-1:欧洲编码,不支持中文。
         */
        byte[] data = str.getBytes("UTF-8");
        System.out.println(
            "字节数:"+data.length
        );

        /*
         * void write(byte[] d)
         * 将给定的字节数组中的所有字节全部写出
         */
        raf.write(data);

        raf.close();
    }
}





运行结果:

字节数:22
生成了test.txt文件

例2:

package day01;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 批量读取字节
 * @author Administrator
 *
 */
public class RandomAccessFileDemo2 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf
            = new RandomAccessFile(
                "test.txt","r"
              );

        /*
         *  int read(byte[] d)
         *  一次性尝试读取给定的字节数组的length
         *  个字节,并存入到给定的数组中。返回值
         *  为实际读取到的字节量。若返回值为-1,
         *  表示读取到文件末尾了。 
         */
        byte[] data = new byte[100];
        int len = raf.read(data);
        System.out.println("实际读取到了:"+len);

        /*
         * 字符串提供了构造方法允许将给定的字节数组
         * 按照给定的字符集转换为对应的字符串
         * 
         * String(byte[] d,String charset)
         * 将给定的字节数组中的所有字节按照给定的
         * 字符集转换为字符串。
         * 
         * String(byte[] d,
         *        int offset,
         *        int len,
         *        String charset)
         * 将给定的字节数组中从下标为offset处的
         * 字节开始,连续len个字节,按照给定的字
         * 符集转换为对应的字符串。       
         */
        String str 
         = new String(data,0,len,"UTF-8");
        System.out.println(str);

        raf.close();
    }
}

运行结果:

实际读取到了:22
我爱达内苍老师!

例3:

package day01;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * RandomAccessFile是基于指针进行读写操作的
 * @author Administrator
 *
 */
public class RandomAccessFileDemo3 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf
            = new RandomAccessFile(
                "demo.dat","rw"
              );
        /*
         * RAF总是基于指针当前位置进行读写操作的。无论是读还是写,指针都会自动向后移动。刚创建好的RAF,指针是指向文件的第一个字节的。指针的位置用下标表示,0表示文件的第一个字节的位置。
         *  long getFilePointer()获取当前指针的位置
         */
        long position = raf.getFilePointer();
        System.out.println("pos:"+position);

        String str = "你好";
        byte[] data = str.getBytes();
        raf.write(data);

        position = raf.getFilePointer();
        System.out.println("pos:"+position);

        raf.close();
    }
}

运行结果:

pos:0
pos:6

例4:

package day01;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 *  RandomAccessFile提供了很多让变读写数据类型
 *  的方法
 * @author Administrator
 *
 */
public class RandomAccessFileDemo4 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf
            = new RandomAccessFile(
                "raf.dat","rw"
            );
        //0
        System.out.println(
            "pos:"+raf.getFilePointer());

        //写出一个int值
        /*
         *                            vvvvvvvv
         * 01111111 11111111 11111111 11111111
         * max >>> 24
         */
        int max = Integer.MAX_VALUE;
//      raf.write(max>>>24);
//      raf.write(max>>>16);
//      raf.write(max>>>8);
//      raf.write(max);
        /* void writeInt(int d)将给定的int值写出。该方法会连续写4个字节。
         */
        raf.writeInt(max);
        System.out.println(
            "pos:"+raf.getFilePointer());

        /* 写出一个long值
         */
        raf.writeLong(123L);
        System.out.println(
            "pos:"+raf.getFilePointer());

        /*
         * 写一个double值
         */
        raf.writeDouble(123.123);
        System.out.println(
            "pos:"+raf.getFilePointer());

        /*
         * 先将指针移动到文件最开始
         * void seek(long pos)将指针移动到指定位置
         */
        raf.seek(0);
        System.out.println(
            "pos:"+raf.getFilePointer());

        /*
         * 先读int值
         */
        int i = raf.readInt();
        System.out.println(i);
        System.out.println(
            "pos:"+raf.getFilePointer());

        long l = raf.readLong();
        System.out.println(l);

        double d = raf.readDouble();
        System.out.println(d);

        raf.close();  
    }
}

运行结果:

pos:0
pos:4
pos:12
pos:20
pos:0
2147483647
pos:4
123
123.123

例5:首先将草原歌曲 - 我要去西藏.mp3复制到工作路径下:
使用RandomAccessFile类copy首mp3.

package day01;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 若想提高读写效率,必须减少读写次数。可以通过提高读写的数据量,来减少读写的次数,从而提高读写效率。
 * @author Administrator
 *
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile src
            = new RandomAccessFile(
                "草原歌曲 - 我要去西藏.mp3","r"
            );

        RandomAccessFile des
            = new RandomAccessFile(
                "草原歌曲 - 我要去西藏d.mp3","rw"
            );
        //创建10k缓冲区
        byte[] buf = new byte[1024*10];
        //byte[] buf =new byte[10240*100];
        //保存每次实际读取到的字节量
        int len = -1;

        long start = System.currentTimeMillis();
        while((len = src.read(buf))!=-1 ){
            /*
             * write(byte[] d,int offset,int len) 将给定的字节数组中从下标为offset处开始连续len个字节写出。
             */
            des.write(buf,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println(
            "复制完毕!耗时:"+(end-start)+"毫秒");       
        src.close();
        des.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值