d17(154-168)-勇敢开始Java,咖啡拯救人生

目录

方法递归

字符集

编码-解码

IO流

字节流

字节输入流 InputSream

FileInputStream

字节输出流 OutputSream

FileOutputSream

释放资源的方式

try-catch-finallly

try-with-resource

字符流

字符输入流 Reader

FileReader

文件字符输出流 Writer

FileWriter

缓冲流

字节缓冲流 BufferedInputStream BufferedOutputStream

字符缓冲流 BufferedReader BufferedWriter

转换流

字符输入转换流 InputStreamReader

字符输出转换流 OutputStreamWriter

打印流

PrintStream

PrintWriter

数据流

数据输出流 DataOutputStream

数据输入流 DataInputStream

序列化流

对象字节输出流 ObjectOutputStream

对象字节输入流 ObjectInputStream

注意

IO框架

Commons-io


方法递归

方法调用自身

直接递归:方法直接调用自己

间接递归:方法调用其他方法,其他方法又回调方法自己

递归死循环 -> 栈内存溢出错误

递归公式 + 递归终结点 + 其方向要走向终结点

其他应用:文件搜索

    private static void searchFile(File dir, String fileName) throws Exception {
        if(dir == null || !dir.exists() || dir.length() == 0 ){
            System.out.println("没找到");
            return;
        }

        File[] files = dir.listFiles();
        if(files != null && files.length > 0){
            for (File file : files) {
                if (file.isFile()){
                    if (file.getName().contains(fileName)){
                        System.out.println("路径为"+file.getAbsolutePath());
                        // 启动软件
                        Runtime runtime = Runtime.getRuntime();
                        runtime.exec(file.getAbsolutePath());
                    }
                }else {
                    searchFile(file,fileName);
                }
            }
        }
    }
    private static void deleteDir(File dir) {
        if (dir == null || !dir.exists() || dir.length() == 0) {
            return;
        }
        // 是文件则删除
        if (dir.isFile()){
            dir.delete();
            return;
        }
        // 空文件夹则删除
        File[] files = dir.listFiles();
        if (files == null){
            return;
        }
        // 遍历当前文件夹下的所有。是文件则删除,是文件夹再进入
        for (File file : files) {
            if (file.isFile()){
                file.delete();
            }else {
                deleteDir(file);
            }
        }
        dir.delete();
    }
字符集

ASCII 0xxxxxxx 英文数字符号

GBK 1xxxxxxx xxxxxxxx 汉字2 英文数字1

unicode - UTF-8 可变长编码方案 1-4个字节

英文、数字等只占1个字节(兼容ASCII),汉字占3个字节

编码-解码

IO流

I(Input) 输入流:把数据读到内存中

O(Output) 输出流:负责写数据出去

按流中数据的最小单位 可分为:

字节流 适合操作所有类型文件

字符流 只适合操作纯文本

字节流
字节输入流 InputSream
FileInputStream

每次读取一个字节 read()

InputStream is = new FileInputStream(("文件路径"));

int b;
while((b = is.read()) != -1){
    System.out.print((char)b);

is.close();
}

每次读一个字节,读取性能较差,读取中文输出为乱码

每次读取多个字节 read(byte[] buffer)

byte[] buffer = new byte[3];
int len;
while((len = is.read(buffer)) != -1){
    // 读多少,倒多少
    String rs = new String(buffer, 0, len);
    System.out.print(rs);
}
is.close;

读取汉字时有可能出现乱码,因为汉字三个字节可能分开读入了

解决方案:把文件内的所有字节一次性读取

但是还是存在问题

如果文件过大,创建的字节数组也会过大,可能引起内存溢出

因此字符流更适合读写文本,字节流更适合做数据的转移,比如文件复制

字节输出流 OutputSream
FileOutputSream

注意覆盖追加

换行

os.write("\r\n".getBytes());

拷贝文件

复制文本、图片、视频等,任何文件都可以

释放资源的方式
try-catch-finallly

只有虚拟机终止 System.exit(0);时不会执行finally中的内容

不要在finally中return数据

一般用于在程序执行完成之后释放资源

InputStream is = null;

OutputStream os = null;

try{

...}catch(Exception e){

        e.printStackTrace();

}finally{

        try{

                if(os != null)os.close();

        }catch(Exception e){
                e.printStackTrace();

        }

        try{

                if(is != null)os.close();

        }catch(Exception e){
                e.printStackTrace();

        }

}
try-with-resource

字符流
字符输入流 Reader
FileReader

