现在的位置: 首页 > 综合 > 正文

《Java编程思想》第18章 Java I/O系统

2018年04月10日 ⁄ 综合 ⁄ 共 4892字 ⁄ 字号 评论关闭

《第18 Java
I/O
系统》

任何自InputStreamReader派生而来的类都含有read()基本方法。

 

ReaderWriter类提供天然的Unicode操作。

在某些场合,面向字节的InputStreamOutputStream才是正确的解决方案。

特别是java.util.zip类库就是面向字节的而不是面向字符的。

 

自我独立的类:RandomAccessFile 

public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable

不是InputStreamOutputStream继承层次结构中的一部分。

我们可以在一个文件内向前和向后移动。

只有RandomAccessFile支持搜寻方法,并且只适用于文件。

 

18.6 I/O流的典型使用方式 典型I/O用法基本参考

18.6.1 缓冲输入文件 想要打开一个文件用于字符输入,可以使用StringFile对象作为文件名的FileInputReader

为了提高速度,我们希望对那个文件进行缓冲,那么我们将所产生的引用传给一个BufferedReader构造器,也提供readLine()方法。

import java.io.*;

public class BufferedInputFile{

public static String read(String filename)throws IOException{//Reading input by lines

BufferedReader in = new BufferedReader(new FileReader(filename) );

String s;

StringBuilder sb = new StringBuilder();

while( (s = in.readLine())!=null )

sb.append(s+"\n");

in.close();

return sb.toString();

}

public static void main(String[] args)throws IOException{

System.out.println(read("BufferedInputFile.java"));

}

}

从内存输入

public class MemoryInput{

public static void main(String[] args)throws IOException{

StringReader in = new StringReader(BufferedInputFile.read("MemoryInput.java"));

int c;

while((c = in.read())!= -1)

System.out.print((char)c);

}

}

格式化的内存输入:

要读取格式化数据,可以使用DataInputStream,它是一个面向字节的I/O类,不是面向字符的。

public class FormattedMemoryInput{

public static void main(String[] args)throws IOException{

try{

DataInputStream in = new DataInputStream(

new ByteArrayInputStream(

BufferedInputFile.read(

"FormattedMemoryInput.java").getBytes()));

while(true)

System.out.print((char)in.readByte());

}catch(EOFException e){

System.err.println("End of stream");

}

}

}

 

 

 


 

 

创建文件 public boolean createNewFile() throws IOException

假设:现在要在d 盘上创建一个test.txt 文件。

在各个操作系统中,实际上路径的分隔符是不一样的,例如:windows 中使用反斜杠:“\”,linux 中使用正斜杠:“/

import java.io.File ;

import java.io.IOException ;

public class FileDemo{

    public static void main(String args[]){

        File file = new File("d:"+File.separator+"test.txt") ; // 实例化File类的对象

        try{

            file.createNewFile() ; // 创建文件,根据给定的路径创建

        }catch(IOException e){

            e.printStackTrace() ; // 输出异常信息

        }

    }

}  

删除文件:public boolean delete()

File 类中可以使用 exists() 方法判断一个文件是否存在:public
boolean exists()

import java.io.File ;

import java.io.IOException ;

public class FileDemo{

    public static void main(String args[]){

        File f = new File("d:"+File.separator+"test.txt") ; // 实例化File类的对象

        if(f.exists()){ // 如果文件存在则删除

            f.delete() ; // 删除文件

        }

    }

}  

创建文件夹:

import java.io.File ;

import java.io.IOException ;

public class FileDemo{

    public static void main(String args[]){

        File f = new File("d:"+File.separator+"mldn") ; // 实例化File类的对象

        f.mkdir() ; // 创建文件夹

    }

}

列出指定目录的全部文件

如果现在给出了一个目录,则可以直接列出目录中的内容,但是列出的方法在File 类中存在两个:

以字符串数组的形式返回:public String[] list()

 File 数组的形式返回: public
File[] listFiles()

操作一: 使用list() 列出全部内容

import java.io.File ;

import java.io.IOException ;

public class FileDemo{

    public static void main(String args[]){

        File f = new File("d:"+File.separator) ; // 实例化File类的对象

        String str[] = f.list() ; // 列出给定目录中的内容

        for(int i=0;i<str.length;i++){

            System.out.println(str[i]) ;

        }

    }

} //360Downloads

 操作二: 使用listFiles() 列出全部内容(带路径)

import java.io.File ;

import java.io.IOException ;

public class FileDemo{

    public static void main(String args[]){

        File f = new File("d:"+File.separator) ; // 实例化File类的对象

        File files[] = f.listFiles() ; // 列出全部内容

        for(int i=0;i<files.length;i++){

            System.out.println(files[i]) ;

        }

    }

} //d:\360Downloads

 

 

要求:列出指定目录的全部内容

如果给定了一个目录,则要求将此目录中的全部文件都列出来,但是列的时候还会存在子文件夹。

import java.io.File ;

import java.io.IOException ;

public class FileDemo{

    public static void main(String args[]){

        File my = new File("d:" + File.separator) ; // 操作路径

        print(my) ;

    }

    public static void print(File file){ // 递归调用

        if(file!=null){ // 判断对象是否为空

            if(file.isDirectory()){ // 如果是目录

                File f[] = file.listFiles() ; // 列出全部的文件

                if(f!=null){ // 判断此目录能否列出

                    for(int i=0;i<f.length;i++){

                        print(f[i]) ; // 因为给的路径有可能是目录,所以,继续判断

                    }

                }

            }else{

                System.out.println(file) ; // 输出路径

            }

        }

    }

}  

总结:

1.File 类是在java.io 包中唯一与文件本身有关的

2.可以使用File 类创建、删除等常见的文件操作

3.在使用File 类指定路径的时候一定要注意操作系统间的差异。

 

Java编程思想》中的代码

package IO;

import java.util.regex.*;

import java.io.*;

import java.util.*;

public class DirList {

 public static void main(String args[]){

  File path = new File(".");

  String[] list;

  if(args.length == 0)

   list = path.list();

  else

   list = path.list(new DirFilter(args[0]));

 

  Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);

  for(String dirItem : list)

   System.out.println(dirItem);

 }

}

class DirFilter implements FilenameFilter{

 private Pattern pattern;

 public DirFilter(String regex){

  pattern = Pattern.compile(regex);

 }

 public boolean accept(File dir,String name){

  return pattern.matcher(name).matches();

 }

}



Java I/O

整理于20140903

Java编程思想》 PDF-558

理解I/O类库的演化过程:目的是掌握什么时候该使用哪些类,什么时候不该使用哪些类。

18.1 File

实用工具类库:处理文件目录问题

FilePath(文件路径)对这个类来说是个更好的名字。

 

18.1.1 目录列表器

import java.util.regex.*;

匿名内部类

 

注意上图中:传递给mian方法的参数必须是final的,因为匿名内部类的原因。

这样匿名内部类才能够使用来自该类范围之外的对象。

 

18.1.2 目录实用工具

18.1.3 目录的检查与创建

 

18.2 输入输出 P566

输入:InputStream

输出:OutputStream

18.2.1 InputStream类型

18.2.2 OutputStream类型

18.3 添加属性和有用的接口

 

P535 I/O类库:不同功能的组合(装饰器模式)

18.6 I/O流的典型使用方式

18.12 对象序列化 20140904


抱歉!评论已关闭.