java 常用的文件操作以及I/O流

一、File类的使用
1、概述
java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。

File能创建、删除、重命名文件和目录并获得文件大小、修改时间等,但File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出。

想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。

File对象常常作为参数传递给流的构造器,指明读取或写入的“终点”。

三种创建方式:

import org.testng.annotations.Test;

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


public class FileTest {
    public static void main(){

    }
    //方式1
    @Test
    public void create1() throws IOException {
        String filePath = "d:\\file1.txt";
        File file = new File(filePath);
        try {
            file.createNewFile();
            System.out.println("创建文件1成功");
        }catch (IOException e){
            e.printStackTrace();
        }

    }
    //方式2
    @Test
    public void create2(){
        File parentFile = new File("D:\\");
        String fileName = "file2.txt";
        File file = new File(parentFile,fileName);

        try {
            file.createNewFile();
            System.out.println("文件2 创建成功");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //方式3
    @Test
    public void create3(){
        String parentPath = "d:\\";
        String filePath = "file3.txt";


        File file = new File(parentPath,filePath);

        try {
            file.createNewFile();
            System.out.println("文件3创建成功");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

获取文件的相关信息常见方法:

import org.testng.annotations.Test;

import javax.xml.transform.Source;
import javax.xml.transform.sax.SAXSource;
import java.io.File;
import java.sql.SQLOutput;

public class FileFormation {
    public static void main(String[] args){

    }
    // 获取文件信息
    @Test
    public void Info(){
        //先创建文件对象
        File file = new File("D:\\file1.txt");


        //调用相应方法,得到相应信息
        System.out.println("文件名称:"+file.getName());
        System.out.println("文件绝对路径:"+file.getAbsoluteFile());
        System.out.println("文件父目录:"+file.getParent());
        System.out.println("文件大小(字节):"+file.length());
        System.out.println("文件是否存在:"+file.exists());
        System.out.println("是否是文件:"+file.isFile());
        System.out.println("是否是目录:"+file.isDirectory());
    }
}

 目录的操作:

import org.testng.annotations.Test;

import java.io.File;

public class FileDirectory {
    public static void main(String[] args){

    }
    @Test
    //删除文件
    public void FileDelete(){
        String filePath = "D:\\file1.txt";
        File file = new File(filePath);

        if(file.exists()) {
            if (file.delete()) {
                System.out.println(filePath + " 删除成功");
            } else {
                System.out.println(filePath + " 删除失败");
            };
        }else{
            System.out.println(filePath+ " 文件不存在");
        }
    }

    //删除目录
    @Test
    public void FileDeleteD(){
        String filePath = "D:\\file1.txt";
        File file = new File(filePath);
        if(file.exists()) {
            if (file.delete()) {
                System.out.println(filePath + "删除成功");
            } else {
                System.out.println(filePath + "删除失败");
            };
        }else{
            System.out.println(filePath+ "目录不存在");
        }
    }
    //判断目录是否存在,不存在就创建
    @Test
    public void fileDeleteD1(){
        String dirPath = "D:\\test\\dir1.txt";
        File file = new File(dirPath);

        if(file.exists()){
            System.out.println(dirPath + "该目录已经存在");
        }else{
            if(file.mkdir()){
                System.out.println("创建成功");
            }else{
                System.out.println("创建失败");
            };
        }
    }
}

二、IO流原理及流的分类

1、原理
I/O是Input/Output的缩写,I/O技术用于处理设备之间的数据传输,如读写文件、网络通讯等。

Java程序中,对于数据的输入/输出操作以“流”的方式进行。

java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。

输出:将程序(内存)数据输出到磁盘、光盘等存储设备中。

2、流的分类
按操作数据单位不同分为:字节流(8bit)、字符流(16bit)

按数据流的流向不同分为:输入流、输出流

按流的角色的不同分为:节点流、处理流

Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。

由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

 

3、 具体的实现方法

InputStream的实现方法:

import org.testng.annotations.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class fileInputStream {
    public static void main(String[] args){

    }
    @Test
    public void file1(){
        String filePath="D:\\testfile.txt";
        int readData;

        FileInputStream fileInputStream = null;

        try {
            //创建FileInputStream对象,用于读取文件
            fileInputStream = new FileInputStream(filePath);

            while ((readData = fileInputStream.read())!=-1){
                System.out.println((char)readData);
            };

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭文件流
            try {
                fileInputStream.close();
            }catch (IOException e){
                throw new RuntimeException(e);
            }
        }

    }
    @Test
    public void fileIn2(){
        String filePath = "D:\\testfile.txt";
        int readData;
        int readLength = 0;
        //字节数组
        byte[] buf = new byte[8];
        FileInputStream fileInputStream = null;
        try {
            //创建fileInputStream对象,用于读取文件
            fileInputStream =new FileInputStream(filePath);
            while ((readLength=fileInputStream.read(buf))!=-1){
                System.out.println(new String(buf,0,readLength));
            };
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭文件流
            try {
                fileInputStream.close();
            }catch (IOException e ){
                throw new RuntimeException(e);
            }
        }
    }

    @Test
    public void fileIn3(){
        String filePath = "D:\\testfile.txt";
        int readData;
        int readLength = 0;
        //字节数组
        byte[] buf = new byte[8];

        FileInputStream fileInputStream = null;
        try {
            //创建fileInputStream对象,用于读取文件
            fileInputStream =new FileInputStream(filePath);


            while ((readLength=fileInputStream.read(buf))!=-1){
                System.out.println(new String(buf,0,readLength));
            };
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭文件流
            try {
                fileInputStream.close();
            }catch (IOException e ){
                throw new RuntimeException(e);
            }
        }
    }
}

OutputStream的实现方法:

import org.testng.annotations.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class outputStream {
    public static void main(String[] args){

    }
    //使用fileOutStream将数据写到文件中
    //如果不存在,则创建文件
    @Test
    public void writeFile(){

        String filePath = "d:\\fileout.txt";

        //创建对象
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(filePath);

//            1.写入一个字节
//            fileOutputStream.write("H");
//            2.写入一个字符串
//            String str = "hello socket";
//            str.getBytes();将字符串转换成字节数组
//            fileOutputStream.write(str.getBytes());
//            3.写入字符串
            String str = "hello zhangsan";
            fileOutputStream.write(str.getBytes(),0,str.length());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fileOutputStream.close();
            }catch (IOException e){
                throw new RuntimeException(e);
            }
        }
    }
}

文件的复制方法:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class copyPic {
    public static void main(String[] args) throws Exception{
        //创建file对象
        File f = new File("d:\\test.jpg");
        //判断文件是否存在
        if(f.exists()){
            System.out.println("test.jpg文件存在,可以复制");
        }else{
            f.createNewFile();
            System.out.println("test.jpg文件不存在,创建成功,可以复制");
        }
        //创建FileInputStream对象
        FileInputStream inp = new FileInputStream(f);
        //创建
        //判断demo目录是否存在
        File f1 = new File("d:\\demo");
        if(f1.isDirectory()){
            FileOutputStream out = new FileOutputStream("e:\\demo\\"+f.getName());
            byte bytes[] = new byte[1024];
            int temp = 0;; //边读边写
            while ((temp=inp.read(bytes))!=-1){//
                out.write(bytes,0,temp);//
            }
            //结束
            inp.close();
            out.close();
            System.out.println("文件拷贝成功!");
        }else {
            //创建demo目录
            f1.mkdir();
            System.out.println("demo 目录不存在, 已经创建成功,继续复制");
            FileOutputStream out =  new FileOutputStream("d:\\demo\\"+f.getName());
            byte bytes[]=new byte[1024];
            int temp = 0;; //边读边写
            while ((temp=inp.read(bytes))!=-1){//
                out.write(bytes,0,temp);//
            }
            //结束
            inp.close();
            out.close();
            System.out.println("文件拷贝成功!");
        }
    }
}

 

posted @ 2022-11-07 11:27  想撸猫猫  阅读(78)  评论(0编辑  收藏  举报