【Java EE】文件内容的读写⸺数据流

目录

  • 🌴数据流的概念
    • 🌸数据流分类
  • 🌳字节流的读写
    • 🌸InputStream(从文件中读取字节内容)
      • 🌻示例1
      • 🌻示例2
      • 🌻利用 Scanner 进行字符读取
    • 🌸OutputStream(向文件中写内容)
      • 🌻示例1
      • 🌻示例2
      • 🌻利⽤ PrintWriter 找到我们熟悉的⽅法
  • 🎄字符流的读写
    • 🌸Reader(读操作)
    • 🌸Writer(写操作)
  • 🦚小程序练习
    • 练习一
    • 练习二
    • 练习三

🌴数据流的概念

在这里插入图片描述
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。

数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。

不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。

“流是磁盘或其它外围设备中存储的数据的源点或终点。”

在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,但是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。

对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是另外一个容器。那又怎样把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?

在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:

标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。

总结的基本概念如下:

数据流:一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。
输入流(Input Stream):程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道
输出流(Output Stream):程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。
采用数据流的目的就是使得输出输入独立于设备。Input Stream不关心数据源来自何种设备(键盘,文件,网络)Output Stream不关心数据的目的是何种设备(键盘,文件,网络)

🌸数据流分类

流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。因此Java中的流分为两种:

  • 字节流:数据流中最小的数据单元是字节

  • 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。

🌳字节流的读写

🌸InputStream(从文件中读取字节内容)

方法
在这里插入图片描述

说明
InputStream 只是⼀个抽象类,要使⽤还需要具体的实现类。关于 InputStream 的实现类有很多,基
本可以认为不同的输⼊设备都可以对应⼀个 InputStream 类,我们现在只关⼼从⽂件中读取,所以使
⽤== FileInputStream==

FileInputStream构造方法

签名说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

我们在使用该实例化对对象进行操作时我们该可以分为以下几步

  1. 打开文件
  2. 进行读写操作
  3. 关闭文件

但是这里我们需要注意的是,每一次打开文件都会消耗一些相应的资源,而每一个进程的资源时有限的,所以我们一定要注意关闭文件操作,但是关闭文件操作可能会因为某些情况忘记写,或者没执行到。这时候就会出现问题

这时候我们想到一个办法,使用final进行执行这一步操作

InputStream reader = new FileInputStream("D:/tmp.txt");
try {//一系列读写操作
} finally {reader.close();
}

但是这样写太繁琐,代码也不美观,所以Java里面提供了以下写法

try(InputStream reader = new FileInputStream("D:/tmp.txt")) {//	一系列操作
}

这里虽然没有写会执行到close,但是在try执行结束后就会执行到;

这是因为该类实现了Closeable接口
在这里插入图片描述

🌻示例1

将⽂件完全读完的两种⽅式。相⽐较⽽⾔,后⼀种的 IO 次数更少,性能更好。

  • 方式一:一个字节一个字节读
  • 在这里插入图片描述
import java.io.*;public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello。txt")) {while (true) {int b = is.read();if (b == -1) {// 代表文件已经全部读完break;}System.out.print((char)b + "");}}}
}

结果:
在这里插入图片描述

  • 方式二:缓冲区读法
import java.io.*;public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello")) {while (true) {byte[] buffer = new byte[1024];int b = is.read(buffer);if (b == -1) {// 代表文件已经全部读完break;}for(int i = 0; i < b ; i ++) {System.out.print((char) buffer[i] + "");}}}}
}

两种方式对比
更推荐方式二,效率更高,就比如你练习网球发球,你需要不断的发球,一大筐网球放在体育教材室里面,你现在有两种做法,第一种一次:拿一个来发球,发完了,又回去拿,第二种:一次拿一筐放在脚边不断发球

很明显第二种效率更高,上述两种方式也是如此

🌻示例2

这里我们把文件内容中填充中文看看,hello.txt 中填写 “你好”
在这里插入图片描述
注意:写中文的时候使用 UTF-8 编码。如果强转为char会出现乱码问题。

