码迷,mamicode.com
首页 > 移动开发 > 详细

Android(java)学习笔记167:Java中操作文件的类介绍

时间:2015-08-16 22:35:30      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

1.File类:对硬盘上的文件和目录进行操作的类。

   File类是文件和目录路径名抽象表现形式

 构造函数:

       1) File(String pathname)
       Creates a new File instance by converting the given pathname string into an abstract pathname.

       2)File(File parent, String child)
       Creates a new File instance from a parent abstract pathname and a child pathname string.

       3)File(String parent, String child)
       Creates a new File instance from a parent pathname string and a child pathname string.

       4)File(URI uri)
       Creates a new File instance by converting the given file: URI into an abstract pathname.

import java.io.File;
/*
 * 我们要想实现IO的操作,就必须知道硬盘上文件的表现形式。
 * 而Java就提供了一个类File供我们使用。
 * 
 * File:文件和目录(文件夹)路径名的抽象表示形式
 * 构造方法:
 *         File(String pathname):根据一个路径得到File对象
 *         File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
 *         File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
 */

public class FileDemo01 {
    public static void main(String[] args) {
        //File(String pathname):根据一个路径得到File对象
        //file:文件和目录(文件夹)路径名的抽象表示形式,表示file指向这个f:\\text.txt下的文件,至于是否存在是今后的操作
        File file = new File("f:\\files\\text.txt");
        
        //File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
        File file2 = new File("f:\\files","text.txt");
        
        //File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
        File file3 = new File("f:\\files");
        File file4 = new File(file3,"text.txt");
    }

}

 

前面只是创建了一个File类的实例,文件还是没有创建出来下面,我们要创建文件:

(1)

import java.io.File;
import java.io.IOException;

public class FileDemo {

    public static void main(String[] args) throws IOException {
        //需求在f盘下temp文件夹下 创建files文件夹,指引出创建的目的路径
        File file = new File("f:\\temp\\files");
        System.out.println("创建文件夹:"+file.mkdir());
//在刚刚创建的files文件夹下创建文件text.txt,指引出创建的目的路径 File file2
= new File("f:\\temp\\files\\text.txt"); System.out.println("创建文件:"+file2.createNewFile()); } }

(2)

import java.io.File;
import java.io.IOException;

/*
 *创建功能:
 *public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
 *public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
 *public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
 *
 */
