Java IO (下)

转载自并发编程网 – ifeve.com

File

Java IO API中的FIle类可以让你访问底层文件系统,通过File类,你可以做到以下几点:

  • 检测文件是否存在
  • 读取文件长度
  • 重命名或移动文件
  • 删除文件
  • 检测某个路径是文件还是目录
  • 读取目录中的文件列表
 1 @Test
 2 public void fileTest () throws IOException{
 3     //实例化一个java.io.File对象
 4     File file = new File("d:\\fileTest.txt");
 5     //检测文件是否存在
 6     if (file.exists()) {
 7         //文件长度
 8         System.out.println(file.length());
 9     }
10     //重命名或移动文件
11     boolean flag=file.renameTo(new File("d:\\fileTest3.txt"));
12     if (flag) {
13         //删除文件
14         System.out.println(file.delete());
15     }
16     
17     File file2 = new File("d:\\file");
18     //可以通过调用isDirectory()方法,可以判断当前File对象指向的是文件还是目录。
19     //当方法返回值是true时,File指向的是目录,否则指向的是文件
20     boolean isDirectory = file2.isDirectory();
21     if (isDirectory) {
22         //list()方法返回当前File对象指向的目录中所有文件与子目录的字符串名称
23         String[] fileNames = file.list();
24         for (int i = 0; i < fileNames.length; i++) {
25             System.out.println(fileNames[i]);
26         }
27     }
28 }

BufferedInputStream

BufferedInputStream能为输入流提供缓冲区,能提高很多IO的速度。你可以一次读取一大块的数据,而不需要每次从网络或者磁盘中一次读取一个字节。特别是在访问大量磁盘数据时,缓冲通常会让IO快上许多。

BufferedOutputStream

与BufferedInputStream类似,BufferedOutputStream可以为输出流提供缓冲区。可以构造一个使用默认大小缓冲区的BufferedOutputStream

@Test
public void bufferedInputStream () throws IOException{
    InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"));
    //给构造函数传递一个值,设置内部使用的缓冲区设置大小(默认缓冲区大小8 * 1024B)
    InputStream input2 = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"),8*1024);
    //除了能够为输入流提供缓冲区以外,其余方面BufferedInputStream基本与InputStream类似
}

DataInputStream

DataInputStream可以使你从输入流中读取Java基本类型数据,而不必每次读取字节数据。你可以把InputStream包装到DataInputStream中,然后就可以从此输入流中读取基本类型数据了

@Test
public void dataInputStream () throws IOException{
    DataInputStream input = new DataInputStream(new FileInputStream("binary.data"));
    int aByte = input.read();
    int anInt = input.readInt();
    float aFloat = input.readFloat();
    double aDouble = input.readDouble();
    input.close();
}

当你要读取的数据中包含了int,long,float,double这样的基本类型变量时,DataInputStream可以很方便地处理这些数据。

DataOutputStream

DataOutputStream可以往输出流中写入Java基本类型数据

@Test
public void dataInputStream() throws IOException {
    DataOutputStream output = new DataOutputStream(new FileOutputStream(
            "binary.data"));
    output.write(45);
    // byte data 
    output.writeInt(4545);
    // int data 
    output.writeDouble(109.123);
    // double data 
    output.close();
}

Reader

Reader是Java IO中所有Reader的基类。Reader与InputStream类似,不同点在于,Reader基于字符而非基于字节。

换句话说,Reader用于读取文本,而InputStream用于读取原始字节。

Writer

Writer是Java IO中所有Writer的基类。与Reader和InputStream的关系类似,Writer基于字符而非基于字节,Writer用于写入文本,OutputStream用于写入字节。

同样,你最好使用Writer的子类,不需要直接使用Writer,因为子类的实现更加明确,更能表现你的意图。常用子类包括OutputStreamWriter,CharArrayWriter,FileWriter等。