我们使用16进制对结果进行输出时,就输出的是它们各自对应的 UTF-8 编码,如下所示:
在这里插入图片描述
三个字节表示一个字

这里我们就可以利用了这几个中文的 UTF-8 编码后长度刚好是 3 个字节和长度不超过 1024 字节的现状,但这种方式并不是通用的

代码如下:

import java.io.*;
// 需要先在项⽬⽬录下准备好⼀个 hello.txt 的⽂件,⾥⾯填充 "你好" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {byte[] buf = new byte[1024];int len;while (true) {len = is.read(buf);if (len == -1) {// 代表⽂件已经全部读完break;}// 每次使⽤ 3 字节进⾏ utf-8 解码,得到中⽂字符// 利⽤ String 中的构造⽅法完成// 这个⽅法了解下即可,不是通⽤的解决办法for (int i = 0; i < len; i += 3) {String s = new String(buf, i, 3, "UTF-8");System.out.printf("%s", s);}}}}
}

在这里插入图片描述

🌻利用 Scanner 进行字符读取

上述例⼦中,我们看到了对字符类型直接使⽤ InputStream 进⾏读取是⾮常⿇烦且困难的,所以,我
们使⽤⼀种我们之前⽐较熟悉的类来完成该⼯作,就是 Scanner 类。

构造方法说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取

代码实现如下:

import java.io.*;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNext()) {String s = scanner.next();System.out.print(s);}}}}
}

在这里插入图片描述

🌸OutputStream(向文件中写内容)

该类的方法有
| 修饰符及返回值类型 | 方法签名 |
|--|--|
|  |  |

说明
OutputStream 同样只是⼀个抽象类,要使⽤还需要具体的实现类。我们现在还是只关⼼写⼊⽂件
中,所以使⽤ FileOutputStream

接下来
利⽤ OutputStreamWriter 进⾏字符写⼊

🌻示例1

import java.io.*;
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {os.write('H');os.write('e');os.write('l');os.write('l');os.write('o');// 不要忘记 flushos.flush();}}
}

在这里插入图片描述
注意:此处的write操作会先清除该文件里面的内容再进行填充

那么如何才能不清除文件而实现续写呢?其实很简单,我们只需要在构造对象时,使用带有true参数的构造方法就好

比如以下代码对上述文件进行续写操作

public class Main1 {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("hello.txt",true)) {os.write('H');os.write('e');os.write('l');os.write('l');os.write('o');// 不要忘记 flushos.flush();}}
}

最后注意一点:

  • 我们在写操作完成后,一定要flush冲刷一下,也就是刷新一下

🌻示例2

import java.io.*;
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'};os.write(b);// 不要忘记 flushos.flush();}}
}

代码:

import java.io.*;
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'};os.write(b, 0, 4);// 不要忘记 flushos.flush();}}
}

代码:
写入汉字

import java.io.*;
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);// 不要忘记 flushos.flush();}}
}

🌻利⽤ PrintWriter 找到我们熟悉的⽅法

上述,我们其实已经完成输出⼯作,但总是有所不⽅便,我们接来下将 OutputStream 处理下,使⽤
PrintWriter 类来完成输出,因为
PrintWriter 类中提供了我们熟悉的 print/println/printf ⽅法

    OutputStream os = ...;OutputStreamWriter osWriter = new OutputStreamWriter(os, "utf-8"); // 告诉PrintWriter writer = new PrintWriter(osWriter);
// 接下来我们就可以⽅便的使⽤ writer 提供的各种⽅法了writer.print("Hello");writer.println("你好");writer.printf("%d: %s\n", 1, "没什么");
// 不要忘记 flushwriter.flush();

🎄字符流的读写

🌸Reader(读操作)

这里是需要实例化一个 FileReader进行操作,可使用的方法参考字节流

这里的字符流操作与字节流操作类似,这里不做过多赘述,直接看代码

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class IODemo3 {public static void main(String[] args) {try(Reader reader = new FileReader("D:/tmp.txt")) {while(true) {int n = reader.read();if(n == -1) {break;}System.out.print((char)n + "");}} catch (IOException e) {throw new RuntimeException(e);}}
}

