• 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);
    }
    『愿你我既可以朝九晚五,又能够浪迹天涯』
  • 相关阅读:
    robotframework eclipse Robot Reference libraries不显示(selenium library无法导入)问题解决办法
    Navicat_Keygen_Patch 5.6如何使用
    电子标签拣货系统DPS
    matplotlib中的bar图
    Windows 10 清除文件
    npm包的上传npm包的步骤,与更新和下载步骤
    深入理解JWT的使用场景和优劣
    关于Vue.js去掉#号路由
    关于sklearn中的导包交叉验证问题
    python函数作用域
  • 原文地址:https://www.cnblogs.com/zjwwljty/p/6879587.html
Copyright © 2020-2023  润新知