IO中的类要么以Stream结尾,要么以Reader或者Writer结尾,那这两个同时以字节流和字符流的类名后缀结尾的类是什么用途呢?

简单来说,这两个类把字节流转换成字符流,中间做了数据的转换,类似适配器模式的思想。

InputStreamReader

InputStreamReader会包含一个InputStream,从而可以将该输入字节流转换成字符流

@Test
public void inputStreamReader() throws IOException {
    InputStream inputStream = new FileInputStream("c:\\data\\input.txt");
    Reader reader = new InputStreamReader(inputStream);
    int data = reader.read();
    while(data != -1){
        char theChar = (char) data;
        data = reader.read();
    }
    reader.close();
}

OutputStreamWriter

OutputStreamWriter会包含一个OutputStream,从而可以将该输出字节流转换成字符流

@Test
public void outputStreamWriter() throws IOException {
    OutputStream outputStream = new FileOutputStream("c:\\data\\output.txt");
    Writer writer = new OutputStreamWriter(outputStream);
    writer.write("Hello World");
    writer.close();
}

FileReader

FileReader能够以字符流的形式读取文件内容。除了读取的单位不同之外(译者注:FileReader读取字符,FileInputStream读取字节),FileReader与FileInputStream并无太大差异,

也就是说,FileReader用于读取文本。根据不同的编码方案,一个字符可能会相当于一个或者多个字节。

@Test
public void fileReader() throws IOException {
    Reader reader = new FileReader("c:\\data\\input-text.txt");
    int data = reader.read();
    while(data != -1) {
        //do something with data...
        data = reader.read();
    }
    reader.close();
}

FileReader会假设你想使用你所使用的JVM的版本的默认编码处理字节流,但是这通常不是你想要的,你可以手动设置编码方案。

如果你想明确指定一种编码方案,利用InputStreamReader配合FileInputStream来替代FileReader(译者注:FileReader没有可以指定编码的构造函数)。

InputStreamReader可以让你设置编码处理从底层文件中读取的字节。

FileWriter

FileWriter能够把数据以字符流的形式写入文件。同样是处理文件,FileWriter处理字符,FileOutputStream处理字节。根据不同的编码方案,一个字符可能会相当于一个或者多个字节

BufferedReader

BufferedReader能为字符输入流提供缓冲区,可以提高许多IO处理的速度。你可以一次读取一大块的数据,而不需要每次从网络或者磁盘中一次读取一个字节。特别是在访问大量磁盘数据时,缓冲通常会让IO快上许多。

BufferedReader和BufferedInputStream的主要区别在于,BufferedReader操作字符,而BufferedInputStream操作原始字节。只需要把Reader包装到BufferedReader中,就可以为Reader添加缓冲区(译者注:默认缓冲区大小为8192字节,即8KB)。代码如下:

@Test
public void bufferedReader() throws IOException {
    //把Reader包装到BufferedReader中,就可以为Reader添加缓冲区
    Reader input1 = new BufferedReader(new FileReader("c:\\data\\input-file.txt"));
    //指定缓冲区大小
    Reader input2 = new BufferedReader(new FileReader("c:\\data\\input-file.txt"), 8 * 1024);
    //指定编码
    Reader input3 = new BufferedReader(new InputStreamReader(new FileInputStream(""), "gbk"));  
}

BufferedWriter

与BufferedReader类似,BufferedWriter可以为输出流提供缓冲区。可以构造一个使用默认大小缓冲区的BufferedWriter(译者注:默认缓冲区大小8 * 1024B),代码如下:

@Test
public void bufferedWriter() throws IOException {
    Writer writer1 = new BufferedWriter(new FileWriter("c:\\data\\output-file.txt"));
    Writer writer2 = new BufferedWriter(new FileWriter("c:\\data\\output-file.txt"), 8 * 1024);
}

 

posted @ 2017-05-19 17:33  不像程序员  阅读(187)  评论(0编辑  收藏  举报