java—IO,常用的文件操作

IO是指Input/Output,即输入和输出。以内存为中心:

  • Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等。
  • Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等等。

File对象

Java的标准库java.io提供了File对象来操作文件和目录

/**
 *  常用方法
 * exists 判断是否存在
 * isFile 判断是不是文件
 * isDirectory 判断是否文件夹
 * createNewFile 创建文件
 * mkdir 创建文件夹,mkdirs递归创建
 * delete 删除文件
 * canRead 是否可读
 * canWrite 是否可写
 * canExecute 是否可执行
 * deleteOnExit jvm退出时删除
 */
@Test
public void demo1(){
    
    
    //file对象可以传入目录,或者文件路径
    File file = new File("D:\\test\\aa");
    //遍历下面所有一级目录的文件
    for(File f : file.listFiles()){
    
    
        System.out.println(f.getName());
    }
}

InputStream

InputStream是一个抽象类,是所有输入流的超类,具体实现由子类实现。

FileInputStream,从文件中读取输入流

@Test
public void demo2(){
    
    
    InputStream inputStream = null;
    try {
    
    
        inputStream = new FileInputStream("D:\\test\\hello.txt");
        //定义一个byte[]数组缓冲区,inputStream.read()方法读取字节到缓冲区
        byte[] buffer = new byte[1024];
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()){
    
    
            //read方法返回-1,读取完成
            while (inputStream.read(buffer) != -1) {
    
    
                outputStream.write(buffer);
            }
            System.out.println(outputStream.toString("GBK"));
        }
    } catch (IOException e) {
    
    
        e.printStackTrace();
    }finally {
    
    
        if(inputStream != null){
    
    
            try {
    
    
                inputStream.close(); // 关闭流,释放底层资源
            } catch (IOException ignored) {
    
    
            }
        }
    }
}

OutputStream

OutputStream是一个抽象类,是所有输出流的超类,具体实现由子类实现。

FileOutputStream文件输出流

/**
 * 文件输出
 */
@Test
public void demo3(){
    
    
    InputStream inputStream = null;
    try {
    
    
        inputStream = new FileInputStream("D:\\test\\hello.txt");
        //定义一个byte[]数组缓冲区,inputStream.read()方法读取字节到缓冲区
        byte[] buffer = new byte[1024];
        try (OutputStream outputStream = new FileOutputStream("D:\\test\\hello-cp.txt")){
    
    
            //read方法返回-1,读取完成
            while (inputStream.read(buffer) != -1) {
    
    
                outputStream.write(buffer);
            }
        }
    } catch (IOException e) {
    
    
        e.printStackTrace();
    }finally {
    
    
        if(inputStream != null){
    
    
            try {
    
    
                inputStream.close(); // 关闭流,释放底层资源
            } catch (IOException ignored) {
    
    
            }
        }
    }
}

/**
 * 字符串输出
 */
@Test
public void demo4(){
    
    
    String str = "输出字符串\r\n" +
            "字符串输出字\r\n";
    try (OutputStream outputStream = new FileOutputStream("D:\\test\\out.txt")){
    
    
        outputStream.write(str.getBytes());
        outputStream.flush();
    }catch (IOException e){
    
    
        e.printStackTrace();
    }
}

操作ZIP

/**
 * 读取zip内容
 */
@Test
public void demo5(){
    
    
    try(ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("D:\\test\\ziptest.zip"))){
    
    
        //ZipEntry表示一个压缩文件或目录
        ZipEntry zipEntry = null;
        while ((zipEntry = zipInputStream.getNextEntry()) != null){
    
    
            String name = zipEntry.getName();
            if(!zipEntry.isDirectory()){
    
    
                System.out.println("文件名称:" + name);
                InputStream inputStream = new ZipFile("D:\\test\\ziptest.zip").getInputStream(zipEntry);
                //输出文件内容
                printString(inputStream);
            }else {
    
    
                System.out.println("目录:" + name);
            }
        }
    } catch (IOException e) {
    
    
        e.printStackTrace();
    }
}

