[Java EE] 字符流和字节流实例

1.PrintWriter(高级字符输出流)

|-------------------------------------|----------------------------------------------------|
| 构造器示例 | 说明 |
| new PrintWriter(String filePath) | 直接关联文件路径(自动创建文件,覆盖原有内容) |
| new PrintWriter(File file) | 关联 File对象表示的文件 |
| new PrintWriter(Writer out) | 包装基础字符输出流(如 BufferedWriter) |
| new PrintWriter(OutputStream out) | 包装字节输出流(自动转换为字符流,默认使用系统编码) |
| new PrintWriter(out, autoFlush) | 第二个参数为 true时,启用 "自动刷新"(调用 println()等方法后立即刷出数据) |

2.小程序练习

① 扫描指定目录 , 找到名称中包含指定关键字的所有普通文件(不包含目录) , 并且后续询问是否要删除文件

java 复制代码
import java.io.File;
import java.util.Scanner;

public class demo12 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要搜索的目录:");
        String rootDir = scanner.nextLine();
        File rootFile = new File(rootDir);
        if(!rootFile.isDirectory()){
            System.out.println("输入的不是目录");
            return;
        }
        System.out.println("请输入要删除的关键字:");
        String keyword = scanner.nextLine();
        scanDir(rootFile,keyword);
    }

    private static void scanDir(File rootFile, String keyword) {
        File[] files = rootFile.listFiles();
        if(files == null){
            return;
        }
        for (File file:files) {
            System.out.println("遍历目录或文件"+file.getAbsolutePath());
            if(file.isFile()){
                dealFile(file,keyword);
            }else {
                scanDir(file,keyword);
            }
        }
    }

    private static void dealFile(File file, String keyword) {
        if(file.getName().contains(keyword)){
            System.out.println("发现文件"+file.getAbsolutePath()+", 包含关键字! 是否删除? (y/n)");
            Scanner sc = new Scanner(System.in);
            String choice = sc.next();
            if(choice.equalsIgnoreCase("y")){
                file.delete();
                System.out.println("文件删除"+file.getAbsolutePath());
            }
        }
    }


}
  1. 先复制所在文件目录地址
  2. 文件名

② 进行普通文件复制

java 复制代码
import java.io.*;
import java.util.Scanner;

public class demo13 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入源文件路径");
        String srcPath = sc.nextLine();
        System.out.println("请输入目标文件路径");
        String destPath = sc.nextLine();
        File scrFile = new File(srcPath);
        if(!scrFile.isFile()){
            System.out.println("源文件不存在");
            return;
        }
        File destFile = new File(destPath);
        if(!destFile.isFile()){
            System.out.println("目标文件不存在");
            return;
        }
        try(InputStream inputStream = new FileInputStream(scrFile);
            OutputStream outputStream = new FileOutputStream(destFile)) {
            while(true){
                byte[] data = new byte[1024];
                int len = inputStream.read(data);
                if(len == -1){
                    break;
                }
                outputStream.write(data,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

③ 扫描指定目录 , 并找到名称或内容中包含指定字符的所有普通文件(不包括目录)

java 复制代码
import java.io.*;
import java.util.Scanner;
public class demo14 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要搜索的路径");
        String srcPath = sc.nextLine();
        File srcFile = new File(srcPath);
        if (!srcFile.isDirectory()) {
            System.out.println("输入的路径不是目录!");
            return;
        }
        System.out.println("请输入要搜索的关键字");
        String keyword = sc.nextLine();
        scanDir(srcFile,keyword);
    }

    private static void scanDir(File srcFile, String keyword) {
        File[] files = srcFile.listFiles();
        if(files == null){
            return;
        }
        for (File file:files) {
            System.out.println("遍历目录或文件"+file.getAbsolutePath());
            if(file.isFile()){
                dealFile(file,keyword);
            }else {
                scanDir(file,keyword);
            }
        }
    }

    private static void dealFile(File file, String keyword) {
        if(file.getName().contains(keyword)){
            System.out.println("发现文件"+file.getAbsolutePath());

        }
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(file)) {
            while (true) {
                char[] data = new char[1024];
                int len = reader.read(data);//此处必须传入data数组,否则会报空指针异常
                if(len == -1 ) {
                    break;
                }
                stringBuilder.append(data,0,len);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
        if(stringBuilder.toString().contains(keyword)){
            System.out.println("发现文件包含关键字"+file.getAbsolutePath());
        }
        //        if(stringBuilder.indexOf(keyword)>=0){
        //            System.out.println("发现文件包含关键字"+file.getAbsolutePath());
        //        }
        return;
    }
}
  1. 判断文件名是否包含关键字 ; 若包含关键字打印文件名
  2. 判断文件内容是否包含关键字(字符流 Reader)并追加写入 stringBuilder
  3. 判断 stringBuilder 是否包含关键字

3.代码参考

① 如何按字节进行数据读

java 复制代码
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class demo15 {
    public static void main(String[] args) {
        try(InputStream is = new FileInputStream("test.tst")){
            byte[] data = new byte[1024];
            while(true){
                int n = is.read(data);
                if (n == -1) {
                    break;
                }
                //后续业务逻辑
                System.out.println(new String(data,0,n));
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

② 如何按字节进行数据写

java 复制代码
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class demo17 {
    public static void main(String[] args) {
     Scanner sc = new Scanner(System.in);
        System.out.println("请输入要写入文件的内容");
        String content = sc.nextLine();//只读取一行
        byte[] data = content.getBytes();
        try(OutputStream os = new FileOutputStream("test.txt")) {
            os.write(data);
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

③ 如何按字符进行数据读

java 复制代码
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class demo18 {
    public static void main(String[] args) {
        String fileName = "test.txt";
        try(InputStream is = new FileInputStream(fileName)) {
            try(Scanner sc = new Scanner(is)){//封装为Scanner对象
                while(sc.hasNextLine()){
                    String line = sc.nextLine();
                    System.out.println(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

④ 如何按照字符进行数据写

java 复制代码
import java.io.*;

public class demo19 {
    public static void main(String[] args) {
        String fileName = "test.txt";
        String[] data = {"hello world\n", "hello java\n"};
        try(OutputStream os = new FileOutputStream(fileName)) {//获取字节输出流
            try(OutputStreamWriter osw = new OutputStreamWriter(os)){//封装为字符输出流
                try(PrintWriter ow = new PrintWriter(osw)){//使用PrintWriter简化写入
                    for (String s : data) {
                        ow.println(s);
                    }
                    ow.flush();
                    System.out.println("写入完成");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
相关推荐
阿里嘎多学长2 小时前
2026-04-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
abcnull4 小时前
用javaparser做精准测试
java·ast·静态代码分析·精准测试·javaparser
叶小鸡4 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan4 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_180079054734 小时前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路5 小时前
C++23概述
java·c++·c++23
时空系5 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
专注API从业者6 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
CHANG_THE_WORLD6 小时前
python 批量终止进程exe
开发语言·python