文件操作和IO

41 篇文章 2 订阅

目录

1. Java中操作文件

1.1 File 常用构造方法

1.2 常用方法

2. 文件内容的读写 --- 数据流

2.1 InputStream: 输入流

2.1.1 InputStream 常用方法

2.1.2 FileInputStream

2.1.3 使用Scanner 进⾏数据读取

2.2 OutputStream:输出流

2.2.1 OutputStream 常⽤⽅法

2.2.2 实现数据写⼊  

 2.2.3 使⽤ PrintWriter 进⾏写⼊


1. Java中操作文件

1.1 File 常用构造方法

public class FileDemo1 {
    public static void main(String[] args) {
        // 构造⽅法 1: 根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例
        File pfile = new File("d:\\");
        File file = new File(pfile,"a.txt");
        System.out.println("文件1路径" +file.getPath());
        //构造⽅法 2: 根据⽂件路径创建⼀个新的 File 实例,路径可以 是绝对路径或者相对路径 (常用)
        File file2 = new File("d:\\b.txt");
        System.out.println("文件2路径" + file2.getPath());
        //构造⽅法 3: 根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例,⽗⽬录⽤路径表示
        File file3 = new File("d:\\","c.txt");
        System.out.println("文件3路径" + file3.getPath());
    }
}
输出:
文件1路径d:\a.txt
文件2路径d:\b.txt
文件3路径d:\c.txt

1.2 常用方法

  

 getPath() VS getAbsolutePath() VS getCanonicalPath() :

public class FileDemo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("../a.txt");  // .. 表示返回上一层目录
        System.out.println("文件名称:" + file.getName());
        System.out.println("文件目录(getPath)(相对路径):" + file.getPath());
        System.out.println("文件绝对路径:" + file.getAbsolutePath());
        System.out.println("文件标准路径:" + file.getCanonicalPath()); //最靠谱的方式
    }
}
输出:
文件名称:a.txt
文件目录(getPath)(相对路径):..\a.txt
文件绝对路径:D:\apps\Java\maven\io-demo\..\a.txt
文件标准路径:D:\apps\Java\maven\a.txt
public class FileDemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("a.txt");
        System.out.println("文件是否存在:" + file.exists());
        System.out.println("是否为文件夹:" + file.isDirectory());
        System.out.println("是否为文件:" + file.isFile());
        System.out.println();
        boolean result = file.createNewFile(); // 创建文件
        System.out.println("文件创建:" + result);
        System.out.println("文件是否存在:" + file.exists());
        System.out.println("是否为文件夹:" + file.isDirectory());
        System.out.println("是否为文件:" + file.isFile());
    }
}
输出:
文件是否存在:false
是否为文件夹:false
是否为文件:false

文件创建:true
文件是否存在:true
是否为文件夹:false
是否为文件:true
        File file2 = new File("c");
        if (!file2.exists()) { // 文件不存在,创建文件
            System.out.println("创建文件:" + file2.createNewFile());
        }
        System.out.println("是否为文件夹:" + file2.isDirectory());
        System.out.println("是否为文件:" + file2.isFile());

输出:
创建文件:true
是否为文件夹:false
是否为文件:true

 delete 和 deleteOnExit  :

public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        // 先得的一个 file 对象
        File file = new File("a.txt");
        // 判断 file 对象是否存在
        if (file.exists()) {
            // 如果存在则删除文件
            boolean result = file.delete();
            System.out.println("文件删除:" + result);
        } else {
            // 如果不存在的创建文件
            boolean reuslt = file.createNewFile();
            System.out.println("新建文件:" + reuslt);
        }
    }
}
输出:
文件删除:true
public class FileDemo5 {
    public static void main(String[] args) throws IOException, InterruptedException {
        File file = new File("a.txt");
        if (!file.exists()) {
            // 如果不存在,则新建
            System.out.println("新建文件:" + file.createNewFile());
        }
        // 删除文件
        System.out.println("开始删除文件");
        file.deleteOnExit();
        Thread.sleep(5 * 1000);
    }
}

 delete 和 deleteOnExit 区别 :