/**
 * 压缩zip
 * @throws Exception
 */
@Test
public void demo6() throws Exception{
    
    
    ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("D:\\test\\test.zip"));
    File[] files = new File("D:\\test\\压缩测试文件目录").listFiles();//读取本地目录下的所有文件
    for(File f: files){
    
    
        //多一级目录mk
        zipOutputStream.putNextEntry(new ZipEntry("mk\\"+ f.getName()));
        InputStream in = new FileInputStream(f);
        byte[] bytes = new byte[100];
        while (in.read(bytes) != -1){
    
    
            zipOutputStream.write(bytes);
        }
        zipOutputStream.closeEntry();
    }
    zipOutputStream.close();
}



private void printString(InputStream inputStream) {
    
    
    try {
    
    
        //定义一个byte[]数组缓冲区,inputStream.read()方法读取字节到缓冲区
        byte[] buffer = new byte[1024];
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
    
    
            //read方法返回-1,读取完成
            while (inputStream.read(buffer) != -1) {
    
    
                outputStream.write(buffer);
            }
            System.out.println(outputStream.toString("GBK"));
        }
    } catch (IOException e) {
    
    
        e.printStackTrace();
    } finally {
    
    
        if (inputStream != null) {
    
    
            try {
    
    
                inputStream.close(); // 关闭流,释放底层资源
            } catch (IOException ignored) {
    
    
            }
        }
    }
}

Reader

Reader跟InputStream的区别是,InputStream是一个字节流,即以byte为单位读取,而Reader是一个字符流,即以char为单位读取。

FileReader是Reader的子类,用于对文件的读取

/**
 * 读取文件内容
 * @throws Exception
 */
@Test
public void demo7() throws Exception{
    
    
    //可以用InputStream构建
    //Reader reader = new InputStreamReader(new FileInputStream("D:\\test\\out.txt"));
    Reader reader = new FileReader("D:\\test\\out.txt");
    char[] buffer = new char[100];
    while (reader.read(buffer) != - 1){
    
    
        //每次读取输出
        System.out.println(new String(buffer));
    }
    reader.close();
}

Writer

Writer跟OutputStream的区别是,OutputStream是以字节(byte)为单位,Writer以字符(char)为单位。

@Test
public void demo8() throws Exception{
    
    
    //用OutputStream构建
    //Writer writer = new OutputStreamWriter(new FileOutputStream("D:\\test\\out.txt"));
    Writer writer = new FileWriter("D:\\test\\out.txt");
    writer.write("写入字符串123");
    writer.flush();
    writer.close();
}

PrintStream

PrintStream是一种FilterOutputStream,它在OutputStream的接口上,额外提供了一些写入各种数据类型的方法

@Test
public void demo9() throws Exception{
    
    
    PrintStream printStream = new PrintStream("D:\\test\\out.txt");
    //输出string字符串到文件中
    printStream.println("输出到文件里一个什么");
    printStream.flush();
    printStream.close();
}

Files

从Java 7开始,提供了FilesPaths这两个工具类,封装了很多读写文件的简单方法,极大地方便我们读写文件。

@Test
public void demo10() throws Exception{
    
    
    //把文件内容全部读成byte数组
    byte[] bytes = Files.readAllBytes(Paths.get("D:\\test\\out.txt"));
    System.out.println(new String(bytes));

    //文本文件按行返回内容
    List<String> list = Files.readAllLines(Paths.get("D:\\test\\out.txt"));
    list.forEach(System.out::println);

    //写入操作byte数组
    Files.write(Paths.get("D:\\test\\out.txt"),"写入".getBytes());

    //复制文件
    Files.copy(Paths.get("D:\\test\\out.txt"),new FileOutputStream("D:\\test\\out-cp.txt"));

    //文件移动
    Files.move(Paths.get("D:\\test\\out.txt"),Paths.get("D:\\test\\cp\\o.txt") ,StandardCopyOption.ATOMIC_MOVE);
}

猜你喜欢

转载自blog.csdn.net/zhaoqingquanajax/article/details/114214199