一,File类

File类位于java.io包下,用来表示文件(目录)。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

File类只用于表示文件(目录)的信息(文件名称,文件大小),不能用于文件内容的访问

1,File的基本操作

 

package com.amazing.jdk.learn2IO_0821.FileAPI;

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

/**
 * Created by yaming on 17-8-21.
 */
public class FileDemo {
    public static void main(String[] args) {
        //window,linux系统文件分割符不同,可以使用File.separator设置分隔符。适用window和linux
        File fileSeparator=new File("e:"+File.separator+"javaio"+File.separator+"test");


        /**
         * 1,操作目录
         */
        File file=new File("/home/yaming/Desktop/filedemo");

        //查看目录是否存在,不存在就创建
        System.out.println(file.exists());

        if(!file.exists())
            file.mkdir();
        else
            file.delete();

        //判断是否是一个目录,如果是目录返回true.如果不是目录或目录不存在,返回false
        boolean flag1 = file.isDirectory();

        //判断是否是一个文件
        boolean flag2 = file.isFile();


        /**
         * 操作文件
         */
        //判断文件是否存在
        File file2=new File("/home/yaming/Desktop/日记.txt");
        //不存在就创建文件
        if (!file2.exists()){
            try {
                file2.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            file2.delete();
        }


        /**
         * 常用File对象的API
         */

        //打印file,打印的是file.toString()的内容
        System.out.println(file);

        //目录绝对路径
        System.out.println(file.getAbsoluteFile());

        //打印目录最后一级的名字
        System.out.println(file.getName());

        //打印文件名字
        System.out.println(file2.getName());

        //访问父目录,目录路径
        String parentPath = file.getParent();

    }
}

2,File类常用操作

遍历目录:

package com.amazing.jdk.learn2IO_0821.FileAPI;

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

/**
 * Created by yaming on 19-5-4.
 */
public class FileUtils {


    /**
     * 列出指定目录下(包括子目录)的所有文件
     * @param dir
     * @throws IOException
     */
    public static void listDirectory(File dir)throws IOException{

        if(!dir.exists()){
            throw new IllegalArgumentException("目录不存在");
        }

        if (!dir.isDirectory()){
            throw new IllegalArgumentException(dir+"不是目录");
        }

        File[] files = dir.listFiles();//返回的是直接子目录(文件)的抽象
        if (files != null && files.length >0){
            for (File file : files){
                if (file.isDirectory()){
                    //递归
                    listDirectory(file);
                }else {
                    System.out.println(file);
                }
            }
        }
    }
}

 

二,RandomAccessFile类的使用

java提供的对文件内容的访问,既可以读文件,也可以写文件。

RandomAccessFile支持随机访问文件,可以访问文件的任意位置

1,java文件模型:

  在硬盘上的文件是byte byte byte存储的,是数据的集合

2,打开文件

  有两种模式  "rw"(读写模式), "r" (只读模式)

  RandomAccessFile raf = new RandomAccessFile(file,"rw")

  文件指针,打开文件时指针在开头 pointer = 0; 读写操作后,指针向后移动(写和读的时候指针都会移动)

3,写方法

  raf.write(int) ---->只写一个字节(后8位),同时指针指向下一个位置,然后再次写入

4,读方法

  int b = raf.read() ----> 读一个字节

5,文件读写完成后一定要关闭

6,代码:

package com.amazing.jdk.learn2IO_0821.FileAPI;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;

/**
 * Created by yaming on 19-5-4.
 */
public class RafDemo {

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

        File demo=new File("demo");
        
        if (!demo.exists()){
            demo.mkdir();
        }
        
        File file = new File(demo,"raf.dat");
        if (!file.exists()){
            file.createNewFile();
        }

        RandomAccessFile raf = new RandomAccessFile(file,"rw");
        //指针的位置
        System.out.println(raf.getFilePointer());
        
        raf.write('A');//只写了一个字节
        System.out.println(raf.getFilePointer());
        
        raf.write('B');
        
        
        int i = 0x7fffffff;//这是最大的整数
        //写一个Int值,用write方法每次只能写一个字节,如果要把i写进去就得写4次
        raf.write(i >>> 24);//高8位
        raf.write(i >>> 14);//高8位
        raf.write(i >>> 8);//高8位
        raf.write(i);//最低8位

        System.out.println(raf.getFilePointer()); //打印:6
        
        
        //可以直接写一个int
        raf.writeInt(i);
        
        
        //写中文
        String s = "";
        byte[] gbk = s.getBytes("gbk");
        //转成gbk,一个汉字两个字节
        raf.write(gbk);
        System.out.println(raf.length());//打印:12


        /**
         * 读文件
         * 
         */
        //1,必须把指针移动到头部
        raf.seek(0);
        //一次性读取,把文件中的内容都读取到字节数组中
        byte[] buf = new byte[(int) raf.length()];
        raf.read(buf);
        System.out.println(Arrays.toString(buf));
        
    }
}

 三,字节流

1,文件输入流

1.1,InputStream,OutputStream

  InputStream抽象了应用程序读取数据的方式

  OutputStream抽象了应用程序写出数据的方式

1.2,EOF = end 读到-1就读到结尾

1.3,输入流基本方法

我们把键盘作为一个文件,键盘是输入,比如往记事本里写数据。实际上是从键盘文件读取了数据,然后写入到了txt文件。

所以键盘是一个输入文件,是用来读的。我们从键盘上读的东西,写到了文本文件里。所以输入流的基本方法是读

int b = in.read();读取一个字节,无符号填充到int的低八位,高八位补零。 -1是EOF

in.read(byte[] buf);读取数据填充到字节数组buf

in.read(byte[],int start,int size);读取数据到字节数组buf中,从buf的start位置开始,存放size长度的数据

1.4,输出流基本方法

out.write(int b);写出一个byte到流,b的低8位。

out.write(byte[] buf);将buf字节数组都写入到流

out.write(byte[] buf ,int start, int size);字节数组buf从start位置开始写size长度的字节到流

1.5,FileInputStream --->具体实现了在文件上读取数据

代码:

 

package com.amazing.jdk.learn2IO_0821.stream;

import java.io.*;

/**
 * Created by yaming on 17-8-21.
 * 工具类
 */
public class IOUtils {
    /**
     *需求:读取指定文件内容,按照16进制输出到控制台
     * 并且每输出10个byte换行。读到最后一个
     */
    public static void printHex(String fileName) throws IOException {
        //构建输入流对象,把文件作为字节流进行读操作
        FileInputStream in = new FileInputStream(fileName);
        int b;
        int i=1;
        while ((b=in.read())!=-1){
            if(b<=0xf){
                //单位的数补零
                System.out.print("0");
            }
            //将整形b转换成16进制表示的字符串
            System.out.print(Integer.toHexString(b)+" ");
            if(i++%10==0){
                //换行
                System.out.println();
            }

        }
        //IO操作后必须关闭
        in.close();

    }

}

 1.6,FileOutputStream --->实现了向文件中写出byte数据的方法

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