码迷,mamicode.com
首页 > 编程语言 > 详细

java.io

时间:2016-04-20 09:58:38      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

java.io.File


 表示一个磁盘文件。可以是文件,也可以是文件夹。这个路径,可以存在,也可以不存在

创建实例


 

方式一:File f = new File("d:\\1.txt")    等价于    File f = new File("d:/1.txt")

方式二:File f = new File("d:\\","1.txt")

 

方法


一、属性相关:

getName()  得到文件名

getAbsolutePath()  得到完整路径

canRead() / canWrite() / canExecute()  是否可读可写可执行

isHidden() / exists()    是否隐藏,是否存在

isDirectory() / isFile() 是否是目录,是否是文件

lastModified() 最后修改时间

length()文件字节量,对目录无效

getTotalSpace() 所在磁盘空间总大小

getFreeSpace()所在磁盘可用空间

getParent() 得到父目录

二、操作相关(增、删、改)

createNewFile() 创建文件

mkdir()  创建单层目录,如:d:/abc

mkdirs() 创建多层目录,如:d:/abc/def/g

delete()  删除文件或"空目录",目录里有东西不能删除

renameTo() 改名

File.createTempFile()在系统临时目录创建临时文件

注意:所有操作相关函数返回boolean,表示操作是否成功

三、查询相关

   list()  返回String[],包含子文件、子目录名称

   listFiles() 返回File[],包含子文件、子目录的File对象

   list(FilenameFileter) 通过接口过滤名字返回String[]

   listFiles(FilenameFilter) 

   listFiles(FileFilter)

 练习:

 1.求目录大小(直接调用目录File的length是得不到的,需要一层层进入目录,累加)

技术分享
    private static void test1() {
        File dir = new File("d:/BaiduYunDownload");
        long len = fileLength(dir);
        System.out.println(dir.getName()+"目录大小:"+len/1024D/1024/1024+"G");    
    }

    private static long fileLength(File dir) {
        if(dir == null) return 0;
        if(dir.isFile()) return dir.length();
         File[] files = dir.listFiles();
         long sum = 0;
         for(File file : files){
             sum += fileLength(file);
         }
        return sum;
    }
求目录大小

2.在sdcard上搜索文件。(如音乐和图片)

以下两个都可以:
/sdcard/.. 下面真实路径的一个别名
/mnt/sdcard/.. sd卡的真实路径

技术分享
protected void doMusic() {
        List<String> list = search("^.+\\.(mp3|wmv|ape|flac)$");
        showList(list);
    }
 
    private List<String> search(String regex) {
        File file = new File("/sdcard");
        return search(file,regex);
    }
    
    
    private List<String> search(File dir, final String regex) {
        List<String> list = new ArrayList<String>();
        File[] arr = dir.listFiles(new FileFilter() {            
            public boolean accept(File f) {
             //目录也要
            if(f.isDirectory()) return true;
            //列出名字匹配的文件
            return f.getName().toLowerCase().matches(regex);                
            }
        });
        //无法列出文件,直接返回空集合
        if(arr == null) return list;
        for (File f : arr) {
            if(f.isFile()){
                list.add(f.getAbsolutePath());
            }else{
                List<String> list2 = search(f,regex);
                //从子目录递归找到文件
                list.addAll(list2);
            }
        }
        return list;
    }

    protected void doImage() {
        List<String> list = search("^.+\\.(jpg|png|gif)$");
        showList(list);
    }

    private void showList(List<String> list) {
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                android.R.layout.simple_list_item_1,
                list
                ); 
        lv.setAdapter(adapter);
    }
View Code

 

 

java.io.RandomAccessFile


 

读写文件,将文件看做是一个字节数组,按下标读写文件中的字节

用处:

     1)读写文件中一段数据

     2)直接在文件数据中修改

创建实例:


 

RandomAccessFile raf = new RandomAccessFile(文件,"r"); //只读

RandomAccessFile raf = new RandomAccessFile(文件,"rw"); //读写

方法:


 

write(int b)   将int 4个字节中,末尾最后一字节输出到文件,实际上是写了一个byte(8位)数据

write(byte[] arr) 输出数据中所有字节

write(byte[] arr,int offset,int n) 输出数据中,从offset开始的n个字节

writeInt(int i) 输出int的4字节

writeDouble(double d) 输出double的8字节

writeUTF(String s)输出两个字节,表示字符串的字节数量,再输出字符串的所有字节数量,使用utf-8编码,字符1位,汉子3位

read()  从文件读取一个字节,转为int类型,如果没有数据,返回-1,通常用这个来判断文件是否结束

read(byte[] buff)读取数组长度个字节,返回读取的数量,没有数据,返回-1