try(
    Reader fr = new FileReader("文件路径");
){
    // 每次读取单个字符
    int c;
    while((c = fr.read()) != -1){
        System.out.print((char)c);
    }
    // 每次读取多个字符
    char[] buffer = new char[3];
    int len;
    while((len = fr.read(buffer)) != -1){
    System.out. print(new String(buffer, 0, len));
    }
}catch(Exception e){
    e.printStackTrace();
}
文件字符输出流 Writer
FileWriter

注意写文件时,是覆盖还是追加

注意:字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效

字符流适合做文本文件的操作(读、写

缓冲流

对原始流进行包装,以提高原始流读写数据的性能

字节缓冲流 BufferedInputStream BufferedOutputStream

原理:字节缓冲输入流自带了8KB缓冲池,字节缓冲输出流也自带了8KB缓冲池

可以修改缓冲池大小

字符缓冲流 BufferedReader BufferedWriter

自带8KB的字符缓冲池,提高字符输入流读取字符数据的性能,提高字符输出流写字符数据的性能

字符缓冲输入流

字符缓冲输出流

低级流不一定比包装流差,缓冲池也不是越大越好

转换流

如果代码编码和被读取的文本编码一致,使用字符流读取文本文件时不会出现乱码,不一致时则会出现乱码

字符输入转换流 InputStreamReader

解决不同编码时,字符流读取文本内容乱码的问题。

先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了

字符输出转换流 OutputStreamWriter

控制写出去的字符使用指定字符集编码

1.可以调用String的getBytes

        String data = "一串字符";

        byte[] bytes = data.getBytes("GBK");

2.也可以使用字符输出转换流

        获取字符输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了

打印流

方便高效的打印数据出去

PrintStream

打印什么、存储什么

PrintWriter

PrintStream和PrintWriter都方便高效,PrintStream继承自字节输出流OutputStream,支持写字节数据的方法,PrintWriter继承自字符输出流Writer,支持写字符数据出去

打印流还可以重定向输出语句:

PrintStream ps = new PrintStream("文件路径");

System.setOut(ps);

System.out.println("要打印的内容");

这样输出语句不会打印在控制台,而是在指定的文件内

数据流

数据输出流 DataOutputStream

允许把数据其类型一并写出去

数据输入流 DataInputStream

用于读取数据输出流写出去的数据

序列化流

对象序列化:把Java对象写入到文件中去

对象反序列化:把文件里的Java对象读出来

对象字节输出流 ObjectOutputStream

把Java对象进行序列化

对象要序列化,必须要实现序列化接口 Serializable

对象字节输入流 ObjectInputStream

把Java对象进行反序列化

注意

1.在序列化时,如果想将对象中某变量不序列化

可以在类中,在变量前加上transient修饰符,此时该成员变量不参与序列化

2.如果要一次性序列化多个对象,可以用ArrayList集合存储多个对象,然后直接对集合进行序列化[因为ArrayList集合已实现序列化接口 Serializable]

IO框架

框架:解决某类问题编写的一套类、接口等

在框架的基础上开发,可以得到优秀的软件架构,提高开发效率

jar包

IO框架:封装了Java的对文件、数据进行操作的代码,提供更简单的方式操作文件、读写数据

Commons-io

把要用的框架下载好,拷贝要用的jar包,在项目中新建文件夹lib,把jar包粘贴在该文件夹中,右键文件夹Add as Library

Files类也有很多功能啊,好卷,请为我提供呆瓜式编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/622287.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据分析案例-基于随机森林算法构建银行贷款审批预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

C#之partial关键字

在C#中,partial关键字用于声明一个类、结构体、接口或方法的分部定义。这意味着可以将一个类或其他类型的定义分成多个部分,这些部分可以在同一个命名空间或程序集中的多个源文件中进行定义。当编译器编译这些部分时,会将它们合并成一个单独的…

【RAG 论文】BGM:为 LLM 和 Retriever 的偏好 gap 搭建一个 Bridge

论文:Bridging the Preference Gap between Retrievers and LLMs ⭐⭐⭐ Google Research, arXiv:2401.06954 论文速读 LLM 与 Retriever 之间存在一个 preference gap:大多数 retriever 被设计为 human-friendly,但是 LLM 的偏好与人类的却…

网络配置的加密存储

随着数据泄露事件的增加,扰乱了公司的正常工作周期,企业遭受了损失。事实上,数据泄露可以通过存储加密来控制,存储加密是防止黑客对网络数据库造成严重破坏的最有效方法之一。在网络配置管理器中,存储加密可用于存储设…

C++数据结构——AVL树

目录 一、引言 1.1 二叉搜索树 1.2 二叉搜索树的缺陷 1.3 AVL数的引入 二、AVL树结点的定义 三、AVL树的操作 3.1 插入 3.1.1 基本步骤 3.1.2 平衡因子的调整 3.2 旋转操作(重点!) 3.2.1 右单旋 3.2.2 左单旋 3.2.3 左右双旋 3.2.4 右左双旋 3.3 插入…

【算法】滑动窗口——最小覆盖子串

本节博客是对“最小覆盖子串”题目由暴力求解到滑动窗口的思路解析,有需要借鉴即可。 目录 1.题目2.滑动窗口解法3.总结 1.题目 题目链接:LINK 这个题目是困难难度,感觉是一个中等题目的感觉。 首先我肯定想到的是暴力求解的方法&#xff…

大模型微调方法汇总

微调方法 Freeze方法P-tuning方法 prefix-tuningPrompt TuningP-tuning v1P-tuning v2Lora方法 重要相关参数LoRA 的优势Qlora方法 相关参数微调经验 模型选择模型大小选择数据处理微调方案英文模型需要做词表扩充吗?如何避免灾难遗忘大模型的幻觉问题微调后的输出…

MySQL表的增删查改【基础部分】

数据表的操作 新增 普通插入 insert into 表名 values(值,值...)注意: 此处的值要和表中的列相匹配 使用’‘单引号或者”“双引号来表示字符串 mysql> insert into student values(123,zhangsan); Query OK, 1 row affected (0.02 sec)指定列插入 insert …

搜索引擎的设计与实现(二)

目录 3 搜索引擎的基本原理 3.1搜索引擎的基本组成及其功能 l.搜索器 (Crawler) 2.索引器(Indexer) 3.检索器(Searcher) 4.用户接口(UserInterface) 3.2搜索引擎的详细工作流程 4 系统分析与设计 4.1系统分析 4.2系统概要设计 4.2系统实现目标 前面内容请移步 搜索引…

苍穹外卖Day06笔记(复习了jwt的加密解密和传递)

疯玩了一个月,效率好低,今天开始捡起来苍穹外卖~ 1. 为什么不需要单独引入HttpClient的dependency? 因为我们在sky-common的pom.xml中已经引入了aliyun-sdk-oss的依赖,而这个依赖低层就引入了httpclinet的依赖,根据依…

06、SpringBoot 源码分析 - SpringApplication启动流程六

SpringBoot 源码分析 - SpringApplication启动流程六 初始化基本流程SpringApplication的prepareEnvironment准备环境SpringApplication的getOrCreateEnvironment创建环境configureEnvironment配置环境ApplicationConversionService的getSharedInstance配置转换器 SpringApplic…

LLVM中期报告

1.主要开展的工作 研究对LLVM IR层面进行代码混淆,分析IR的指令 ,并且实现混淆 从LLVM代码混淆的角度出发,函数之间的正常调用构成了待混淆程序的原始控制流,不同的基础代码块构成了一个个的函数,每个基础…

PyQt6--Python桌面开发(12.QpushButton按钮控件)

一.按钮类控件 二.QpushButton按钮控件 2.1QAbstractButton类属性 2.2QpushButton类属性

Git系列:Git Stash临时保存与恢复工作进度

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

ncs sdk nrf5340 运行DFU

nrf5340 运行DFU 1. dfu介绍 Nordic 的 DFU(Device Firmware Update)是一种用于更新设备固件的技术和协议。Nordic Semiconductor 是一家专门设计和制造无线芯片的公司,他们的产品主要用于物联网(IoT)和无线连接应用…

无线网卡网络老断网

无线网卡网络老断网 设置 Intel AX210 无线网卡 路由器华为 AX3 问题及解决 问题 无线网卡连接到 wifi ,连接不通,或者连接上后网络很慢,延时大,掉包。 解决方案 调整如下界面,调整信道后,连接正常。…

Springboot HelloWorld

新建一个maven工程 引入依赖项 <modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.11.RELEASE</version><…

armbian 安装libreoffice 转换word为PDF

安装libreoffice sudo apt-get install libreoffice安装JVM sudo apt-get install default-jre #验证 java -version尝试转换&#xff1a; libreoffice --convert-to pdf /root/printFiles/f.docx发现问题乱码 从Windows 拷贝字体到debian上&#xff0c;windows字体路径是&a…

Postman基础功能-断言与日志

若能脱颖而出&#xff0c;何必苦苦融入。大家好&#xff0c;在 API 测试的领域中&#xff0c;Postman 是一款极为强大且广泛使用的工具。其中&#xff0c;断言和日志调试功能扮演着至关重要的角色。 一、介绍 断言允许我们在测试过程中验证 API 的响应是否符合预期。通过设定各…

vue从入门到精通(一):初始Vue

一&#xff0c;Vue是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代…