当前位置: 首页 > news >正文

Java文件IO

文章目录

  • Java中的文件操作
    • File
      • 常用构造方法
      • 方法
    • 文件内容的读写——数据流
        • InputStream
        • FileInputStream
        • 利用Scanner进行字符读取
        • OutputStream
      • PrintWriter
      • 按字符读取文件(FileReader)
      • 练习
      • 代码实例
        • 如何按字节进行数据读
        • 如何按字节进行数据写
        • 如何按字符进行数据读
        • 如何按字符进行数据写


Java中的文件操作

在Java中,一般谈到文件,都是指一个存在磁盘上的文件(狭义的文件),抛开Java,站在系统的角度来看,操作系统在管理很多软件资源和硬件设备的时候,都是把这些东西抽象成了一个一个的文件了,这也是系统中典型的"一切皆文件"的思想。

狭义的文件,可以分为两类

  1. 普通文件
  2. 目录文件(文件夹)

在Java标准库java.io下提供了一个File类来对文件(包括目录)进行了抽象描述,注意:有File对象并不表示File对象的文件一定存在。

File

常用构造方法

构造方法说明
File(File parent,String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent,String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

绝对路径:可以简单理解为带有盘符的

相对路径:基于当前位置的路径一般以 . 或 … 开头,.\表示当前路径,…\表示上一级路径

方法

返回值类型方法名说明
StirnggetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
booleandeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行
String[]list返回 File 对象代表的目录下的所有文件名
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleananWrite()判断用户是否对文件有可写权限

所谓的文件移动(剪切粘贴),对于操作系统来说,其实是一个非常高效的操作。每个文件都有个属性,这个属性里就包括了文件的路径,移动操作其实只是修改了文件的路径属性而已。

所谓的文件复制(复制粘贴),对于操作系统来说,很可能是一个非常低效的操作。就需要把文件的内容都读读出来,然后再拷贝一份,写入磁盘中。如果文件比较大,复制粘贴的开销就比较大了

经典面试题

给你一个list方法,如何遍历一个目录中所有的文件(包含子目录中的文件)

public class TestDemo {private static List<String> result = new ArrayList<>();public static void printAllFile(String path) {File file = new File(path);//判读这个路径是否真实存在if (file.exists()) {File[] files = file.listFiles();for (File f : files) {//如果是普通文件if (f.isFile()) {result.add(f.getName());} else if (f.isDirectory()) {//如果是目录文件printAllFile(f.getPath());} else {//其它文件..(管道)}}}}public static void main(String[] args) {printAllFile("./");for (String s : result) {System.out.println(s);}}
}

文件内容的读写——数据流

在Java标准库中,读写文件相关的类,有很多。

InputStream/FileInputStream

文件读取操作,按照字节为单位进行读文件

OutputStream/FileOutputStream

文件写入操作,按照字节为单位进行写文件

InputStream

返回值类型方法名说明
intread()读取一个字节的数据以整数形式放回,返回-1代表已经读取完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读取到的数量,返回-1代表已经读取完了
intread(byte[] b,int off,int len)最多读取 len - off 个字节的数据到 b 中,放在从off开始,返回实际读取的数量,-1代表已经读取完毕
voidclose()关闭字节流

注意:使用流对象,读写完文件之后,一定要及时关闭,如果没有关闭,就可能造成资源泄露

FileInputStream

构造方法说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流
public class Main {public static void main(String[] args) throws IOException {//这种写法更好try (InputStream inputStream = new FileInputStream(".\\.\\.\\test.txt")) {while (true) {int len = inputStream.read();if (len == -1) {break;}System.out.printf("%c",len);}}catch (IOException e) {e.printStackTrace();}}public static void main1(String[] args) throws IOException {InputStream inputStream = null;try {//创建实例就相当与在打开文件inputStream = new FileInputStream("./././test.txt");//通过逐个字节的方式把文件内容读取出来while (true) {//read无参版本默认每次读取一个字节//无参版本的read。返回值就是每次读取的字节//这个返回值就是 0~255int len = inputStream.read();//如过读到文件末尾(EOF)就会返回 -1if (len == -1) {break;}System.out.printf("%c",len);}} catch (IOException e) {e.printStackTrace();}finally {try {//关闭inputStream.close();} catch (IOException e) {e.printStackTrace();}}}
}

InputStream只是一个抽象类,要使用还需要具体的实现类,关于InputStream实现类有很多,基本可以认为不同的输入设备上都可以对应一个InputStream类,我们现在只关心从文件中读取,所有使用FileInputStream。它继承于InputStream。

注意:如果FileInputStream的创建写到 try()的括号里,就不需要手动close了,等代码执行完毕后会自动close.只要实现了Closeable接口就可以放到try里.

还可以利用byte数组来读取文件内容

public static void main(String[] args) {try (InputStream inputStream = new FileInputStream("./././test.txt")) {while (true) {byte[] bytes = new byte[1024];int len = inputStream.read(bytes);if (len == -1) {break;}String s = new String(bytes,0,len);System.out.println(s);}} catch (IOException e) {e.printStackTrace();}}

利用Scanner进行字符读取

上面的读取方法,直接使用InputStream进行读取是比较麻烦的,这个时候就可以使用常用的Scanenr类来进行读取

构造方法说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取
public static void main(String[] args) {//如果要从文件读取出中文,借出 Scanner 就可以从文件中读取try (InputStream inputStream = new FileInputStream("./././test.txt")){//这中写法就不用调用 Scanner的 close 方法try (Scanner sc = new Scanner(inputStream,"utf-8")) {while (sc.hasNext()) {String str = sc.next();System.out.print(str);}}} catch (IOException e) {e.printStackTrace();}}

OutputStream

返回值方法说明
voidwrite(int b)文件写入,指定字节数据
voidwrite(byte[] b)将b这个字符数组中的全部数据写入输出流中
intwrite(byte[] b,int off,int len)将 b 这个字符数组中从 off 开始的数据写入 输出流中,一共写 len 个
voidclose()闭此输出流并释放与此流相关联的任何系统资源
voidfluch()强制刷新缓冲区

我们知道I/O的速度是很慢的,所以,大多的OutputStream为了减少设备操作的次数,为了提高效率,就可以减少直接访问磁盘的次数。使用缓冲区,就能很好的解决这个问题。

缓冲区其实是一段内存空间(这个内存是OutputStream里自带的),当我们使用write方法来写数据的时候,并不是直接把数据写到磁盘上,而是先放到缓冲区(内存中),如果缓冲区满了,或者手动调用flush,猜真的会把数据写到磁盘上。

内存和磁盘之间的缓冲区,往往是一个内存空间

CPU和内存之间,其实也有缓冲区(L1,L2,L3,cache)

代码实例:

public static void main(String[] args) {//一旦按照 OutputStream 的方式打开文件,就会把文件的原来的内容给清空try (OutputStream outputStream = new FileOutputStream("./././test.txt")) {/* 写入一个字符outputStream.write('h');outputStream.write('e');*///按照字节来写入byte[] buffer = new byte[] {'a','b','c','d'};//outputStream.write(buffer);//按照字符串来写入String s = "你好世界 !";//将String 转换成 byte数组,指定字符串为 UTF-8outputStream.write(s.getBytes("UTF-8"));//刷新缓冲区outputStream.flush();}catch (IOException e) {e.printStackTrace();}}

PrintWriter

PrintWriter 类中提供了我们熟悉的 print/println/printf 方法

public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("./././test.txt")) {//利用 PrintWriter 类来包装一下 OutputStream 然后可以更方便的进行读写try (PrintWriter writer = new PrintWriter(outputStream)) {writer.println("这是第一行");writer.println("这是第二行");writer.println(200+300);writer.println("这一行是数字"+1024);}outputStream.flush();}catch (IOException e) {e.printStackTrace();}}

按字符读取文件(FileReader)

public static String readFile(String filePath) {StringBuilder result = new StringBuilder();try (FileReader fileReader = new FileReader(filePath)) {while (true) {//返回的是一个字符,但是不可能有负数,用int才能装下int ch = fileReader.read();if (ch == -1) {break;}result.append((char)ch);}} catch (IOException e) {e.printStackTrace();}return result.toString();}

练习

练习1:指定一个目录,扫描这个目录,找到文件名中包含了指定字符的文件.并提示用户是否要删除这个文件,根据用户的输入决定是否删除.

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//指定一个目录,扫描这个目录,找到文件名名中包含了指定字符的文件,并让用户选择是否要删除文件
public class TestDemo1 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入一个绝对路径 -> ");String rootPath = sc.next();//判断该路径是否存在File fileDir = new File(rootPath);if (!fileDir.exists()) {System.out.println("你输入的路径不正确,程序退出!");}//输入要查找的一个关键字System.out.println("请输入一个查找的关键字:");String keyWord = sc.next();//递归查找List<File> results = new ArrayList<>();KeyWordFindFile(fileDir,keyWord,results);//遍历结果判断是否需要删除for (File file : results) {System.out.println("是否删除文件(Y/N)"+file.getName());String input = sc.next();if (input.equals("Y")) {file.delete();System.out.println("删除成功");}}}/*** 递归查找文件名中包含关键字的文件* @param rootPath File对(绝对路径)* @param fileNameKeyWord 查找的关键字* @param result list*/private static void KeyWordFindFile(File rootPath,String fileNameKeyWord,List<File> result) {File[] files = rootPath.listFiles();for (File file : files) {if (file.isDirectory()) {//如果是目录就递归KeyWordFindFile(file,fileNameKeyWord,result);} else if (file.isFile()) {//判断文件名是否包含关键字if (file.getName().contains(fileNameKeyWord)) {result.add(file);}}}}
}

练习2:把文件复制到指定目录下

//把指定文件复制到另外一个路径,一定是文件public static void main(String[] args) throws IOException {System.out.print("请输要复制文件的绝对路径 -> ");Scanner sc = new Scanner(System.in);String originalPath = sc.next();//判断是否是文件File originalFile = new File(originalPath);if (!originalFile.isFile()) {System.out.println("输入文件绝对路径错误程序退出");return;}System.out.print("请输入文件要复制到的绝对路径(指定文件名) -> ");String targetPath = sc.next();File targetFile = new File(targetPath);//判断文件是否已经存在if (targetFile.exists()) {System.out.println("文件已存在,是否替换(Y/N)");String input = sc.next();if (input.equals("N")) {System.out.println("复制取消");return;}}//开始复制try (InputStream inputStream = new FileInputStream(originalFile);OutputStream outputStream = new FileOutputStream(targetFile)) {//一次性最多读取1024个字节byte[] bytes = new byte[1024];while (true) {int len = inputStream.read(bytes);if (len == -1) {break;}//读多少写多少outputStream.write(bytes,0,len);}//不flush也是可以的,在close后会自动flushoutputStream.flush();} catch (IOException e) {e.printStackTrace();}System.out.println("复制成功!");}

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

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class TestDemo3 {//扫描指定目录,并找到 名称 或者内容中包含指定 字符 的所有普通文件(不包含目录)public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入一个指定目录的绝对路径 -> ");String path = sc.next();File dirPath = new File(path);if (!dirPath.isDirectory()) {System.out.println("你输入的绝对路径不是一个目录。程序自动退出");return;}System.out.print("请输入一个要查找的关键字 -> ");String keyWord = sc.next();//递归遍历目录下的所有文件List<File> result = new ArrayList<>();getAllFile(dirPath,result,keyWord);for (File file : result) {System.out.println(file.getName());}}private static void getAllFile(File dirPath,List<File> result,String keyWord) {File[] files = dirPath.listFiles();if (files == null || files.length == 0) {return;}for (File file : files) {if (file.isDirectory()) {getAllFile(file,result,keyWord);} else if (file.isFile()) {//如果是文件就判断是否包含关键字if(containKeywords(file,keyWord)) {result.add(file);}}}}//判断文件内容是否包含关键字 keyWordprivate static boolean containKeywords(File file,String keyWord) {StringBuilder stringBuilder = new StringBuilder();//使用 Scanner 以UTF-8字符集读取try (InputStream inputStream = new FileInputStream(file);Scanner scanner = new Scanner(inputStream,"UTF-8")) {while (scanner.hasNext()) {String s = scanner.nextLine();stringBuilder.append(s);}} catch (IOException e) {e.printStackTrace();}return stringBuilder.indexOf(keyWord) != -1;}
}

代码实例

如何按字节进行数据读

try (InputStream input = new ...) {byte[] bytes = new byte[1024];while (true) {int len = input.read(bytes);if (len == -1) {break;}//0到len表示bytes读到的数据String reslult = new String(bytes,0,len);}
}

如何按字节进行数据写

try (OutputStream output = new ...) {byte[] bytes = new byte[1024];while (/* 还有未完成的业务数据 */) {// 将业务数据填入 buf 中,长度为 nint len = ...;output.write(bytes, 0, len);}output.flush();//刷新缓冲区
}

如何按字符进行数据读

try (InputStream is = ...) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNextLine()) {String line = scanner.nextLine();// 根据 line 做业务处理}}
}

如何按字符进行数据写

try (OutputStream os = ...) {try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8")) {try (PrintWriter writer = new PrintWriter(osWriter)) {while (/* 还有未完成的业务数据 */) {writer.println(...);}writer.flush(); // 进行数据刷新操作}}
}

啥样的类可以放到 try()里,实现了 Closeble接口的就可以放入 try()里


相关文章:

Java文件IO

文章目录Java中的文件操作File常用构造方法方法文件内容的读写——数据流InputStreamFileInputStream利用Scanner进行字符读取OutputStreamPrintWriter按字符读取文件(FileReader)练习代码实例如何按字节进行数据读如何按字节进行数据写如何按字符进行数据读如何按字符进行数据…...

useSSL使用安全套接字协议(史上最全最详细)

useSSL使用安全套接字协议&#xff08;史上最全最详细&#xff09; SSL即为&#xff1a;Secure Sockets Layer 安全套接字协议。 useSSLfalse和useSSLtrue的区别&#xff1a; 在MySQL进行连接时&#xff1a; 如果MySQL的版本是5.7之后的版本必须要加上useSSLfalse&#xff0c…...

面向对象复习(2)

面向对象(2) 对象与引用 java语言中除基本类型之外的变量都称之为引用类型 java中的对象时通过引用对其操作的 Car bm new Car(); 右边的new Car是以Car类为模板,调用无参构造函数,在堆空间中创建一个Car对象 左边的Car bm 在栈中创建了一个Car类型的引用变量,所谓Car的…...

python中使用numpy包的向量矩阵相乘

一直对np的线性运算不太清晰&#xff0c;正好上课讲到了&#xff0c;做一个笔记整个理解一下 1.向量和矩阵 在numpy中&#xff0c;一重方括号表示的是向量vector&#xff0c;vector没有行列的概念。二重方括号表示矩阵matrix&#xff0c;有行列。 代码显示如下&#xff1a; …...

ElasticSearch 学习(一)

目录一、Elasticsearch 简介二、Elasticsearch 发展史三、Elasticsearch 功能四、Elasticsearch 特点五、Elasticsearch 应用场景一、Elasticsearch 简介 Elasticsearch 是一个实时的分布式搜索分析引擎&#xff0c;它能让你以前所未有的速度和规模&#xff0c;去探索你的数据…...

【新】华为OD机试 - 交换字符(Python)| 刷完获取OD招聘渠道

交换字符 题目 给定一个字符串 S 变化规则: 交换字符串中任意两个不同位置的字符 M S 都是小写字符组成 1 <= S.length <= 1000 输入 一串小写字母组成的字符串 输出 按照要求变换得到最小字符串 示例一 输入 abcdef输出 abcdef示例二 输入 bcdefa输出 acde…...

手把手教你解决传说中的NPE空指针异常

1. 前言最近有好几个初学java的小伙伴&#xff0c;甚至是学习到了JavaWeb、框架阶段的小伙伴也跑来问壹哥&#xff0c;该如何解决Java中的NullPointerException空指针异常。因为NPE是初学者特别常见的典型异常&#xff0c;所以壹哥在这里专门写一篇文章&#xff0c;来手把手地教…...

【pytorch安装】conda安装pytorch无法安装cpu版本(完整解决过程)

问题描述 在安装pytorch过程中&#xff0c;发现最后验证torch时总是返回结果为False&#xff0c;结果翻上去发现自己安装的是cpu版本的。 然后又通过conda去更换不同版本尝试&#xff0c;发现都是cpu版本的。 问题分析 通过conda安装pytorch是从源中搜索匹配指令中的文件&am…...

云计算ACP云服务器ECS实例题库

&#x1f618;作者简介&#xff1a;一名99年软件运维应届毕业生&#xff0c;正在自学云计算课程。&#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。&…...

面试题:作用域、变量提升、块级作用域、函数作用域、暂存性死区、var和let的区别

<script>var a 10;(function () {console.log(a)a 5console.log(window.a)var a 20;console.log(a)})() </script> 上述代码&#xff1a; 1、主要是涉及到变量提升和函数作用域&#xff0c;var a20这行代码会在函数作用域中提升var a 至最顶部&#xf…...

JAVA练习49-爬楼梯

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目-爬楼梯 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 2月13日练习内容…...

深兰科技机器人商丘制造基地正式投产,助力商丘经济高质量发展

2月9日&#xff0c;深兰科技机器人商丘制造基地投产仪式在商丘市梁园区北航创新园隆重举行。商丘市人大常委会副主任、梁园区委书记张兵&#xff0c;梁园区区长薛天江、河南省装备制造业协会会长张桦&#xff0c;河南省机器人行业协会会长王济昌&#xff0c;深兰科技集团董事长…...

ES倒排索引/查询、写入流程

ES学习笔记 Elasticsearch学习笔记_巨輪的博客-CSDN博客 Elasticsearch学习之图解Elasticsearch中的_source、_all、store和index属性_BUse的博客-CSDN博客 倒排索引 倒排索引&#xff1a;ES倒排索引底层原理及FST算法的实现过程_es fst_Elastic开源社区的博客-CSDN博客 【…...

2023软考考哪个证书好?

软考有三个级别&#xff08;初级&#xff0c;中级和高级&#xff09;&#xff0c;这三个级别分别对应5个方向&#xff0c;下面这张图片呢&#xff0c;可以一目了然&#xff0c;一些小小建议&#xff01;&#xff01;&#xff01;遵循一个原则&#xff1a;首先选专业对口的科目&…...

一般人我劝你不要自学软件测试!!!

本人5年测试经验&#xff0c;在学测试之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说&#xff1a;自学软件测试&#xff0c;一般人我还是劝你算了吧&#xff1f;因为我就是那个一般人&#xff01; 软件测试基础真的很简单&…...

docker/docker-compose 安装mysql5.7

目录使用docker安装mysql5.7docker普通安装docker生产环境安装使用docker-compose 安装注意注意一:docker-compose权限问题注意二:docker pull 找不到镜像使用docker安装mysql5.7 docker普通安装 docker pull mysql:5.7 # 启动容器 docker run -p 3306:3306 --name mysql -e …...

【C++设计模式】学习笔记(6):Bridge 桥模式

目录 简介动机(Motivation)模式定义结构(Structure)要点总结笔记结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金…...

Allegro如何批量快速修改复用好的模块操作指导

Allegro如何批量快速修改复用好的模块操作指导 在做PCB设计的时候,相同模块可以用reuse复用的功能,可以大大提升效率,但是模块需要修改的时候,其它模块也要跟着修改,逐个再去复用一遍比较费时间,Allegro支持批量快速修改复用好的模块 前提是相同模块必须是相同的mdd文件…...

让我百思不得其解的infer究竟是怎么推导类型的?

情景再现 有这么一个条件类型的基本语法: T extends U ? X : Y; 如果占位符类型U是一个可以被分解成几个部分的类型&#xff0c;譬如数组类型&#xff0c;元组类型&#xff0c;函数类型&#xff0c;字符串字面量类型等。这时候就可以通过infer来获取U类型中某个部分的类型。 …...

E8-怎么实现根据表单内容自动生成标题

背景 可能有些小伙伴看到这个话题&#xff0c;觉得非常简单&#xff0c;在发起人步骤设置标题可编辑&#xff0c;在有关的控件中设置事件去更新标题就可以了呗。但如果想要标题字段里包含编号呢&#xff0c;而编号是在具体路径的高级设置里设置的&#xff0c;在某个出口生成的…...

【ArUco GridBoard实战】从精度瓶颈到优化检测的完整指南

1. ArUco GridBoard的精度瓶颈与优化思路 在实际的计算机视觉项目中&#xff0c;我们经常会遇到标定板尺寸受限的情况。比如我之前做的一个工业检测项目&#xff0c;标定板尺寸被限制在3cm2cm以内。最初使用的是Charuco标定板&#xff0c;但很快就发现了一个严重问题&#xff1…...

解决90%部署难题:TVM模型序列化全流程解析与最佳实践

解决90%部署难题&#xff1a;TVM模型序列化全流程解析与最佳实践 你是否还在为深度学习模型部署时的兼容性问题头疼&#xff1f;当需要将训练好的模型从开发环境迁移到生产服务器&#xff0c;或是在不同硬件设备间移植时&#xff0c;是否经常遇到格式不兼容、性能下降或依赖冲…...

Fast-Android-Networking请求优先级设置终极指南:提升应用性能的10个技巧

Fast-Android-Networking请求优先级设置终极指南&#xff1a;提升应用性能的10个技巧 【免费下载链接】Fast-Android-Networking &#x1f680; A Complete Fast Android Networking Library that also supports HTTP/2 &#x1f680; 项目地址: https://gitcode.com/gh_mirr…...

百川2-13B量化版调优指南:提升OpenClaw任务成功率的关键参数

百川2-13B量化版调优指南&#xff1a;提升OpenClaw任务成功率的关键参数 1. 为什么需要专门调优百川模型参数&#xff1f; 第一次用OpenClaw对接百川2-13B量化版时&#xff0c;我遇到了典型的"自动化尴尬"——明明是个简单的文件整理任务&#xff0c;AI却总在奇怪的…...

SpringBoot集成MinIO实战:从零构建企业级文件存储服务

1. 为什么选择MinIO作为企业级文件存储方案 MinIO这几年在企业级存储领域越来越火&#xff0c;我最早接触它是在2018年做电商项目时遇到的图片存储需求。当时对比了FastDFS、HDFS等方案后&#xff0c;最终选择了MinIO&#xff0c;现在回头看这个决定非常正确。MinIO最吸引人的地…...

OpenClaw本地知识库:nanobot处理私有化文档问答

OpenClaw本地知识库&#xff1a;nanobot处理私有化文档问答 1. 为什么需要本地知识库助手 去年我接手了一个技术文档整理项目&#xff0c;团队积累了超过2000份内部技术文档、会议纪要和产品说明。每次新人入职或者遇到特定技术问题时&#xff0c;我们都要在这些文档里大海捞…...

本地AI视频剪辑终极实战:用FunClip构建智能内容创作工作流

本地AI视频剪辑终极实战&#xff1a;用FunClip构建智能内容创作工作流 【免费下载链接】FunClip Open-source, accurate and easy-to-use video clipping tool, LLM based AI clipping intergrated || 开源、精准、方便的视频切片工具&#xff0c;集成了大语言模型AI智能剪辑功…...

避坑指南:Python 3.9与Transformers 3.0不兼容?手把手解决BERT环境搭建中的版本冲突

深度解析Python与Transformers版本冲突&#xff1a;从报错到BERT环境完美搭建 当你在深夜调试代码时&#xff0c;突然遭遇"module signal has no attribute SIGKILL"的红色报错——这可能是Python 3.9与Transformers 3.0不兼容的典型症状。本文将带你深入理解版本冲突…...

3步实现游戏ROM高效管理:RomM自托管解决方案完整指南

3步实现游戏ROM高效管理&#xff1a;RomM自托管解决方案完整指南 【免费下载链接】romm A beautiful, powerful, self-hosted rom manager 项目地址: https://gitcode.com/GitHub_Trending/rom/romm 游戏ROM管理是每位怀旧游戏爱好者的必修课&#xff0c;但面对成千上万…...

Phi-4-Reasoning-Vision多场景:科研文献插图理解+实验数据交叉验证应用

Phi-4-Reasoning-Vision多场景&#xff1a;科研文献插图理解实验数据交叉验证应用 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为双卡4090环境优化。该工具严格遵循官方SYSTEM PROMPT规范&#…...