再来一个数组版本的吧

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class IODemo3 {public static void main(String[] args) {char[] arr = new char[1024];try(Reader reader = new FileReader("D:/tmp.txt")) {while(true) {int n = reader.read(arr);if(n == -1) {break;}for(int i = 0; i < n ; i ++) {System.out.print(arr[i] + "");}}} catch (IOException e) {throw new RuntimeException(e);}}
}

🌸Writer(写操作)

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class IODemo4 {public static void main(String[] args) {try(Writer writ = new FileWriter("D:/tmp.txt")) {writ.write("祝大家万事如意!");writ.flush();} catch (IOException e) {throw new RuntimeException(e);}}
}

🦚小程序练习

练习一

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

import java.io.*;
import java.util.*;
public class Test1 {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);System.out.print("请输入要扫描的根目录(绝对路径 OR 相对路径): ");String rootDirPath = scanner.next();File rootDir = new File(rootDirPath);if (!rootDir.isDirectory()) {System.out.println("您输入的根目录不存在或者不是目录,退出");return;}System.out.print("请输入要找出的文件名中的字符: ");String token = scanner.next();List<File> result = new ArrayList<>();
// 因为文件系统是树形结构,所以我们使用深度优先遍历(递归)完成遍历scanDir(rootDir, token, result);System.out.println("共找到了符合条件的文件 " + result.size() + " 个,它们分别是");for (File file : result) {System.out.println(file.getCanonicalPath() + " 请问您是否要删除该文件?y/n");String in = scanner.next();if (in.toLowerCase().equals("y")) {file.delete();}}}private static void scanDir(File rootDir, String token, List<File> result) {File[] files = rootDir.listFiles();if (files == null || files.length == 0) {return;}for (File file : files) {if (file.isDirectory()) {scanDir(file, token, result);} else {if (file.getName().contains(token)) {result.add(file.getAbsoluteFile());}}}}
}

练习二

进行普通文件的复制

import java.io.*;
import java.util.*;
public class Test2 {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);System.out.print("请输入要复制的文件(绝对路径 OR 相对路径): ");String sourcePath = scanner.next();File sourceFile = new File(sourcePath);if (!sourceFile.exists()) {System.out.println("文件不存在,请确认路径是否正确");return;}if (!sourceFile.isFile()) {System.out.println("文件不是普通文件,请确认路径是否正确");return;}System.out.print("请输入要复制到的目标路径(绝对路径 OR 相对路径): ");String destPath = scanner.next();File destFile = new File(destPath);if (destFile.exists()) {if (destFile.isDirectory()) {System.out.println("目标路径已经存在,并且是一个目录,请确认路径是否正确");return;}if (destFile.isFile()) {System.out.println("目录路径已经存在,是否要进行覆盖?y/n");String ans = scanner.next();if (!ans.toLowerCase().equals("y")) {System.out.println("停止复制");return;}}}try (InputStream is = new FileInputStream(sourceFile)) {try (OutputStream os = new FileOutputStream(destFile)) {byte[] buf = new byte[1024];int len;while (true) {len = is.read(buf);if (len == -1) {break;}os.write(buf, 0, len);}os.flush();}}System.out.println("复制已完成");}
}

练习三

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

注意:我们现在的方案性能较差,所以尽量不要在太复杂的目录下或者大文件下实验