readInt() 读取4个字节的int

readDouble() 读取8个字节的double

readUTF()先读两个字节,确定字符串数量,再根据数量读取字符串

seek(int index) 将文件指针移动到指定下标位置

getFilePointer() 获得指针当前所在下标位置

setLength(字节量) 为文件分配空间,将文件扩充或裁剪为指定大小

练习:实现文件的加密解密

技术分享
    public static void main(String[] args) throws Exception {
        encript1("c:/1.txt",123);
        System.out.println("成功");
    }
    //加密解密都这方法
    private static void encript1(
            String path, int key) 
                    throws IOException {
        
        RandomAccessFile raf = 
         new RandomAccessFile(path, "rw");        
        // 1 ^ 1 = 1
        // 1 ^ 0 = 0
        // 0 ^ 1 = 0
        // 0 ^ 0 = 1
        byte[] buf = new byte[8192];//1k 2k 4k 8k,  1024, 2048, 4096, 8192
        int n;//每次放入 buf 数组的字节数量
        while((n = raf.read(buf)) != -1) {
            //对前 n 个值加密
            for (int i = 0; i < n; i++) {
                buf[i] ^= key;
            }
            raf.seek(raf.getFilePointer()-n);
            //将 buf 数组从 0 位置开始的 n 个写到文件
            raf.write(buf,0,n);
        }
        raf.close();
    }
View Code

 

Stream - 流


 

  • 数据的输入和输出,抽象成数组在管道中流动
  • 输入流:把数据读取到内存中。
  • 输出流:把数据从内存写到其它地方

 

java.io.InputStream/OutputStream


 

此类为输入输出流的抽象方法

OutputStream方法


 

write(int b) 将int 4个字节中末尾字节输出到文件

write(byte[] arr)将数组中所有字节输出到文件

write(byte[] arr,int offset,int n)输出数组中offset开始的n个字节

flush() 输出,输出缓存数据

 

InputStream方法


 

read()  从文件读取一个字节,前面补0转为int,返回读取的字节量,没有数据,返回-1

read(byte[] buff)一次读数组长度字节数据,返回读取的字节数量,没有数据,返回-1

available() 获得剩余可读取的字节数量。

 

java.io.FileInputStream/FileOutputStream


 

  • 接收文件的管道

创建实例


 

1.FileOutputStream out = new FileOutputStream("d:/abc");

     不管文件是否存在,都会创建一个新的空文件

2.FileOutputStream out = new FileOutputStream("d:/abc",true);

    不存在->新建。  存在->追加

练习:实现文件的复制

技术分享
    private void copy(
            String from, 
            String to) throws Exception {
        FileInputStream in = 
         new FileInputStream(from);        
        FileOutputStream out =
         new FileOutputStream(to);    
        //改成批量读写
        //批量读取,每次读到的一批数据,批量输出
        byte[] buf = new byte[8192];
        int n;
        while((n = in.read(buf)) != -1) {
            out.write(buf, 0, n);
        }
        in.close();
        out.close();
    }
View Code

 

 

高级流、操作流

  与其它流相接,操作其它流来读写数据

 

java.io.BufferedInputStream/BufferedOutputString

  • 提供一个内存缓冲区
  • 作用:

               *) 对单字节读写提高效率

创建实例:


BufferedInputStream in = new BufferedInputStream(与它相接的流)

 

java.io.DataInputStream / DataOutputStream


 

读写固定格式的字节数据。

  •  int:  4字节
  • double:8字节
  • UTF:2字节表示字节量,后面是表示字符串的字节值

创建实例


 

 DataInputStream in = new DataInputStream(与其它相接的流);

 

DataInputStream方法


 

  • writeInt(int i) 输出int的4个字节
  • writeDouble(double d) 输出double的8个字节
  • writeUTF(String s) 输出两个字节,表示字符串的字节数量,再输出字符串的所有字节数据

DataOutputStream方法


 

  • readInt()       读取4个字节的int
  • readDouble() 读取8个字节的Double
  • readUTF()     先读两个字节,确定字符串的字节数量,再读取表示字符串的这些字节。

 

java.io.PrintStream


 

将任何数据,转为字符串输出,只有输出流,没有输入流

  out.print(97) => 输出"97"

  out.print(new Point(3,2)) =>输出"tarena.day2104.Point@8af723"

创建实例


 

  • PrintStream out = new PrintStream(相接的流);
  • PrintStream out = new PrintStream(文件);
  • PrintStream out = new PrintStream(文件,字符编码);

方法


 

  •  print(数据)
  •  println(数据) =>在后面添加换行符

 

java.io

标签:

原文地址:http://www.cnblogs.com/bobo110/p/5409407.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!