public class FileDemo {
    public static void main(String[] args) throws IOException {
        // 需求:我要在e盘目录下创建一个文件夹demo
        File file = new File("e:\\demo");
        System.out.println("mkdir:" + file.mkdir());

        // 需求:我要在e盘目录demo下创建一个文件a.txt
        File file2 = new File("e:\\demo\\a.txt");
        System.out.println("createNewFile:" + file2.createNewFile());

        // 需求:我要在e盘目录test下创建一个文件b.txt
        // Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
        // 注意:要想在某个目录下创建内容,该目录首先必须存在。
        // File file3 = new File("e:\\test\\b.txt");
        // System.out.println("createNewFile:" + file3.createNewFile());

        // 需求:我要在e盘目录test下创建aaa目录,这是错误的
        // File file4 = new File("e:\\test\\aaa");
        // System.out.println("mkdir:" + file4.mkdir());

//这里是可以实现的,但是往往多层目录这样创建是很繁琐的,往往使用下一种方法mkdirs()
// File file5 = new File("e:\\test"); // File file6 = new File("e:\\test\\aaa"); // System.out.println("mkdir:" + file5.mkdir()); // System.out.println("mkdir:" + file6.mkdir());

// 其实我们有更简单的方法 File file7 = new File("e:\\aaa\\bbb\\ccc\\ddd"); System.out.println("mkdirs:" + file7.mkdirs()); // 看下面的这个东西: File file8 = new File("e:\\liuyi\\a.txt"); System.out.println("mkdirs:" + file8.mkdirs()); } }

其他关于File操作详见Android(java)学习笔记87

 

 

2.IO流

 2.1  字节输入输出流 InputStream 和 OutputStream(基类 抽象类)

       一个流是字节的源或目的地,其次序是有意义的。例如,一个需要键盘输入的程序可以用流来做到这一点。流可以分成两种:输入流和输出流。可以从输入流读,但不能对它写。要进行写操作就必须使用输出流

       InputStream 和 OutputStream是Java流类中的两个最基本的类,Java中所有其他的流类都是继承自这两个类

 

 

 InputStream类的主要方法:

                   int available()                  返回当前流中可用的字节数                            

                             void close()                     关闭当前流对象    

                           void mark (int readlimit)     在流中作标记 

                           boolean markSupported ()  判断流是否支持标记和复位操作                                    

                           abstract int read ()           从流中读出一个字节的数据 

                           int read (byte[] b)            从流中读取数据并存放到数组b中 

                           int read(byte[] b, int off,int len)  从流的指定地方开始读取指定长度的数据到数组b中 

                           void reset()     返回流中标记过的位置 

                           long skip(long n)    跳过流中的指定字数

 

 

 OutputStream类的主要方法 


                             void close () 关闭当前流对象 
                             void flush () 强制缓冲区中的所有数据写入到流中 
                             void write (byte[] b) 向流中写入一个字节数组
                             void write (byte[] b,int off,int len) 向流中写入数组b中从off位置开始长度为len数据 
                             abstract void write (int b) 向流中写入一个字节

通常由于InputStream 和 OutputStream的方法都比较低级,所以很少直接使用,而是往往通过他们的子类去实现更高级的操作,使得输入输出更加便捷。

 

2.1.1 字节文件的输入输出流 FileInputStream 和 FileOutputStream(InputStream 和 OutputStream的子类,具体实现类

     FileInputStream 和 FileOutputStream分别是InputStream 和 OutputStream的子类,我们往往使用FileInputStream 和 FileOutputStream这两个子类去就可以从一个指定文件中读取或者向某一个文件中写入数据。

     如果创建FileInputStream 和 FileOutputStream对象,那我们必须指定 文件的路径和文件名,对象被创建之后,流就打开了,程序结尾处必须结束流的操作。关闭流,释放资源。

   (1)首先使用FileInputStream

package com.himi.itcast_02;

import java.io.FileInputStream;


public class FileDemo1 {

    public static void main(String[] args) throws Exception {
         FileInputStream fis = new FileInputStream("f:\\temp\\files\\text.txt");//打开指定的字节文件输出流
         byte[] b = new byte[fis.available()];//新建一个字节数组,大小为fis输出流的字节数
         fis.read(b);//读取fis字节流中文件到字节数组b之中
         fis.close();//及时fis关闭字节流,释放资源
         String str = new String(b);
         System.out.println(str);//读取文件内容

    }

}

输出结果为:123456789---Juckly  (当然之前在f:\\temp\\files\\处必然有文件text.txt

   (2)使用FileOutputStream

package com.himi.itcast_02;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class FileDemo2 {
    public static void main(String[] args) throws Exception {
        FileOutputStream fos = new FileOutputStream("f:\\temp\\files\\feeling.txt");
        byte[] data = "我爱朱茵".getBytes("GB2312");
        fos.write(data);
        fos.close();    
        
    }

}

找到相应的目的目录下,如下所示:

技术分享

 

打开文件feeling.txt如下结果:

技术分享

 

 

 

 

2.1.2  字节缓冲输入输出流 BufferedInputStreamBufferedOutputStreamInputStream 和 OutputStream的子类,具体实现类

前面所使用的字节输入流和字节输出流是以字节为单位进行读写操作的,这样一来就使得文件流效率很低,这时候就要使用缓冲输入流(BufferedInputStream) 和 缓冲输出流 BufferedOutputStream)。

输入数据的时候,将数据存放到一个缓冲区之中,当需要对数据操作的读写操作的时候,直接访问缓冲区。

当输出数据的时候,数据不会直接向输出流输出,而是先将数据写入缓冲区,当缓冲区中的数据满时候,才会将缓冲区中的数据写入输出流中,这样一来就大大提高了输入输出的效率。

(1)BufferedInputStream 使用

BufferedInputStream(InputStream in)
          Constructs a new BufferedInputStream on the InputStream in.
BufferedInputStream(InputStream in, int size)
          Constructs a new BufferedInputStream on the InputStream in.

BufferedInputStream 使用的代码示例:

package com.himi.itcast_02;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class FileDemo3 {
    public static void main(String[] args) throws IOException {
        // BufferedInputStream(InputStream in)
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                "f:\\temp\\files\\text.txt"));

        // 读取数据
        // int by = 0;
        // while ((by = bis.read()) != -1) {
        // System.out.print((char) by);
        // }
        // System.out.println("---------");
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            System.out.print(new String(bys, 0, len));
        }

        // 释放资源
        bis.close();
    }

}