import java.io.*;
import java.util.*;
public class Test3 {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);System.out.print("请输入要扫描的根目录(绝对路径 OR 相对路径): ");String rootDirPath = scanner.next();File rootDir = new File(rootDirPath);if (!rootDir.isDirectory()) {System.out.println("您输入的根目录不存在或者不是目录,退出");return;}System.out.print("请输入要找出的文件名中的字符: ");String token = scanner.next();List<File> result = new ArrayList<>();// 因为文件系统是树形结构,所以我们使用深度优先遍历(递归)完成遍历scanDirWithContent(rootDir, token, result);System.out.println("共找到了符合条件的文件 " + result.size() + " 个,它们分别是");for (File file : result) {System.out.println(file.getCanonicalPath());}}private static void scanDirWithContent(File rootDir, String token,List<File> result) throws IOException {File[] files = rootDir.listFiles();if (files == null || files.length == 0) {return;}for (File file : files) {if (file.isDirectory()) {scanDirWithContent(file, token, result);} else {if (isContentContains(file, token)) {result.add(file.getAbsoluteFile());}}}}// 我们全部按照utf-8的字符文件来处理private static boolean isContentContains(File file, String token) throwsIOException {StringBuilder sb = new StringBuilder();try (InputStream is = new FileInputStream(file)) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNextLine()) {sb.append(scanner.nextLine());sb.append("\r\n");}}}return sb.indexOf(token) != -1;}
}

⭕总结
关于《【Java EE】文件内容的读写⸺数据流》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

00. Nginx总结-错误汇总

/www/wangmingqu/index.html" is forbidden (13: Permission denied) 错误图片 错误日志 2024/01/09 22:26:27 [error] 1737#1737: *1 "/www/wangmingqu/index.html" is forbidden (13: Permission denied), client: 192.169.1.101, server: www.wangmingqu.c…

算法:滑动窗口

文章目录 例题1&#xff1a;长度最小的子数组例题2&#xff1a;无重复字符的最长子串例题3&#xff1a;最大连续1的个数 III例题4&#xff1a;将 x 减到 0 的最小操作数例题5&#xff1a;水果成篮例题6&#xff1a;找到字符串中所有字母异位词例题7&#xff1a;串联所有单词的子…

碳视野|全国首个ESG区域行动方案通过,上海政府推进ESG有八“要”

引领绿色转型&#xff0c;共筑低碳未来&#xff01;AMT企源碳管理团队深入解读碳领域政策、概念及标准&#xff0c;分享实践经验&#xff0c;助力产业绿色发展。我们启动“碳视野、碳课堂、碳实践”三大专栏&#xff0c;紧跟碳行业政策动态&#xff0c;以“科普实践分享”为核心…

【python】六个常见爬虫案例【附源码】

大家好&#xff0c;我是博主英杰&#xff0c;整理了几个常见的爬虫案例&#xff0c;分享给大家&#xff0c;适合小白学习 一、爬取豆瓣电影排行榜Top250存储到Excel文件 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序&a…

STM32 GPIO的几种工作模式

介绍STM32 GPIO的几种工作模式 1、输出模式 STM32的引脚输出有两种方式&#xff1a; 1、推挽输出 2、开漏输出 1.1 推挽输出 当引脚设置为推挽输出时&#xff0c;P-MOS和N-MOS共同配合工作。 当使用HAL库 //该函数的作用就是将P-MOS导通&#xff0c;N-MOS关…

SqlServer中连续号及断号查询—附源码

效果如下图所示&#xff1a; SqlServer中连续号及断号查询SQL如下&#xff1a; --1.定义临时表 DECLARE TestTemp TABLE(TestCode NVARCHAR(50),TestNum INT )DECLARE DataTemp TABLE(TestCode NVARCHAR(50),TestNumStr NVARCHAR(100) )--2.插入测试数据 INSERT INTO TestT…

国产体脂方案——蓝牙体脂秤方案

蓝牙体脂秤采用的就是BIA生物电阻抗技术&#xff0c;用户仅需1次测量&#xff0c;就能知道身体的脂肪率&#xff0c;水分率&#xff0c;基础代谢率&#xff0c;肌肉量&#xff0c;骨量&#xff0c;蛋白质&#xff0c;BMI&#xff0c;体重&#xff0c;身体的得分&#xff0c;年龄…

Linux:kubernetes(k8s)pod的基础操作(6)

Linux&#xff1a;kubernetes&#xff08;k8s&#xff09;允许在任意节点使用kubectl命令&#xff08;5&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136460090?spm1001.2014.3001.5501 我在前两张进行了基础环境的一系列搭建&#xff0c;现在就正…

深度学习_18_模型的下载与读取

