Java IO知识点总结
<------------------------------廖雪峰学Java---------------------------------->
目录
- 1. File对象
- 2. InputStream
- 3. OutputStream
- 4. Filter模式(装饰者模式)
- 5. 直接读取Zip压缩文件的内容
- 6. 读取classpath资源
- 7. 序列化
- 8. Reader
- 9. Writer
- 10. PrintStream以及PrintWriter
- 11. 使用Files工具类
1. File对象
- Java的标准库java.io提供了File对象来操作文件和目录
- File对象有3种形式表示的路径,一种是getPath(),返回构造方法传入的路径,一种是getAbsolutePath(),返回绝对路径,一种是getCanonicalPath,它和绝对路径类似,但是返回的是规范路径
- File对象有一个静态变量用于表示当前平台的系统分隔符:
System.out.println(File.separator); // 根据当前平台打印"\"或"/"
- 构造一个File对象,即使传入的文件或目录不存在,代码也不会出错,因为构造一个File对象,并不会导致任何磁盘操作。只有当我们调用File对象的某些方法的时候,才真正进行磁盘操作
- 调用isFile(),判断该File对象是否是一个已存在的文件,调用isDirectory(),判断该File对象是否是一个已存在的目录
- 判断文件的权限和大小:
boolean canRead():是否可读;
boolean canWrite():是否可写;
boolean canExecute():是否可执行;
long length():文件字节大小。
对目录而言,是否可执行表示是否能够列出其子文件夹及子文件
- 当File对象表示一个文件时,可以通过createNewFile()创建一个新文件,用delete()删除该文件:
File file = new File("/path/to/file");
if (file.createNewFile()) {// 文件创建成功:// TODO:if (file.delete()) {// 删除文件成功:}
}
- File对象提供了createTempFile()来创建一个临时文件,以及deleteOnExit() 在JVM退出时自动删除该文件
- 当File对象表示一个目录时,可以使用list() 和listFiles() 列出目录下的文件和子目录名。listFiles()提供了一系列重载方法,可以过滤不想要的文件和目录:
public class Main {public static void main(String[] args) throws IOException {File f = new File("C:\\Windows");File[] fs1 = f.listFiles(); // 列出所有文件和子目录printFiles(fs1);File[] fs2 = f.listFiles(new FilenameFilter() { // 仅列出.exe文件public boolean accept(File dir, String name) {return name.endsWith(".exe"); // 返回true表示接受该文件}});printFiles(fs2);}static void printFiles(File[] files) {System.out.println("==========");if (files != null) {for (File f : files) {System.out.println(f);}}System.out.println("==========");}
}
- File对象如果表示一个目录,可以通过以下方法创建和删除目录:
boolean mkdir():创建当前File对象表示的目录;
boolean mkdirs():创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来;
boolean delete():删除当前File对象表示的目录,当前目录必须为空才能删除成功。
- Java标准库还提供了一个Path对象,它位于java.nio.file包。Path对象和File对象类似,但操作更加简单:
public class Main {public static void main(String[] args) throws IOException {Path p1 = Paths.get(".", "project", "study"); // 构造一个Path对象System.out.println(p1);Path p2 = p1.toAbsolutePath(); // 转换为绝对路径System.out.println(p2);Path p3 = p2.normalize(); // 转换为规范路径System.out.println(p3);File f = p3.toFile(); // 转换为File对象System.out.println(f);for (Path p : Paths.get("..").toAbsolutePath()) { // 可以直接遍历PathSystem.out.println(" " + p);}}
}
2. InputStream
- InputStream是Java标准库提供的最基本的输入流。它位于java.io这个包里。java.io包提供了所有同步IO的功能
- InputStream是一个抽象类,它是所有输入流的超类。这个抽象类定义的一个最重要的方法就是int read(),签名如下:
public abstract int read() throws IOException;
// 这个方法会读取输入流的下一个字节,并返回字节表示的int值(0~255)。如果已读到末尾,返回-1表示不能继续读取了
- FileInputStream是InputStream的一个子类。顾名思义,FileInputStream就是从文件流中读取数据
- InputStream和OutputStream都是通过close()方法来关闭流。关闭流就会释放对应的底层资源
- 在读取或写入IO流的过程中,可能会发生错误,例如,文件不存在导致无法读取,没有写权限导致写入失败,等等,这些底层错误由Java虚拟机自动封装成IOException异常并抛出。因此,所有与IO操作相关的代码都必须正确处理IOException
- 利用Java 7引入的新的try(resource) 的语法,只需要编写try语句,让编译器自动为我们关闭资源:
public void readFile() throws IOException {try (InputStream input = new FileInputStream("src/readme.txt")) {int n;while ((n = input.read()) != -1) {System.out.println(n);}} // 编译器在此自动为我们写入finally并调用close()
}
编译器只看try(resource = …)中的对象是否实现了java.lang.AutoCloseable接口,如果实现了,就自动加上finally语句并调用close()方法。InputStream和OutputStream都实现了这个接口,因此,都可以用在try(resource)中
- 很多流支持一次性读取多个字节到缓冲区,对于文件和网络流来说,利用缓冲区一次性读取多个字节效率往往要高很多。InputStream提供了两个重载方法来支持读取多个字节:
int read(byte[] b):读取若干字节并填充到byte[]数组,返回读取的字节数
int read(byte[] b, int off, int len):指定byte[]数组的偏移量和最大填充数
//利用上述方法一次读取多个字节时,需要先定义一个byte[]数组作为缓冲区,
//read()方法会尽可能多地读取字节到缓冲区, 但不会超过缓冲区的大小。
//read()方法的返回值不再是字节的int值,而是返回实际读取了多少个字节。
//如果返回-1,表示没有更多的数据public void readFile() throws IOException {try (InputStream input = new FileInputStream("src/readme.txt")) {// 定义1000个字节大小的缓冲区:byte[] buffer = new byte[1000];int n;while ((n = input.read(buffer)) != -1) { // 读取到缓冲区System.out.println("read " + n + " bytes.");}}
}
- 在调用InputStream的read()方法读取数据时,read()方法是阻塞(Blocking)的,即必须等待read()方法返回才能执行下一行代码
- ByteArrayInputStream可以在内存中模拟一个InputStream:
public class Main {public static void main(String[] args) throws IOException {byte[] data = { 72, 101, 108, 108, 111, 33 };try (InputStream input = new ByteArrayInputStream(data)) {int n;while ((n = input.read()) != -1) {System.out.println((char)n);}}}
}
- ByteArrayInputStream实际上是把一个byte[]数组在内存中变成一个InputStream,虽然实际应用不多,但测试的时候,可以用它来构造一个InputStream:
public class Main {public static void main(String[] args) throws IOException {byte[] data = { 72, 101, 108, 108, 111, 33 };try (InputStream input = new ByteArrayInputStream(data)) {// 不需要真的提供一个FileInputStream,用ByteArrayInputStream来模拟即可String s = readAsString(input);System.out.println(s);}}public static String readAsString(InputStream input) throws IOException {int n;StringBuilder sb = new StringBuilder();while ((n = input.read()) != -1) {sb.append((char) n);}return sb.toString();}
}
3. OutputStream
- OutputStream是Java标准库提供的最基本的输出流,是所有输出流的超类。这个抽象类定义的一个最重要的方法就是void write(int b),这个方法会写入一个字节到输出流。要注意的是,虽然传入的是int参数,但只会写入一个字节,即只写入int最低8位表示字节的部分
- OutputStream也提供了close()方法关闭输出流,以便释放系统资源。要特别注意:OutputStream还提供了一个flush()方法,它的目的是将缓冲区的内容真正输出到目的地。
一般来说,系统会等到缓冲区写满时再一次 性输出,flush()方法的作用是强制输出缓冲区的内容
- 通常情况下,我们不需要调用这个flush()方法,因为缓冲区写满了OutputStream会自动调用它,并且,在调用close()方法关闭OutputStream之前,也会自动调用flush()方法,但是在要求快速响应的场景(如聊天服务)下就需要手动调用flush方法
- FileOutputStream为例,演示如何将若干个字节写入文件流:
public void writeFile() throws IOException {OutputStream output = new FileOutputStream("out/readme.txt");output.write(72); // Houtput.write(101); // eoutput.write(108); // loutput.write(108); // loutput.write(111); // ooutput.close();
}public void writeFile() throws IOException {try (OutputStream output = new FileOutputStream("out/readme.txt")) {output.write("Hello".getBytes("UTF-8")); // Hello} // 编译器在此自动为我们写入finally并调用close()
}
- OutputStream的write()方法是阻塞的
- FileOutputStream可以从文件获取输出流,这是OutputStream常用的一个实现类。此外,ByteArrayOutputStream可以在内存中模拟一个OutputStream
- 同时操作多个AutoCloseable资源时,在try(resource) { … }语句中可以同时写出多个资源,用;隔开。例如,同时读写两个文件:
// 读取input.txt,写入output.txt:
try (InputStream input = new FileInputStream("input.txt");OutputStream output = new FileOutputStream("output.txt"))
{input.transferTo(output); // transferTo的作用是?
}
4. Filter模式(装饰者模式)
InputStream/OutputStream的功能并不是一成不变的,例如我们想要给流添加上“缓存”,“签名”,“加密”等功能时,如果通过直接创建各类型子类的话会出现“子类爆炸”的问题(即:子类数目过多,可想而知,各功能的Stream成一个子类,不同功能之间的组合同样也是子类,而这样的组合数量过多)。因此,Java主张使用Filter模式(“装饰者模式”,decorator)来对Stream对象进行包装。
- 为了解决依赖继承会导致子类数量失控的问题,JDK首先将InputStream分为两大类:
一类是直接提供数据的基础InputStream,例如:FileInputStreamByteArrayInputStreamServletInputStream一类是提供额外附加功能的InputStream,例如:BufferedInputStreamDigestInputStreamCipherInputStream
- 当我们需要给一个“基础”InputStream附加各种功能时,我们先确定这个能提供数据源的InputStream,如FileInputStream等:
InputStream file = new FileInputStream("test.gz");
- 紧接着,我们希望FileInputStream能提供缓冲的功能来提高读取的效率,因此我们用BufferedInputStream包装这个InputStream,得到的包装类型是BufferedInputStream,但它仍然被视为一个InputStream:
InputStream buffered = new BufferedInputStream(file);
- 最后,假设该文件已经用gzip压缩了,我们希望直接读取解压缩的内容,就可以再包装一个GZIPInputStream:
InputStream gzip = new GZIPInputStream(buffered);
- 无论包装多少次,得到的对象始终是InputStream,我们直接用InputStream来引用它:
- 编写FilterInputStream:
public class Main {public static void main(String[] args) throws IOException {byte[] data = "hello, world!".getBytes("UTF-8");try (CountInputStream input = new CountInputStream(new ByteArrayInputStream(data))) {int n;while ((n = input.read()) != -1) {System.out.println((char)n);}System.out.println("Total read " + input.getBytesRead() + " bytes");}}
}class CountInputStream extends FilterInputStream {private int count = 0;CountInputStream(InputStream in) {super(in);}public int getBytesRead() {return this.count;}public int read() throws IOException {int n = in.read();if (n != -1) {this.count ++;}return n;}public int read(byte[] b, int off, int len) throws IOException {int n = in.read(b, off, len);if (n != -1) {this.count += n;}return n;}
}
注意到在叠加多个FilterInputStream,我们只需要持有最外层的InputStream,并且,当最外层的InputStream关闭时(在try(resource)块的结束处自动关闭),内层的InputStream的close()方法也会被自动调用,并最终调用到最核心的“基础”InputStream,因此不存在资源泄露
5. 直接读取Zip压缩文件的内容
-
ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容:
另一个JarInputStream是从ZipInputStream派生,它增加的主要功能是直接读取jar文件里面的MANIFEST.MF文件。因为本质上jar包就是zip包,只是额外附加了一些固定的描述文件。 -
读取Zip文件:创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束;一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,直到返回-1:
try (ZipInputStream zip = new ZipInputStream(new FileInputStream(...))) {ZipEntry entry = null;while ((entry = zip.getNextEntry()) != null) {String name = entry.getName();if (!entry.isDirectory()) {int n;while ((n = zip.read()) != -1) {...}}}
}
- 创建Zip文件:ZipOutputStream是一种FilterOutputStream,它可以直接写入内容到zip包。我们要先创建一个ZipOutputStream,通常是包装一个FileOutputStream,然后,每写入一个文件前,先调用putNextEntry(),然后用write()写入byte[]数据,写入完毕后调用closeEntry()结束这个文件的打包:
try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(...))) {File[] files = ...for (File file : files) {zip.putNextEntry(new ZipEntry(file.getName()));zip.write(getFileDataAsBytes(file));zip.closeEntry();}
}
上面的代码没有考虑文件的目录结构。如果要实现目录层次结构,new ZipEntry(name)传入的name要用相对路径
6. 读取classpath资源
- 从classpath读取文件可以避免不同环境下文件路径不一致的问题:如果我们把properties文件放到classpath中,就不用关心它的实际存放路径
- 在classpath中的资源文件,路径总是以/开头,我们**先获取当前的Class对象,然后调用getResourceAsStream()**就可以直接从classpath读取任意的资源文件:
try (InputStream input = getClass().getResourceAsStream("/default.properties")) {// TODO:
}
- 调用getResourceAsStream()需要特别注意的一点是,如果资源文件不存在,它将返回null
- 把默认的配置放到jar包中,再从外部文件系统读取一个可选的配置文件,就可以做到既有默认的配置文件,又可以让用户自己修改配置:
Properties props = new Properties();
props.load(inputStreamFromClassPath("/default.properties"));
props.load(inputStreamFromFile("./conf.properties"));
7. 序列化
- 序列化是指把一个Java对象变成二进制内容,本质上就是一个byte[]数组
- 一个Java对象要能序列化,必须实现一个特殊的java.io.Serializable接口,Serializable接口没有定义任何方法,它是一个空接口。我们把这样的空接口称为 “标记接口”(Marker Interface) ,实现了标记接口的类仅仅是给自身贴了个“标记”,并没有增加任何方法
- 把一个Java对象变为byte[]数组,需要使用ObjectOutputStream。它负责把一个Java对象写入一个字节流:
ublic class Main {public static void main(String[] args) throws IOException {ByteArrayOutputStream buffer = new ByteArrayOutputStream();try (ObjectOutputStream output = new ObjectOutputStream(buffer)) {// 写入int:output.writeInt(12345);// 写入String:output.writeUTF("Hello");// 写入Object:output.writeObject(Double.valueOf(123.456));}System.out.println(Arrays.toString(buffer.toByteArray()));}
}
- 和ObjectOutputStream相反,ObjectInputStream负责从一个字节流读取Java对象:
try (ObjectInputStream input = new ObjectInputStream(...)) {int n = input.readInt();String s = input.readUTF();Double d = (Double) input.readObject();
}
- readObject()可能抛出的异常有:
ClassNotFoundException:没有找到对应的Class;
InvalidClassException:Class不匹配。对于ClassNotFoundException,这种情况常见于一台电脑上的Java程序把一个Java对象,
例如,Person对象序列化以后,通过网络传给另一台电脑上的另一个Java程序,
但是这台电脑的Java程序并没有定义Person类,所以无法反序列化。对于InvalidClassException,这种情况常见于序列化的Person对象定义了一个int类型的age字段,
但是反序列化时,Person类定义的age字段被改成了long类型,所以导致class不兼容。
- 反序列化时,由JVM直接构造出Java对象,不调用构造方法,构造方法内部的代码,在反序列化时根本不可能执行
- Java本身提供的基于对象的序列化和反序列化机制既存在安全性问题,也存在兼容性问题。更好的序列化方法是通过JSON这样的通用数据结构来实现,只输出基本类型(包括String)的内容,而不存储任何与代码相关的信息
8. Reader
- Reader是Java的IO库提供的另一个输入流接口。和InputStream的区别是,InputStream是一个字节流,即以byte为单位读取,而Reader是一个字符流,即以char为单位读取
- java.io.Reader是所有字符输入流的超类,read()方法读取字符流的下一个字符,并返回字符表示的int,范围是0~65535。如果已读到末尾,返回-1
- FileReader是Reader的一个子类,它可以打开文件并获取Reader,FileReader默认的编码与系统相关(例如如果Windows的默认编码时GBK,那么读取UTF-8编码的文件就会出现乱码),要避免乱码问题,我们需要在创建FileReader时指定编码:
Reader reader = new FileReader("src/readme.txt", StandardCharsets.UTF_8);
- 用**try (resource)**来保证Reader在无论有没有IO错误的时候都能够正确地关闭
- CharArrayReader可以在内存中模拟一个Reader,它的作用实际上是把一个char[]数组变成一个Reader:
try (Reader reader = new CharArrayReader("Hello".toCharArray())) {
}
- StringReader可以直接把String作为数据源,它和CharArrayReader几乎一样:
try (Reader reader = new StringReader("Hello")) {
}
- Reader和InputStream有什么关系?
除了特殊的CharArrayReader和StringReader,普通的Reader实际上是基于InputStream构造的,因为Reader需要从InputStream中读入字节流(byte),然后,根据编码设置,再转换为char就可以实现字符流。如果我们查看FileReader的源码,它在内部实际上持有一个FileInputStream
- InputStreamReader可以把任何InputStream转换为Reader(转换器)。示例代码如下:
// 持有InputStream:
InputStream input = new FileInputStream("src/readme.txt");
// 变换为Reader:
Reader reader = new InputStreamReader(input, "UTF-8");
9. Writer
- Writer就是带编码转换器的OutputStream,它把char转换为byte并输出
- Writer是所有字符输出流的超类,它提供的方法主要有:
写入一个字符(0~65535):void write(int c);
写入字符数组的所有字符:void write(char[] c);
写入String表示的所有字符:void write(String s)。
- FileWriter就是向文件中写入字符流的Writer。它的使用方法和FileReader类似:
try (Writer writer = new FileWriter("readme.txt", StandardCharsets.UTF_8)) {writer.write('H'); // 写入单个字符writer.write("Hello".toCharArray()); // 写入char[]writer.write("Hello"); // 写入String
}
- CharArrayWriter可以在内存中创建一个Writer,它的作用实际上是构造一个缓冲区,可以写入char,最后得到写入的char[]数组,这和ByteArrayOutputStream非常类似:
try (CharArrayWriter writer = new CharArrayWriter()) {writer.write(65);writer.write(66);writer.write(67);char[] data = writer.toCharArray(); // { 'A', 'B', 'C' }
}
- StringWriter也是一个基于内存的Writer,它和CharArrayWriter类似。实际上,StringWriter在内部维护了一个StringBuffer,并对外提供了Writer接口
- 除了CharArrayWriter和StringWriter外,普通的Writer实际上是基于OutputStream构造的,它接收char,然后在内部自动转换成一个或多个byte,并写入OutputStream。因此,OutputStreamWriter就是一个将任意的OutputStream转换为Writer的转换器:
try (Writer writer = new OutputStreamWriter(new FileOutputStream("readme.txt"), "UTF-8")) {// TODO:
}
10. PrintStream以及PrintWriter
- PrintStream是一种FilterOutputStream,它在OutputStream的接口上,额外提供了一些写入各种数据类型的方法:
写入int:print(int)
写入boolean:print(boolean)
写入String:print(String)
写入Object:print(Object),实际上相当于print(object.toString())
...
- 我们经常使用的System.out.println()实际上就是使用PrintStream打印各种数据。其中,System.out是系统默认提供的PrintStream,表示标准输出
- System.err是系统默认提供的标准错误输出
- PrintStream和OutputStream相比,除了添加了一组print()/println()方法,可以打印各种数据类型,比较方便外,它还有一个额外的优点,就是不会抛出IOException,这样我们在编写代码的时候,就不必捕获IOException
- PrintStream最终输出的总是byte数据,而PrintWriter则是扩展了Writer接口,它的print()/println()方法最终输出的是char数据。两者的使用方法几乎是一模一样的:
public class Main {public static void main(String[] args) {StringWriter buffer = new StringWriter();try (PrintWriter pw = new PrintWriter(buffer)) {pw.println("Hello");pw.println(12345);pw.println(true);}System.out.println(buffer.toString());}
}
11. 使用Files工具类
- 从Java 7开始,提供了Files和Paths这两个工具类,能极大地方便我们读写文件,Files和Paths是java.nio包里面的类,他俩封装了很多读写文件的简单方法
- 要把一个文件的全部内容读取为一个byte[],可以这么写:
byte[] data = Files.readAllBytes(Paths.get("/path/to/file.txt"));
- 如果是文本文件,可以把一个文件的全部内容读取为String:
// 默认使用UTF-8编码读取:
String content1 = Files.readString(Paths.get("/path/to/file.txt"));
// 可指定编码:
String content2 = Files.readString(Paths.get("/path/to/file.txt"), StandardCharsets.ISO_8859_1);
// 按行读取并返回每行内容:
List<String> lines = Files.readAllLines(Paths.get("/path/to/file.txt"));
- 写入文件:
// 写入二进制文件:
byte[] data = ...
Files.write(Paths.get("/path/to/file.txt"), data);
// 写入文本并指定编码:
Files.writeString(Paths.get("/path/to/file.txt"), "文本内容...", StandardCharsets.ISO_8859_1);
// 按行写入文本:
List<String> lines = ...
Files.write(Paths.get("/path/to/file.txt"), lines);
- Files工具类还有copy()、delete()、exists()、move()等快捷方法操作文件和目录
- Files提供的读写方法,受内存限制,只能读写小文件,例如配置文件等,不可一次读入几个G的大文件。读写大型文件仍然要使用文件流,每次只读写一部分文件内容
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- keras环境如何使用GPU
如果你确保tf-gpu环境搭建好的情况下,直接用pip install keras即可 注意其中的反例经验 不是吧,天坑?笔者是在反向写?我其实本来先装好的tf-gpu,然后用pip install keras也是可以的,且keras的backend是tensorflow&…...
2024/5/1 15:39:37 - 内网穿透性能深度优化方案
内网穿透:神卓互联发布WanGooe Tunnel 8.0企业级高性能内网穿透通信协议,该协议广泛应用于私有云解决方案,快速穿透复杂的网络环境访问局域网内部,其特点是占有内存少,并发能力强。相较于上一代版本,进行了…...
2024/5/1 7:02:17 - 变长结构体
1、什么叫变长结构体? 如下所示: struct var_st {int len;char data[0]; //c99支持 };sizeof(struct var_st)4; 注意:可能有的编译器不支持char data[0];需要用char data[1]代替,这样上面结构体大小是sizeof(struct …...
2024/4/15 17:04:11 - 网络协议分层
一:应用层 1.使用现成的应用层协议来进行开发 HTTP协议 2.自定义协议 2.1. 客户端给服务器发的请求是啥样的 2.2. 服务器给客户端的响应是啥样的 实际开发中,约定自定义协议大体分为两类: 1.文本格式(把请求响应当成字符串来处理…...
2024/5/1 5:08:27 - comp1521-MIPS(三)结构总结
文章目录1 单层循环结构1 双层循环结构if-else结构1 单层循环结构 li $t0, 0 # int i 0;bomb_loop0:bge $t0, $t1, place_bombs__epilogue # while (i < N_ROWS)########do some thing########addi $t0, $t0, 1 …...
2024/5/1 5:30:15 - python全局变量的声明和使用
python全局变量的定义与使用 python全局变量的定义与使用 2019-03-06 梦寒与锁梦 阅 22418 转 2 使用全局变量分两步走: 1.定义 2.使用时再次声明 即全局变量在使用之前就要声明,声明全局变量使用关键字 global,然后在使用该全局变…...
2024/4/24 23:53:29 - 分布式Id生成算法
温故知新-分布式-分布式Id生成算法&踩过的坑 1、SnowFlake 理解分布式id生成算法SnowFlake 分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。 概述 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图࿱…...
2024/5/1 16:00:29 - 第一节课笔记
#include"bits/stdc.h" #define mb 1001 //如果也是ma的话会冲突报错 using namespace std; const int ma1002; int main() { int a;scanf("%d",&a);//&取地址符 a(a!2)?3:2;//a?b:c 条件运算符 printf("%d\n",a);/*%d整型%ld长整型…...
2024/5/1 9:20:17 - Python编程比赛--学校abcde五个地方参观,(1)如果去a必须去b,(2)de只能选一个(3)bc只能选一个(4)cd两地都去或都不去(5)如去e,ad也必须去。问,新生最多能去哪些地方参观?
Python编程比赛–新生要按一下条件从学校abcde五个地方参观,(1)如果去a必须去b,(2)de只能选一个(3)bc只能选一个(4)cd两地都去或都不去(5…...
2024/5/1 9:10:17 - Nacos注册中心原理及源码系列(一)- 核心源码图及注册表结构
1、注册中心部分核心功能源码图 图链接:04.Nacos注册中心部分核心功能源码图 | ProcessOn免费在线作图,在线流程图,在线思维导图 | 2、Nacos 核心概念 Namespace:用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Da…...
2024/5/1 15:03:00 - DaVinci Resolve Studio 17 for Mac(达芬奇剪辑调色软件)
DaVinci Resolve Studio 17 for Mac是一款运行在Mac OS系统上的知名调色软件,DaVinci Resolve 17是一次重大更新,这一版本汇集了超过100项新功能和200项改进!调色页面设立了新的HDR调色工具,重新设计了一级校色控制工具࿰…...
2024/4/21 12:38:01 - main(String[])中定义了变量 ×××
在JAVA学习过程中我们可能会遇到这样的错误 main(String[])中定义了变量 出现这种问题的原因是: 重复定义了变量。 解决方法: 我们只需把冗余的一次定义给删去即可!...
2024/4/15 17:04:11 - 软考高级系统架构设计师:口令认证和密钥认证的区别
软考高级系统架构设计师:口令认证和密钥认证的区别一、基于口令认证特点二、基于密钥认证特点一、基于口令认证特点 口令认证机制实现简单,但其安全性较低,易受认证攻击。在基于口令的认证方式中,用户口令为用户和认证服务器共享…...
2024/4/15 17:04:52 - 6款软件工具提升产品运营效率
产品运营的日常工作时,会使用到各种各样的软件工具,帮助提升工作效率,但是面对如此众多的软件,选择哪一款更加好用呢?为了省去大家的试错成本,这里推荐6款好用软件。 亿图图示(EdrawMax&#x…...
2024/4/15 17:05:12 - 【Java】Java中让线程休眠一段时间再进行如何操作?
介绍 我们都在项目过程中调用过别人的接口,但是如果频繁的调用接口会被识别出来,跳转到验证码页面进行验证码输入,这样就不能自动化运行程序了,为了解决这一问题,使用线程休眠,让程序的操作频率模仿人类操…...
2024/4/15 17:04:57 - PyTorch下训练数据小文件转大文件读写(附有各种存储格式对比)
目录引言TFRecordtfrecord写入代码:基于PyTorch下tfrecord读取代码:LMDB写入LMDB读取LMDB二进制大文件写入bins读取binsSqlite写入到sqlite数据库中读取数据库最终结论参考资料引言 Tensorflow有着专门的数据读取模块tfrecord,可以高效地读取…...
2024/4/15 17:05:02 - 从上传webshell到突破TCP/IP筛选到3389终端登陆 作者:LvHuaNa
日期:2004.12.11LvHuaNa一:得到webshell今天晚上的一次小小测试,由于本人太菜,再高深的技术我也不会,只能这样了..........一切都已经过去了,没有办法补图了,希望能看的懂这个小帖子。今天又是无聊的一天,晚上实在无聊没有事情干,就到一个视频聊天站点看秀,嘿嘿~突然…...
2024/4/28 6:46:46 - os.chdir用法
def chdir(*args, **kwargs): # real signature unknown"""Change the current working directory to the specified path. os.chdir(project_config[data_path][path]) Python os.chdir() 方法 | 菜鸟教程...
2024/4/28 19:21:22 - CF1594E1 Rubik‘s Cube Coloring (easy version)
又是没弄懂的一题 #include<bits/stdc.h> #define int long long using namespace std;const int mod 1e9 7; signed main() {int n; cin >> n;int f[100005];f[1] 16;for (int i 2; i < n 1; i ){f[i] (f[i - 1] * f[i - 1]) % mod * 16 % mod;}f[0]…...
2024/4/28 13:48:47 - 如何在 MacOS Monterey 菜单栏上显示电池百分比
点击右上角【关注】我们,获取更多前沿科技信息。本文共663字,阅读全文约2分钟苹果的新系统 MacOS Monterey 默认是没有显示出电池的百分比,这让很多习惯在菜单栏中查看电池百分比的用户来说,有一些不适用。因为电池百分比是一种快…...
2024/4/28 17:56:27
最新文章
- 【八大排序(三)】快速排序
❣博主主页: 33的博客❣ ▶️文章专栏分类:八大排序◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多排序知识 目录 1.前言2.快速排序2.1概念2.2画图理解2.3递归代码实现2.3.1Hoare法2.3.2挖坑法2.3.3前…...
2024/5/1 16:14:01 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 同一个pdf在windows和linux中的页数不一样
之前认为PDF的格式,至少页数是不会变化的,结果最近发现一个文档在windows和linux中的页数不一样,linux中的pdf进入像word一样排版变得紧凑了,原本在下一页的几行进入了上一页的末尾。问了gpt后得到这样的回答: PDF文档…...
2024/4/30 1:35:16 - 蓝桥杯第十五届抱佛脚(十)贪心算法
蓝桥杯第十五届抱佛脚(十)贪心算法 贪心算法基本概念 贪心算法是一种在算法设计中常用的方法,它在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。 贪…...
2024/4/30 5:58:17 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/29 23:16:47 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/30 18:14:14 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/30 18:21:48 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/30 9:43:22 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57