第一个区别:有无返回值

 

 第二个区别 :delete 在退出程序(删除的相关程序)途中会被删除,deleteOnExit 不会被删除。

第三个区别:deleteOnExit 在程序运⾏结束后,⽂件被删除,但如果是⼈为退出程序,⽂件不会被删除。

创建文件夹
public class FileDemo6 {
    public static void main(String[] args) {
        File file = new File("mytest/apps");
        System.out.println("是否为文件夹:" + file.isDirectory());
        System.out.println("是否为文件:" + file.isFile());
        System.out.println();
//        boolean result = file.mkdir(); // 创建一个文件夹
        boolean result = file.mkdirs(); // 创建多级文件夹
        System.out.println("创建文件夹:" + result);
        System.out.println("是否为文件夹:" + file.isDirectory());
        System.out.println("是否为文件:" + file.isFile());
    }
}
文件重命名
public class FileDemo7 {
    public static void main(String[] args) throws IOException {
        // 将 a.txt -> 重命名 b.txt
        File file = new File("b.txt");
        File tarFile = new File("c.txt");
        if (!file.exists()) {
            // 先创建文件
            file.createNewFile();
        }
        // 重命名文件
        boolean result = file.renameTo(tarFile);
        System.out.println("重命名结果:" + result);
    }
}

2. 文件内容的读写 --- 数据流

2.1 InputStream: 输入流

InputStream 输⼊流是⽤来读取数据的 。 

2.1.1 InputStream 常用方法

2.1.2 FileInputStream

由于 InputStream 是一个抽象类,因此,对文件进行操作时,使用FileInputStream

 读取方法1:read() 方法读取文件:

public class InputStreamDemo1 {
    public static void main(String[] args) throws IOException, InterruptedException {
        // 1.创建流对象
        // 2.读写操作
        // 3.关闭流

        // 1.创建流对象
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream("c.txt");
            // 2.读写操作
            while (true) {
                int c = inputStream.read();
                // 如果流返回的 -1,说明数据已经读取完了
                if (c == -1) break;
                Thread.sleep(200);
                System.out.printf("%c", c);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (InterruptedException exception) {
            exception.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3.关闭流
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

上述代码可以优化为;

public class InputStreamDemo2 {
    public static void main(String[] args) {
        // 1.创建流对象  try-catch-resource(JDK 1.7)   ---  不需要关闭资源
        try (InputStream inputStream = new FileInputStream("c.txt")) {
            // 2.读写操作
            while (true) {
                int c = inputStream.read();
                // 如果流返回的 -1,说明数据已经读取完了
                if (c == -1) break;
                Thread.sleep(200);
                System.out.printf("%c", c);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 读取方法2:read ( byte[ ] b ) 方法来读取文件:

public class InputStreamDemo3 {
    public static void main(java.lang.String[] args) {
        try (InputStream inputStream = new FileInputStream("c.txt")) {
            byte[] bytes = new byte[1024];
            while (true) { // 如果数据超过了 byte 容量,会读取多次
                int c = inputStream.read(bytes);
                if (c == -1) break;
                System.out.println(new String(bytes, "utf-8"));
                Thread.sleep(200);
            }
        } catch (Exception e) {
        }
    }
}

2.1.3 使用Scanner 进⾏数据读取

public class InputStreamDemo4 {
    public static void main(String[] args) {
        try (FileInputStream inputStream = new FileInputStream("c.txt")) {
            try (Scanner scanner = new Scanner(inputStream, "utf8")) {
                while (scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
            }
        } catch (Exception e) {
        }

    }
}

2.2 OutputStream:输出流

OutputStream 输出流是进⾏数据写⼊的。 

2.2.1 OutputStream 常⽤⽅法

2.2.2 实现数据写⼊  

 由于 OutputStream是一个抽象类,因此,对文件进行操作时,使用FileOutputStream 。

 写入操作,每次写入一个字符:

public class OutputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if (!file.exists()) {
            // 新建文件
            System.out.println("新建文件:" + file.createNewFile());
        }
        // 文件写入操作
        try (OutputStream outputStream = new FileOutputStream(file)) {
            outputStream.write('H');
            outputStream.write('e');
            outputStream.write('l');
            outputStream.write('l');
            outputStream.write('o');
            outputStream.flush();
        }
    }
}
字节数组批量写⼊:
public class OutputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        // 写入操作
        try (OutputStream outputStream = new FileOutputStream(file)) {
            byte[] bytes = new byte[]{
                    'H', 'i'
            };
            outputStream.write(bytes);
            outputStream.flush();
        }

    }
}
写⼊部分数据:
public class Main {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt")) {
            byte[] b = new byte[] {
               (byte)'G', (byte)'o', (byte)'o', (byte)'d', (byte)'B', (byte)'a', (byte)'d'
           };
            os.write(b, 0, 4);
            // 不要忘记 flush
            os.flush();
       }
   }
}
字符串写⼊:

public class Main {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt")) {
            String s = "你好中国";
            byte[] b = s.getBytes("utf-8");
         os.write(b);
            // 不要忘记 flush
            os.flush();
       }
   }
}