在深度学习的过程中&#xff0c;需要将训练好的模型运用到我们要使用的另一个程序中&#xff0c;这就需要模型的下载与转移操作 代码&#xff1a; import math import torch from torch import nn from d2l import torch as d2l import matplotlib.pyplot as plt# 生成随机的…

NFTScan :什么是 ERC-404?深入解读 NFT 协议的未来

上月初&#xff0c;ERC-404 成为最首要热门的话题&#xff0c;ERC-404 是由 Pandora 团队在 2 月初为创作者和开发者等开源的实验性代币标准&#xff0c;其混合 ERC-20 / ERC-721 实现&#xff0c;具有原生流动性和碎片化等特点。伴随着早期的发展&#xff0c;越来越多参与者开…

win10安全中心误删文件怎么办?解析恢复与预防策略

在使用Windows 10的过程中&#xff0c;许多用户依赖于其内置的安全中心来保护电脑免受恶意软件的侵害。然而&#xff0c;有时安全中心的误判可能导致重要文件被错误地删除。当面对这种情况时&#xff0c;了解如何恢复误删的文件并掌握预防措施显得尤为重要。本文将为您详细解析…

java常用技术栈,java面试带答案

前言 我们从一个问题引入今天的主题。 在日常业务开发中&#xff0c;我们可能经常听到 DBA 对我们说“不要”&#xff08;注意&#xff1a;不是禁止&#xff09;使用 join&#xff0c;那么为什么 DBA 对 join 这么抵触呢&#xff1f;是 join 本身有问题&#xff0c;还是我们使…

私募证券基金动态-24年2月报

成交量&#xff1a;2月日均9492.60亿元 2024年2月A股两市日均成交9492.60亿元&#xff0c;环比增加30.38%、同比增加5.77%。2月整体15个交易日&#xff0c;有4个单日交易日成交金额过万亿&#xff0c;单日交易日最高成交金额为13576.43亿元&#xff08;2月28日&#xff09;&am…

MySQL 学习笔记(基础篇 Day1)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 MySQL 概述 1.1 数据库相关概念 1.2 MySQL 数据库 2 SQL 2.1 SQL 通用语法 2.2 SQL 分类 2.3 DDL 2.4 图形…

【leetcode C++】电话号码的字母组合

17. 电话号码的字母组合 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 题目链接 . - 力扣&#xff08;LeetCode&…

1.类和对象-友元

文章目录 1.全局函数做友元代码运行结果 2.类做友元代码运行结果 1.全局函数做友元 思路分析&#xff1a; 正常情况下&#xff0c;全局函数visit()中的ROOM 类变量r是访问不到Building类中的私有成员的。但是通过在Building类中添加使用全局函数做友元&#xff0c;即可访问私有…

什么是ElasticSearch的深度分页问题?如何解决?

在ElasticSearch中进行分页查询通常使用from和size参数。当我们对ElasticSearch发起一个带有分页参数的查询(如使用from和size参数)时,ElasticSearch需要遍历所以匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档 在这个例子中: 1.from 参数定义…

代码学习记录13

随想录日记part13 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.06 主要内容&#xff1a;今天的主要内容是二叉树的第二部分哦&#xff0c;主要有层序遍历&#xff1b;翻转二叉树&#xff1b;对称二叉树。 102.二叉树的层序遍历226.翻转二叉树101. 对称二叉…

LeetCode-第67题-二进制求和

1.题目描述 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 2.样例描述 3.思路描述 将两个二进制字符串转换成整型&#xff0c;然后相加后的整型转为二进制字符串 4.代码展示 class Solution(object):def addBinary(self, a, b):# 将字符串…

AI新工具(20240306) mlx-swift-chat Mac运行本地模型;Comflowyspace开源AI图像和视频生成工具

1: mlx-swift-chat 专为 Apple 硅片设计的高效机器学习框架&#xff0c;支持在本地实时运行 LLM 模型&#xff08;如 Llama、Mistral&#xff09; mlx-swift-chat 是一个为苹果系统&#xff08;例如你的笔记本电脑上的Apple Silicon&#xff09;特别设计的机器学习框架 MLX 的…