输出结果为:123456789---Juckly

 

(2)BufferedOutputStream使用

package com.himi.itcast_02;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
 * 通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。
 * 既然是这样的话,那么,java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。
 * 这种类被称为:缓冲区类(高效类)
 * 写数据:BufferedOutputStream
 * 读数据:BufferedInputStream
 * 
 * 构造方法可以指定缓冲区的大小,但是我们一般用不上,因为默认缓冲区大小就足够了。
 * 
 * 为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?
 * 原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。
 */

public class FileDemo5 {
    public static void main(String[] args) throws IOException {
        // BufferedOutputStream(OutputStream out)
        // FileOutputStream fos = new FileOutputStream("bos.txt");
        // BufferedOutputStream bos = new BufferedOutputStream(fos);
        // 简单写法
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("f:\\temp\\files\\helloworld.txt"));

        // 写数据
        bos.write("朱茵5201314".getBytes());

        // 释放资源
        bos.close();
    }

}

输出结果如下

技术分享

 

 

2.1.3   字节数据输入输出流 DataInputStreamDataOutputStreamInputStream 和 OutputStream的子类,具体实现类

package com.vincent.example;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestDataStream {
    public static void main(String[] args) {
        // 使用DataInputStream,DataOutputStream写入文件且从文件中读取数据。
        try {
            // Data Stream写到输入流中
            DataOutputStream dos = new DataOutputStream(new FileOutputStream(
                    "datasteam.txt"));
            dos.writeBytes("世界"); //按2字节写入,都是写入的低位
            dos.writeChars("世界"); // 按照Unicode写入
            // 按照UTF-8写入(UTF8变长,开头2字节是由writeUTF函数写入的长度信息,方便readUTF函数读取)
            dos.writeUTF("世界"); 
            dos.flush();
            dos.close();

            // Data Stream 读取
            DataInputStream dis = new DataInputStream(new FileInputStream(
                    "datasteam.txt"));
            // 读取字节
            byte[] b = new byte[2];
            dis.read(b);
            System.out.println(new String(b, 0, 2));

            // 读取字符
            char[] c = new char[2];
            for (int i = 0; i < 2; i++) {
                c[i] = dis.readChar();
            }
            System.out.println(new String(c, 0, 2));

            // 读取UTF
            System.out.println(dis.readUTF());

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

输出结果:

技术分享

 

用16进制方式打开文件如下:

技术分享

可以看出,第一个“世界”已经被截断,两个汉字都只被写入了低位,因此肯定乱码。

 

2.1.4字节对象输入输出流 ObjectInputStream 和 ObjectOutputStream(不常用)

 

 

2.2 字符流 Reader 和Writer

Reader类是字符输入流的基类,Writer是字符输出流的基类

Android(java)学习笔记167:Java中操作文件的类介绍

标签:

原文地址:http://www.cnblogs.com/hebao0514/p/4735019.html

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