 2.2.3 使⽤ PrintWriter 进⾏写⼊

public class OutputStreamDemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if (!file.exists()) file.createNewFile();
        try (PrintWriter printWriter = new PrintWriter(file)) {
            printWriter.println("这是第一行数据");
            printWriter.println("这是第二行数据:");
            printWriter.printf("我叫:%s,今年:%d,至今未婚。",
                    "张三", 18);
            printWriter.flush();
        }
    }
}

 

但是上述代码是将原文件中的数据直接覆盖掉,如果进行数据追加:

public class OutputStreamDemo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if (!file.exists()) file.createNewFile();

        // 数据追加
        try (FileWriter fileWriter = new FileWriter(file, true)) {
            fileWriter.append("\n我是追加的数据III");
            fileWriter.flush();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下列是各个问题的答案: 1. 数据类型和数据结构:Python中的常见数据类型包括数字类型、布尔类型、字符串、列表、元组、集合和字典等。数值类型包括整数、浮点数和复数。Python中的数据结构包括数组、堆栈、队列、链表、树以及图等。它们的特点和用途例如列表可以存储多个值,字典可以存储键值对,树可以用于搜索等。 2. 函数:Python中的函数定义使用关键字def,函数可以有参数和返回值。函数参数可以是位置参数、默认参数、可变参数和关键字参数等。常见的内置函数例如print()、input()、len()、range()等。 3. 包管理和依赖环境:Python中的包管理器是pip,可以使用pip install命令来安装第三方包。可以使用virtualenv来创建独立的Python环境,以便在不同的目之间共享或控制依赖关系。 4. 并发和异步编程:Python中的多线程适用于I/O密集型任务,协程适用于CPU密集型任务,异步编程适用于同时处理多个并发I/O任务。使用这些功能可以通过让应用程序同时执行多个操作来提高程序的性能。 5. 正则表达式:Python的正则表达式库是re,可以使用re.search()、re.match()、re.sub()等函数来匹配和替换字符串。 6. 文件操作IO编程:Python使用open()函数打开文件,并使用read()、write()等函数来读写文件。处理文件异常和错误可以使用try...except语句。 7. 网络编程:Python使用Socket模块来实现网络编程,可以使用Socket中的函数实现TCP、UDP等协议的通信。处理异常和错误可以使用try...except语句。 8. 数据库编程:Python使用各种数据库接口来连接和操作关系型数据库,例如MySQLdb、psycopg2等。可以使用ORM框架例如SQLAlchemy、Django ORM等来处理数据库操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值