JavaSE02-IO
PART02-IO
IO简介
In/Out: 相对于程序而言的输入(读取)和输出(写出)的过程。
即: 通过java程序到磁盘读取数据的过程, 我们称为In的过程, 也就是读取(输入)
将java程序中的数据写入磁盘的过程, 我们称为Out的过程, 也就是写出(输出)
在Java中,根据处理的数据单位不同,分为字节流和字符流。
字节流: 一个字节(byte)一个字节的去读取, 或者写出
字符流: 一个字符一个字符的去读取, 或者写出
JDK核心类库中提供了IO流相关的类, 这些类都在<java.io>包下
流的概念
程序中数据的读取和写入, 可以想象成水流在管道中流动。
– 流只能单方向流动
– 输入流用来读取in
– 输出流用来写出Out
– 数据只能从头到尾顺序的读取一次或写出一次
节点流和处理流
按照流是否直接与特定的地方(如磁盘,内存,设备等)相连,分为节点流和处理流两类
节点流
可以从或向一个特定的地方(节点)读写数据
处理流
是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写
处理流特点
处理流的构造方法总是要带一个其他的流对象做参数,一个流对象经过其他流的多次包装,成为流的链接.
通常节点流也被称之为低级流.处理流也被称之为高级流或者过滤流
节点流
OutputStream抽象类
此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。
FileOutputStream字节输出流
直接插在文件上,直接写出文件数据
创建对象:
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append) –追加
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
注意: 以上构造方法中, 如果参数指向的文件以及父目录都不存在, 将会抛出FileNotFoundException异常!
如果参数指向的文件不存在, 但文件的所在目录存在, 将不会抛异常, 程序会自动创建该文件!
FileOutputStream代码案例
package Part02IO;
import java.io.*;
/*** 文件输出流的使用演示类:* FOS -->FileOutputStream*/
public class FOSDemo {public static void main(String[] args) throws IOException {/*** 文件输出流:通过程序写出 到磁盘上某个路径。*/ // alt + enter + enter//第一种:FileOutputStream fos = new FileOutputStream("./fos.dat");
// //第二种:
// File file = new File("./fos.dat");
// FileOutputStream fos1 = new FileOutputStream(file);/*** void write(int d) 写入的方法* 将给定的int值对应二进制 写入到"低八位" 然后再写入到文件中* int 占 4个字节 在计算机中表示 32 位 32个0来表示* vvvvvvvv* 00000000 00000000 00000000 00000001*///给 fos.dat 写入 00000001fos.write(1);//写入int的数据 --1/*** 将给定的int值对应二进制 写入到"低八位" 然后再写入到文件中* vvvvvvvv* 00000000 00000000 00000000 00000010* *///因为在上面已经为fos.dat写入 00000001 所以继续往后写入的话 会在后面追加// 00000001 00000010fos.write(2);fos.close();//释放 (关闭流体)}
}
InputStream抽象类
此抽象类是表示字节输入流的所有类的超类/抽象类。
FileInputStream子类
直接插在文件上,直接读取文件数据。
创建对象
FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String pathname)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
FileInputStream代码案例
package Part02IO;
import java.io.FileInputStream;
import java.io.IOException;
/*** 文件输入流的使用演示类* FIS --->FileInputStream 用于读取文件*/
public class FISDemo {public static void main(String[] args) throws IOException {//创建文件输入流 并指定 要处理的文件路径FileInputStream fis = new FileInputStream("./fos.dat");/*** int read() 调用则读取一个字节 返回的则是文件对应的二进制数据** fos.dat 文件内容:* 00000001 00000010 文件末尾* ^^^^^^* */// d :00000000 00000000 00000000 00000001int d = fis.read();System.out.println(d);// d:00000000 00000000 00000000 00000010d = fis.read();System.out.println(d);// d:11111111 11111111 11111111 11111111d = fis.read(); //文件末尾 -1System.out.println(d);fis.close();//需要释放}
}
复制文件
复制文件代码案例
package Part02IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*** 文件的拷贝使用演示类:*/
public class CopyDemo {public static void main(String[] args) throws IOException {//1.输入流FileInputStream fis = new FileInputStream("./paimeng.jpg");//获取源图片//2.输出流FileOutputStream fos = new FileOutputStream("./paimeng_Copy.jpg");//目标图片位置/*** 假设 :paimeng.jpg 文件内容* 11110000 11110000 00100100 ......*///如果读到的数据 为 -1 读到文件末尾//不明确循环次数, 已知循环条件int d; //alt + enter + enterwhile ((d = fis.read()) != -1) { //如果读到的内容不为 -1的话//获取当前读到的字节内容/*** paimeng_Copy.jpg 文件内容:* 11110000 11110000 00100100 ....*/fos.write(d);//写入到 目标文件中}System.out.println("拷贝完毕!");fis.close(); //释放fos.close();//释放}
}
快读写优化代码案例
package Part02IO;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** 通过块读写的方式 提高文件 拷贝的速度:*/
public class CopyDemo2 {public static void main(String[] args) throws IOException {//1.输入流FileInputStream fis = new FileInputStream("./1.pptx");//获取源图片//2.输出流FileOutputStream fos = new FileOutputStream("./1_copy.pptx");//目标图片位置int d;byte[] data = new byte[1024*10]; //10kblong start = System.currentTimeMillis();//获取当前系统时间 毫秒单位while ((d = fis.read(data)) != -1) { //块读fos.write(data);//块写入}long end = System.currentTimeMillis();System.out.println("拷贝完毕!拷贝时长:"+ (end - start)+"ms");fis.close();//释放fos.close();//释放}
}
写入字符串
package Part02IO;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** @author 老安* @data 2022/4/25 20:34* 向文件中写出字符串*/
public class WriteStringDemo {public static void main(String[] args) throws IOException {//向一个文件名为demo1.txt写入文本数据//crtl+alt+v 快速生成变量名FileOutputStream fos = new FileOutputStream("demo1.txt");String line = "beep,beep,i'm sheep~beep,beep,i'm sheep~";/** String提供了将字符串转换为一组字节的方法* 使用的字符集通常都是UTF-8* java.nio.charset.StandardCharsets下的UTF-8* */byte[] data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);fos.write("哔,哔,安慕希~哔,哔,安慕希~".getBytes(StandardCharsets.UTF_8));System.out.println("写出完毕!!!");fos.close();}
}
简易笔记本
package Part02IO;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;/*** @author 老安* @data 2022/4/25 21:28* 实现简易的记事本工具* 程序启动后,要求在控制台输入的每一行的字符串,都会写入到note.txt,* 当我们在控制台输入exit时,程序退出*/
public class TestNotes {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);System.out.println("请开始输入内容,单独输入exit退出~~");//绑定要写出的文件是note.txtFileOutputStream fos = new FileOutputStream("note.txt");while (true){//一直循环接收用户输入的内容//接收用户每次在控制台输入的字符串String line = scanner.nextLine();//如果输入的内容line是exit,退出程序(退出循环)//不建议这种写法,因为line作为对象,可能会是null,就会引发空指针//if (line.equals("exit")){}//equalsIgnoreCase() 忽略大小写比较字符串if ("exit".equals(line)){break;//跳出当前循环}//将输入的内容写出到note.txt文件中fos.write(line.getBytes(StandardCharsets.UTF_8));}
// String line;
// while (!"exit".equals(line =scanner.nextLine())){// fos.write(line.getBytes(StandardCharsets.UTF_8));
// }fos.close();}
}
文件追加模式案例
package Part02IO;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;/*** @author 老安* @data 2022/4/27 19:46* 文件输出对象追加模式*/
public class TestNotes2 {public static void main(String[] args) throws Exception {/** 文件流中有两种创建方式:覆盖模式和追加模式* 构造器:* new FileOutputStream(String path)* new FileOutputStream(File file)* 以上两种都是覆盖模式的构造器,这种情况创建文件输出流时,如果连接的文件已经存在,* 则会把文件之前的内容清空* 构造器:* new FileOutputStream(String path,boolean append)* new FileOutputStream(File file,boolean append)* 如果第二个参数传入true,则文件流为追加模式,如果连接的文件已经存在,* 则会把文件之前的内容保存* */FileOutputStream fos = new FileOutputStream("fos.txt", true);String line = "你叉叉,穷哈哈~哈利波特骑着扫帚飞~~~sorry,sorry";fos.write(line.getBytes(StandardCharsets.UTF_8));System.out.println("写出完毕");fos.close();}
}
处理流
缓冲流
- BufferedOutputStream缓冲输出流
- BufferedInputStream 缓冲输入流
复制文件代码案例
package Part02IO;import java.io.*;/*** @author 老安* @data 2022/4/27 20:21* 使用缓冲流实现复制文件案例*/
public class CopyDemo3 {public static void main(String[] args) throws Exception {//创建一个文件字节输入流(低级流)FileInputStream fis = new FileInputStream("1.pptx");//创建一个缓冲字节输入流(高级流) 加快读取效率BufferedInputStream bis = new BufferedInputStream(fis);//创建一个文件字节输出流(低级流)FileOutputStream fos = new FileOutputStream("1_copy2.pptx");//创建一个缓冲字节输出流(高级流) 加快写出效率BufferedOutputStream bos = new BufferedOutputStream(fos);int d;long start = System.currentTimeMillis();//此处需要使用高级流对象bis获取内容while ((d = bis.read())!=-1){//此处需要使用高级流对象bos写入内容bos.write(d);}long end = System.currentTimeMillis();System.out.println("耗时:"+(end-start)+"ms");//释放流资源 关闭流的顺序随意,而且只需要关闭高级流即可,会自动关闭连接的流bis.close();bos.close();}
}
flush代码案例
package Part02IO;import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** @author 老安* @data 2022/4/27 20:44* 缓冲流写出数据的缓冲区问题*/
public class BOSFlushDemo {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("bos.txt");//缓冲流内部维护了一个8K的字节数组,写出的数据都会先存入到这个数组中,//只有数组存满时,才会写出BufferedOutputStream bos = new BufferedOutputStream(fos);bos.write("听我说谢谢你~因为有你,温暖了四季~~~".getBytes(StandardCharsets.UTF_8));System.out.println("写出完毕!");//flush 冲水 方法的作用是让缓冲输出流将其中的缓冲区中已经缓存的数据立即写出bos.flush();//bos.close();}
}
对象流
Person代码
package Part02IO;import java.io.Serializable;
import java.util.Arrays;/*** @author 老安* @data 2022/4/27 21:00* 如果Person需要被序列化,就必须要实现Serializable*/
public class Person implements Serializable {/** 当一个类实现了可序列化接口时,最好显示的定义下面的属性:serialVersionUID* 即:序列化版本号* 当对象输出流在进行对象序列化时,会查看是否有显示的序列化版本,如果没有,* 则会自动根据类中内容生成一个唯一的版本号(如果这个类的结构发生变化,就会重新* 生成一个新的版本号),所以如果反序列化时,会查看版本号,如果版本号一致,就可以反序列化,* 如果类的内容发生变化,版本号发生变化,则反序列化会判断不一致,导致反序列化失败* 为了防止这种问题的发生,我们会开启兼容模式,就是固定死版本号* */static final long serialVersionUID = 1L;private String name;//姓名private int age;//年龄private String gender;//性别/** transient 短暂的* 当一个属性被transient修饰,这个对象被序列化时,会自动被忽略* 反序列化时,这个属性的值使用默认值* */private transient String[] othreInfo;//其他信息private int salary;//工资//生成构造方法/* 快捷方式:alt+insert,右键,选择Generate...,选择Constructor*/public Person(String name, int age, String gender, String[] othreInfo) {this.name = name;this.age = age;this.gender = gender;this.othreInfo = othreInfo;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String[] getOthreInfo() {return othreInfo;}public void setOthreInfo(String[] othreInfo) {this.othreInfo = othreInfo;}//生成toString方法@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +", othreInfo=" + Arrays.toString(othreInfo) +", salary=" + salary +'}';}
}
OOSDemo案例
package Part02IO;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;/*** @author 老安* @data 2022/4/27 21:11* 对象流* java.io.ObjectOutputStream和ObjectInputStream* 对象流是一对高级流,在流链接中完成对对象与字节转换* 即:对象序列化与反序列化* 对象 --> 文件 序列化* 文件 --> 对象 反序列化*/
public class OOSDemo {public static void main(String[] args) throws IOException {String name = "巨松";int age = 18;String gender = "男";String[] otherInfo = {"是一个帅哥","来自于太原","爱好不明","广大男性之友"};Person p = new Person(name, age, gender, otherInfo);System.out.println(p);//p.toString()FileOutputStream fos = new FileOutputStream("person.obj");//创建一个对象输出流,也是序列化流,是一个高级流ObjectOutputStream oos = new ObjectOutputStream(fos);/** 对象输出流提供的独有的方法 writeObject(Object obj)* 会进行对象的序列化,并将对象序列化后的字节通过其连接的流写出* */oos.writeObject(p);System.out.println("写出完毕!!!");oos.close();}
}
OISDemo案例
package Part02IO;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;/*** @author 老安* @data 2022/4/27 21:45* 使用对象输入流进行对象的反序列化*/
public class OISDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {FileInputStream fis = new FileInputStream("person.obj");ObjectInputStream ois = new ObjectInputStream(fis);/** 对象输入流中提供了将对象反序列化的方法Object readObject* */Person p = (Person)ois.readObject();System.out.println(p);ois.close();}
}
字节流和字符流
在Java中,根据处理的数据单位不同,分为字节流和字符流。
字节流: 一个字节(byte)一个字节的去读取, 或者写出
字符流: 一个字符一个字符的去读取, 或者写出
字节流
字节流(stream):针对二进制文件(文本,图片,音频,视频…等)
InputStream(包含input都是输入流)
– FileInputStream
– BufferedInputStream
– ObjectInputStream
OutputStream(包含output都是输出流)
– FileOutputStream
– BufferedOutputStream
– ObjectOutputStream
字符流
字符流(Reader,Writer):针对文本文件,读写容易发生乱码现象,在读写时最好指定编码集为utf-8
Reader(Reader结尾的都是字符输入流)
– FileReader
– BufferedReader
– InputStreamReader
Writer(Writer结尾的都是字符输出流)
– FileWriter
– BufferedWriter
– OutputStreamWriter
– PrintWriter/PrintStream
转换字符流
OutputStreamWriter
代码案例
package Part02IO;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;/*** java IO 将流按照读写的单位划分为字节流和字符流* java.io.InputStream和OutputStream是所有字节输入和输出的超类,最小单位是字节* 而java.io.Reader和Writer是所有字符输入和输出的超类,最小单位是字符* 因此注意:只适合读取文本数据* 字符流的本质还是读写字节只是自动完成了字符和字节的转换* 转换流是一对常用的字符流实现类:* java.io.InputStreamReader和OutputStreamWriter* 这对流是一对高级流,作用两个:* 1.在流链接时,衔接其他高级字符流和下面的字节流* 2.负责将字符与对应的字节按照指定的字符集自动转换方便读写操作*/
public class OSWDemo {public static void main(String[] args) throws IOException {//向文件osw.txt中写入文本数据//文件字节输出流(低级流)FileOutputStream fos = new FileOutputStream("osw.txt");
// String line = "我欲成仙,法力无边!";
// byte[] data = line.getBytes(StandardCharsets.UTF_8);
// fos.write(data);//字节字符转换流(高级流)//在创建转换流时,通常需要指定第二个参数,明确使用的字符集OutputStreamWriter osw = new OutputStreamWriter(fos,StandardCharsets.UTF_8);osw.write("我欲成仙,法力无边!");osw.write("欲练此功,必先自宫!");System.out.println("写出完毕!");osw.close();}
}
InputStreamReader
代码案例
package Part02IO;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;/*** 测试转换流读取文本数据*/
public class ISRDemo {public static void main(String[] args) throws IOException {//将osw.txt中的所有内容读取出来,并输出到控制台//文件字节输入流(低级流)FileInputStream fis = new FileInputStream("osw.txt");//字符转换流(高级流)//InputStreamReaderInputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);//读取一个字符,返回的int值是一个char//但是若返回的是-1,表示读取到了末尾
// int d = isr.read();
// System.out.println((char)d);int d;while ((d=isr.read())!=-1){//println 自带换行 print不带换行System.out.print((char)d);}isr.close();}
}
缓冲字符流
PrintWriter
代码案例
package Part02IO;import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;/*** 缓冲字符流* java.io.BufferedWriter和BufferedReader* 缓冲字符流内部维护了一个数组,可以快读写文本数据来进行读写性能的提升* java.io.PrintWriter 具有自动行刷新功能的缓冲字符流输出流,* 内部总是链接BufferedWriter*/
public class PWDemo {public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {PrintWriter pw = new PrintWriter("./pw.txt","UTF-8");pw.println("上课重点是听,不要写注释!");pw.println("如果你是快男,那当我没说!");System.out.println("写出完毕");pw.close();}
}
代码案例2
package Part02IO;import java.io.*;
import java.util.Scanner;/*** 在流链接中使用PW*/
public class PWDemo2 {public static void main(String[] args) throws FileNotFoundException {//文件字节输出流(低级流),向文件中写入字节数据FileOutputStream fos = new FileOutputStream("pw2.txt",true);//转换输出流(高级流,且是一个字符流),1.衔接字符与字节流 2.将写出的字符转换成字节OutputStreamWriter osw = new OutputStreamWriter(fos);//缓冲字符输出流(高级流),快读写加快效率BufferedWriter bw = new BufferedWriter(osw);/** PrintWriter 构造器中,当第一个参数是一个流时,就支持再传入一个boolean参数,* 表示是否自动行刷新,当值为true时,就开始自动行刷新功能,也就是* 每当我们调用println会自动调用flush方法* */PrintWriter pw = new PrintWriter(bw,true);//完成简易的记事本,控制台输入的每行字符串都按行写入文件,输入exit时,退出Scanner scanner = new Scanner(System.in);while (true){String line = scanner.nextLine();//当输入的内容是exit时,不论大小写,就跳出循环if ("exit".equalsIgnoreCase(line)){break;}pw.println(line);}pw.close();}
}
JavaSE02-IO相关推荐
- Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程
Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...
- CentOS 安装docker.ce报错提示containerd.io >= 1.2.2-3问题
centos安装docker.ce遇到报错,提示如下 # yum install -y docker-ce Last metadata expiration check: 0:01:49 ago on ...
- 协程和任务 异步IO 重点
20210815 https://mp.weixin.qq.com/s/XeHaWhKztnCOIXb_2GSitQ https://mp.weixin.qq.com/s/lnox3pbpzJ2kWl ...
- 2021年大数据Flink(四十六):扩展阅读 异步IO
目录 扩展阅读 异步IO 介绍 异步IO操作的需求 使用Aysnc I/O的前提条件 Async I/O API 案例演示 扩展阅读 原理深入 AsyncDataStream 消息的顺序性 扩展阅读 ...
- Java IO 流 学习 总结
I/O 主要是对文件进行处理, 其主要包含3个方面的内容 1 input 输入 2 out 出入 3 File 文件 Java 流的概念 流是一组有序的数据序列,流提供了一条通道程序,可以是这条通道 ...
- 漫谈五种IO模型(主讲IO多路复用)
首先引用levin的回答让我们理清楚五种IO模型 1.阻塞I/O模型 老李去火车站买票,排队三天买到一张退票. 耗费:在车站吃喝拉撒睡 3天,其他事一件没干. 2.非阻塞I/O模型 老李去火车站买票, ...
- [19/03/30-星期六] IO技术_四大抽象类_ 字节流( 字节输入流 InputStream 、字符输出流 OutputStream )_(含字节文件缓冲流)...
一.概念及分类 InputStream(输入流)/OutputStream(输出流)是所有字节输入输出流的父类 [注]输入流和输出流的是按程序运行所在的内存的角度划分的 字节流操作的数据单元是8的字节 ...
- Python:通过一个小案例深入理解IO多路复用
通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import timestart = time.time()u ...
- Java基础(二十七)Java IO(4)字符流(Character Stream)
字符流用于处理字符数据的读取和写入,它以字符为单位. 一.Reader类与Writer类 1.Reader类是所有字符输入流的父类,它定义了操作字符输入流的各种方法. 2.Writer类是所有字符输出 ...
- Linux IO实时监控iostat命令详解
简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间 ...
最新文章
- 用C#来开发CAD插件,含源代
- 字节跳动年度《算法资料合集》首次公开,限时下载!
- 你负责人工智能哪部分?人工那部分:知识图谱的构建主要靠人工还是机器?...
- JavaScript之 Array(数组) 对象
- 在C#中使用代理的方式触发事件 的简单习作
- 【WebRTC---入门篇】(十四)WebRTC音视频录制
- URAL 1404. Easy to Hack! (模拟)
- Spring高级之注解@Import注解、ImportSelector、ImportBeanDefinitionRegistrar详解(超详细)
- redis rua解决库存问题_库存秒杀问题-redis解决方案- 接口限流
- The netfilter.org project
- 如何获取高质量 CV 训练数据?这个超详细上手教程不容错过
- c语言实现全排列并存储,C语言实现全排列和回溯法总结
- micropython和python区别-MicroPython与Python速度对比
- Windows workflow foundation之旅(三)——指南2(创建状态机工作流)(上)
- 稳住 稳住 。不要急!
- 方舟服务器修改错误,求解,方舟正在进服务器出现错误
- 【Unite Tokyo 2018】虚拟YouTuber电脑少女Siro「2018年资源推荐
- 2022最新oneNav导航系统源码全开源版本下载总裁导航
- p标签换行导致的问题
- 针对Mrpt/build中的make时u出现的问题ccache: error: Failed to create temporary file for /home/jyy/.ccache/tmp/tm