java学习笔记13——IO流
File 类的使用
常用构造器
路径分隔符
常用方法


1.File类的理解 > File类位于java.io包下,本章中涉及到的相关流也都声明在java.io包下 > File类的一个对象,对应与操作系统下的一个文件或一个文件目录(或文件夹) > File类中声明了新建、删除、获取名称、重命名等方法,并没有涉到文件内容的读写操作。要想实现文件内容的读写,我们就需要使用io流。 > File类的对象,通常是作为io流操作的文件的端点出现的。> 代码层面,将File类的对象作为参数传递到IO相关类的构造器中。2.内部api使用说明 2.1 构造器 public File(String pathname) 以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果 pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。 绝对路径:是一个固定的路径,从盘符开始 相对路径:是相对于某个位置开始 public File(String parent,String child) 以parent为父路径,child为子路径创建File对象。 public File(File parent,String child) 根据一个父File对象和子文件路径创建File对象 2.2 方法 获取文件和目录基本信息* public String getName():获取名称*public String getPath():获取路径*public String getAbsolutePath():获取绝对路径*public File getAbsoluteFile():获取绝对路径表示的文件*public String getParent():获取上层文件目录路径。若无,返回null*public long length():获取文件长度(即:字节数)。不能获取目录的长度。*public long lastModified():获取最后一次的修改时间,毫秒值 3.概念: 绝对路径:以windows操作系统为例,包括盘符在内的文件或文件目录的完整路径相对路径:相对于某一个文件目录来讲的相对的位置在IDEA中,如果使用单元测试方法:相对于当前的module来讲如果使用main()方法,相对于当前的project来讲
代码:
public class FileTest {/*** public File(String pathname)* 以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果* pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。* 绝对路径:是一个固定的路径,从盘符开始* 相对路径:是相对于某个位置开始* public File(String parent,String child)* 以parent为父路径,child为子路径创建File对象。* public File(File parent,String child)* 根据一个父File对象和子文件路径创建File对象** 文件的路径表示方式:* 方式1:绝对路径:以windows操作系统为例,包括盘符在内的文件或文件目录的完整路径* 方式2:相对路径:相对于某一个文件目录来讲的相对的位置* 在IDEA中,如果使用单元测试方法:相对于当前的module来讲* 如果使用main()方法,相对于当前的project来讲*/@Testpublic void test1(){//public File(String pathname)File file1 = new File("d:/io\\hello.txt");File file2 = new File("ab");System.out.println(file2.getAbsoluteFile());}public static void main(String[] args) {File file2 = new File("abc");System.out.println(file2.getAbsoluteFile());}@Testpublic void test2(){//public File(String parent,String child)//参数1:一定是一个文件目录//参数2:可以是一个文件,也可以是一个文件目录File file1 = new File("d:\\io","abc.txt");File file2 = new File("abc","a12");
// public File(File parent,String child)//参数1:一定是一个文件目录//参数2:可以是一个文件,也可以是一个文件目录File file3 = new File(file2,"ab.txt");}
}
文件目录:
public class FileTest1 {/*** public String getAbsolutePath():获取绝对路径* public String getPath() :获取路径* public String getName() :获取名称* public String getParent():获取上层文件目录路径。若无,返回null* public long length() :获取文件长度(即:字节数)。不能获取目录的长度。* public long lastModified() :获取最后一次的修改时间,毫秒值*/@Testpublic void test1(){File file1 = new File("hello.txt");System.out.println(file1.getName());System.out.println(file1.getPath());System.out.println(file1.getAbsolutePath());System.out.println(file1.getAbsoluteFile());System.out.println(file1.getParent());System.out.println(file1.getAbsoluteFile().getParent());System.out.println(file1.length());System.out.println(file1.lastModified());}@Testpublic void test2(){File file1 = new File("D:\\io\\io1");System.out.println(file1.getName());System.out.println(file1.getPath());System.out.println(file1.getAbsolutePath());System.out.println(file1.getAbsoluteFile());System.out.println(file1.getParent()); //nullSystem.out.println(file1.getAbsoluteFile().getParent());System.out.println(file1.length());System.out.println(file1.lastModified());}/*** 列出目录的下一级* public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组* public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组*/@Testpublic void test3(){File file1 = new File("D:\\Download\\java资源\\尚硅谷java\\尚硅谷宋红康Java核心基础\\课件笔记源码资料\\新建文件夹\\1_课件\\第2部分:Java高级编程\\第2部分:Java高级编程\\尚硅谷_宋红康_第13章_IO流");String[] fileArr = file1.list();for(String s : fileArr){System.out.println(s);}System.out.println();File[] files = file1.listFiles();for(File f : files){System.out.println(f.getName());}}/*** File类的重命名功能* public boolean renameTo(File dest):把文件重命名为指定的文件路径** 举例:* file1.renameTo(file2):要想此方法执行完,返回true。要求:* file1必须存在,且file2必须不存在,且file2所在的文件目录需要存在。*/@Testpublic void test4(){File file1 = new File("hello.txt");File file2 = new File("d:\\io\\abc.txt");boolean renameSuccess = file1.renameTo(file2);System.out.println(renameSuccess ? "重命名成功" : "重命名失败");}/*** File类的判断功能* public boolean isDirectory():判断是否是文件目录* public boolean isFile() :判断是否是文件* public boolean exists() :判断是否存在* public boolean canRead() :判断是否可读* public boolean canWrite() :判断是否可写* public boolean isHidden() :判断是否隐藏*/@Testpublic void test5(){File file1 = new File("d:\\io\\abc.txt");System.out.println(file1.exists()); //trueSystem.out.println(file1.isDirectory()); //falseSystem.out.println(file1.isFile()); //trueSystem.out.println(file1.canRead()); //trueSystem.out.println(file1.canWrite());//trueSystem.out.println(file1.isHidden());//falseSystem.out.println();File file2 = new File("d:\\io");System.out.println(file2.exists()); //trueSystem.out.println(file2.isDirectory()); //trueSystem.out.println(file2.isFile()); //falseSystem.out.println(file2.canRead()); //trueSystem.out.println(file2.canWrite());//trueSystem.out.println(file2.isHidden());//falseSystem.out.println();}/***File类的创建功能* public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false* public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。* 如果此文件目录的上层目录不存在,也不创建。* public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建* 注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目* 路径下。* File类的删除功能* public boolean delete():删除文件或者文件夹* 删除注意事项:* Java中的删除不走回收站。* 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录*/@Testpublic void test6() throws IOException {File file1 = new File("d:\\io\\hello.txt");//测试文件的创、删除if(!file1.exists()){boolean isSuccessed = file1.createNewFile();if(isSuccessed){System.out.println("创建成功");}}else {System.out.println("此文件已存在");System.out.println(file1.delete() ? "文件删除成功" : " 文件删除失败");}}@Testpublic void test7(){//前提:d:\\io文件目录存在,io2和io3目录是不存在的,可以创建,返回值为trueFile file1 = new File("d:\\io\\io2");System.out.println(file1.mkdir()); //trueFile file2 = new File("d:\\io\\io3");System.out.println(file2.mkdirs()); //true}@Testpublic void test8(){//前提:d:\\io文件目录存在,io2和io3目录是不存在的,可以创建,返回值为trueFile file1 = new File("d:\\io\\io2\\io4");System.out.println(file1.mkdir()); //falseFile file2 = new File("d:\\io\\io3\\io5");System.out.println(file2.mkdirs()); //true}@Testpublic void test9(){
// File file1 = new File("d:\\io\\io3\\io5");
// System.out.println(file1.delete()); //trueFile file1 = new File("d:\\io\\io3");System.out.println(file1.delete()); //false}
}
练习1:
练习: 创建一个与hello.txt文件在相同文件目录下的另一个名为abc.txt文件
代码:
public class Exer01 {public static void main(String[] args) {//创建一个与hello.txt文件在相同文件目录下的另一个名为abc.txt文件File file1 = new File("hello.txt");//获取file1的绝对路径,获取此路径的上层文件目录System.out.println(file1.getAbsolutePath());
// System.out.println(file1.getAbsoluteFile().getParent());File file2 = new File(file1.getAbsoluteFile().getParent(), "abc.txt");System.out.println(file2.getAbsolutePath());}
}
练习2:
练习: 判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称 提示:File类提供了文件过滤器方法(拓展) public String[] list(FilenameFilter filter)
代码:
public class Exer02 {/*** 判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称*/@Testpublic void test1(){File dir = new File("C:\\Users\\nihao\\Pictures\\Screenshots");//方式1:
// String[] listFiles = dir.list();
// for(String s : listFiles){
// if(s.endsWith(".jpg")){
// System.out.println(s);
// }
// }//方式2:
// public String[] list(FilenameFilter filter)String[] listFiles = dir.list(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) { //name:即为子文件或子文件目录的名称
// if(name.endsWith(".jpg")){
// return true;
// }else {
// return false;
// }return name.endsWith(".jpg");}});for(String fileName : listFiles){System.out.println(fileName);}}
}
练习3:
练习: 遍历指定文件目录下的所有文件的名称,包括子文件目录中的文件。 public void printFileName(File file) //file可能是文件,也可能是文件目录 拓展1:删除指定文件目录及其下的所有文件 public void deleteDirectory(File file) //file可能是文件,也可能是文件目录 拓展2:计算指定文件目录占用空间的大小 public long getDirectorySize(File file) //file可能是文件,也可能是文件目录
代码:
Exer03
public class Exer03 {//public void printFileName(File file)@Testpublic void test1(){File file = new File("D:\\Download\\java资源\\尚硅谷java\\尚硅谷宋红康Java核心基础\\课件笔记源码资料\\新建文件夹\\1_课件\\第2部分:Java高级编程\\第2部分:Java高级编程\\尚硅谷_宋红康_第13章_IO流");printFileName(file);}public void printFileName(File file){if(file.isFile()){System.out.println(file.getName());}else if(file.isDirectory()){File[] files = file.listFiles();for(File f : files){printFileName(f);}}}
}MoreExer
public class MoreExer {/*** 拓展1:计算指定文件目录占用空间的大小*/public long getDirectorySize(File file){//file是文件,那么直接返回file.length()//file是目录,把他的下一级的所有大小加起来就是他的总大小long size = 0;if(file.isFile()){size = file.length();}else {File[] all = file.listFiles(); //获取file的下一级//累加all[i]的大小for(File f : all){size += getDirectorySize(f); //f的大小}}return size;}/*** 拓展2:删除指定文件目录及其下的所有文件*/public void deleteDirectory(File file){//如果file是文件,直接delete//如果file是目录。先把它的下一级干掉,然后删除自己if(file.isDirectory()){File[] all = file.listFiles();//循环删除的是file的下一级for(File f : all) { //f代表file的每一个下级deleteDirectory(f);}}//删除自己file.delete();}
}
IO流原理及流的分类
1.IO的分类 流向的不同:输入流、输出流 处理单位的不同:字节流、字符流 流的角色的不同:节点流、处理流 2.基础IO流的框架: 抽象基类 4个节点流(也称为文件流) InputStream FileInputStream OutputStream FileOutputStream Reader FileReader Writer FileWriter说明:本章虽然涉及到的流很多,但是使用流进行数据的读写操作是非常标准和规范的。3.FileReader\FileWriter 的使用 3.1 执行步骤: 第1步:创建读取或写出的File类的对象 第2步:创建输入流或输出流 第3步:具体的读入或写出的过程读入:read(char[] cbuffer)写出:write(string str)/write(char[] cbuffer,0,len) 第4步:关闭流资源,避免内存泄漏 3.2 注意点: ① 因为涉及到流资源的关闭操作,所以出现异常的话,需要使用try-catch-finally的方式来处理异常 ② 对于输入流来讲,要求File类的对象对应的物理磁盘上的文件必须存在。否则,会报FileNotFoundException对于输出流来讲,File类的对象对应的物理磁盘上的文件可以不存在。> 如果此文件不存在,则在输出的过程中,会自动创建此文件,并写出数据到此文件中。> 如果此文件存在,使用 FileWriter(File file)或 FileWriter(File file,false):输出数据过程中,会新建同名的文件对现有的文件进行覆盖。FileWriter(File file,true):输出数据过程中,会在现有的文件的末尾追加写出内容 4.FileInputStream\FileOutputStream 的使用 4.1 执行步骤: 第1步:创建读取或写出的File类的对象 第2步:创建输入流或输出流 第3步:具体的读入或写出的过程读入:read(char[] cbuffer)写出:write(string str)/write(char[] cbuffer,0,len) 第4步:关闭流资源,避免内存泄漏4.2 注意点: > 在3.2 注意点的基础之上,看其他的注意点。 > 对于字符流,只能用来操作文本文件,不能用来处理非文本文件的。对于字节流,通常是用来处理非文本文件的。但是,如果涉及到文本文件的复制操作,也可以使用字节流。说明: 文本文件:.txt、.java、.c、.cpp、.py等 非文本文件:.doc、.xls、.jpg、.pdf、.mp3、.mp4、.avi 等
代码:
public class FileReaderWriterTest {/*** 需求:读取hello.txt中的内容,显示在控制台上* 异常使用throws的方式处理,不太合适,见test2*/@Testpublic void test1() throws IOException {//1.创建File类的对象,对应着hello.txtFile file = new File("hello.txt");//2.常见输入型的字符流,用于读取数据FileReader fr = new FileReader(file);//3.读取数据,并显示在控制台上
// System.out.println((char)fr.read());
// System.out.println((char)fr.read());
// System.out.println((char)fr.read());
// System.out.println((char)fr.read());//方式1:
// int data = fr.read();
// while(data != -1){
// System.out.println((char)data);
// data = fr.read();
// }//方式2:int data;while((data = fr.read()) != -1){System.out.println((char)data);}//4.流资源的关闭操作(必须要关闭,否则会内存泄漏)fr.close();}/*** 需求:读取hello.txt中的内容,显示在控制台上* 使用try-catch-finally的方式处理异常,确保流一定可以关闭,避免内存泄漏*/@Testpublic void test2() {FileReader fr = null;try {//1.创建File类的对象,对应着hello.txtFile file = new File("hello.txt");//2.常见输入型的字符流,用于读取数据fr = new FileReader(file);//3.读取数据,并显示在控制台上//方式2:int data;while((data = fr.read()) != -1){System.out.print((char)data);}} catch (IOException e) {e.printStackTrace();}finally {//4.流资源的关闭操作(必须要关闭,否则会内存泄漏)try {//增加健壮性,避免出现文件找不到的异常,从未fr未被创建,是一个nullif(fr != null)fr.close();} catch (IOException e) {e.printStackTrace();}}}/*** 需求:读取hello.txt中的内容,显示在控制台上* 对test2()进行优化,每次读取多个字符存放到数组中,减少了与磁盘交互的次数,提升效率。*/@Testpublic void test3() {FileReader fr = null;try {//1.创建File类的对象,对应着hello.txtFile file = new File("hello.txt");//2.常见输入型的字符流,用于读取数据fr = new FileReader(file);//3.读取数据,并显示在控制台上char[] cbuffer = new char[5];int len;while((len = fr.read(cbuffer)) != -1){//遍历数组:错误的写法
// for(int i = 0; i < cbuffer.length;i++){
// System.out.print(cbuffer[i]);
// }//遍历数组:for(int i = 0; i < len;i++){System.out.print(cbuffer[i]);}}} catch (IOException e) {e.printStackTrace();}finally {//4.流资源的关闭操作(必须要关闭,否则会内存泄漏)try {//增加健壮性,避免出现文件找不到的异常,从未fr未被创建,是一个nullif(fr != null)fr.close();} catch (IOException e) {e.printStackTrace();}}}/*** 需求:将内存中的数据写出到指定文件中*/@Testpublic void test4() {FileWriter fw = null;try {//1.创建File类的对象,指明要写出的文件的名称File file = new File("info.txt");//2.创建输出流//覆盖文件使用的构造器fw = new FileWriter(file);
// fw = new FileWriter(file,false);//在现有的文件基础上,追加内容使用的构造器
// fw = new FileWriter(file,true);//3.写出具体的过程//输出的方法:write(String str)/write(char[] cdata)fw.write("I love U!\n");fw.write("You love him!\n");fw.write("太惨了...");System.out.println("输出成功");} catch (IOException e) {e.printStackTrace();} finally {// 4.关闭资源try {if(fw != null)fw.close();} catch (IOException e) {e.printStackTrace();}}}/*** 需求:复制一份hello.txt文件,命名为hello_copy.txt*/@Testpublic void test5() {FileReader fr = null;FileWriter fw = null;try {//1.创建File类的对象File srcFile = new File("hello.txt");File destFile = new File("hello_copy.txt");//2.创建输入流、输出流fr = new FileReader(srcFile);fw = new FileWriter(destFile);//3.数据的读入和写出的过程char[] cbuffer = new char[5];int len; //记录每次读入到cbuffer中的字符的个数while((len = fr.read(cbuffer)) != -1){//write(char[] cbuffer,int fromIndex,int len)
// fw.write(cbuffer,0,len); //正确的
// fw.write(cbuffer); //错误的,会多读一些内容}System.out.println("复制成功");} catch (IOException e) {e.printStackTrace();} finally {//4.关闭流资源//方式1:
// try {
// if(fw != null)
// fw.close();
// } catch (IOException e) {
// e.printStackTrace();
// }finally{
// try {
// if(fr != null)
// fr.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }//方式2:try {if(fw != null)fw.close();} catch (IOException e) {e.printStackTrace();}try {if(fr != null)fr.close();} catch (IOException e) {e.printStackTrace();}}}/*** 需求:复制一份scenery.jpg文件,命名为scenery_copy.jpg* 复制失败!因为字符流不适合用来处理非文本文件*/@Testpublic void test6() {FileReader fr = null;FileWriter fw = null;try {//1.创建File类的对象File srcFile = new File("scenery.jpg");File destFile = new File("scenery_copy.jpg");//2.创建输入流、输出流fr = new FileReader(srcFile);fw = new FileWriter(destFile);//3.数据的读入和写出的过程char[] cbuffer = new char[5];int len; //记录每次读入到cbuffer中的字符的个数while((len = fr.read(cbuffer)) != -1){//write(char[] cbuffer,int fromIndex,int len)
// fw.write(cbuffer,0,len); //正确的
// fw.write(cbuffer); //错误的,会多读一些内容}System.out.println("复制成功");} catch (IOException e) {e.printStackTrace();} finally {//4.关闭流资源try {if(fw != null)fw.close();} catch (IOException e) {e.printStackTrace();}try {if(fr != null)fr.close();} catch (IOException e) {e.printStackTrace();}}}
}
public class FileStreamtTest {/*** 需求:复制一份scenery.jpg文件,命名为scenery_copy.jpg*/@Testpublic void test1() throws IOException {FileInputStream fis = null;FileOutputStream fos = null;try {//1.创建相关非File类的对象File srcFile = new File("scenery.jpg");File destFile = new File("scenery_copy.jpg");//2.创建相关的字节流fis = new FileInputStream(srcFile);fos = new FileOutputStream(destFile);//3.数据的读入和写出byte[] buffer = new byte[1024]; //1kbint len; //记录每次读入到buffer中字节的个数while((len = fis.read(buffer)) != -1){fos.write(buffer, 0, len);}System.out.println("复制成功");} catch (IOException e) {throw new RuntimeException(e);} finally {//4.关闭资源try {if(fis != null) fis.close();} catch (IOException e) {e.printStackTrace();}try {if (fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}}}/*** 需求:复制一份hello.txt文件,命名为hello_copy1.txt* 可以使用字节流实现文本文件的复制*/@Testpublic void test2() throws IOException {FileInputStream fis = null;FileOutputStream fos = null;try {//1.创建相关非File类的对象File srcFile = new File("hello.txt");File destFile = new File("hello_copy1.txt");//2.创建相关的字节流fis = new FileInputStream(srcFile);fos = new FileOutputStream(destFile);//3.数据的读入和写出byte[] buffer = new byte[5]; //1kbint len; //记录每次读入到buffer中字节的个数while((len = fis.read(buffer)) != -1){fos.write(buffer, 0, len);}System.out.println("复制成功");} catch (IOException e) {throw new RuntimeException(e);} finally {//4.关闭资源try {if(fis != null) fis.close();} catch (IOException e) {e.printStackTrace();}try {if (fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}}}/*** 需求:读取hello.txt文件,将数据显示在控制台上* 可能会出现乱码*/@Testpublic void test3() throws IOException {FileInputStream fis = null;try {//1.创建相关非File类的对象File srcFile = new File("hello.txt");//2.创建相关的字节流fis = new FileInputStream(srcFile);//3.数据的读入和写出byte[] buffer = new byte[5]; //1kbint len; //记录每次读入到buffer中字节的个数while((len = fis.read(buffer)) != -1){String str = new String(buffer,0,len);System.out.print(str);}System.out.println();System.out.println("复制成功");} catch (IOException e) {throw new RuntimeException(e);} finally {//4.关闭资源try {if(fis != null) fis.close();} catch (IOException e) {e.printStackTrace();}}}
}
节点流(或文件流)


处理流之一:缓冲流
总结:
1.基础IO流的框架 抽象基类 4个节点流(也称为文件流) 4个缓冲流(处理流的一种) InputStream FileInputStream BufferedInputStream OutputStream FileOutputStream BufferedOutputStream Reader FileReader BufferedReader Writer FileWriter BufferedWriter 2.缓冲流的作用: 提升文件读写的效率。 3. 4个缓冲流 使用的方法 处理非文本文件的字节流: BufferedInputStream read(byte[] buffer) BufferedOutputStream write(byte[] buffer,0,len) 、flush()处理文本文件的字符流: BufferedReader read(char[] cBuffer) / readLine() BufferedWriter write(char[] cBuffer,0,len) / write(String ) 、flush()3.实现的步骤 第1步:创建File的对象、流的对象(包括文件流、缓冲流)第2步:使用缓冲流实现 读取数据 或写出数据的过程(重点)读取:int read(char[] cbuf/byte[] buffer):每次将数据读入到cbuf/buffer数组中,并返回读入到数组中写出:void write(string str)/write(char[] cbuf):将str或cbuf写出到文件中void write(byte[] buffer)将byte[]写出到文件中第3步:关闭资源
代码:
测试BufferedReader和BufferedWriter的使用
public class BufferedReaderWriterTest {/*** 使用BufferedReader将dbcp_utf-8.txt中的内容显示在控制台上*/@Testpublic void test1() throws IOException {File file = new File("dbcp_utf-8.txt");BufferedReader br = new BufferedReader(new FileReader(file));//读取的过程//方式1:read(char[] cbuffer)char[] cBuffer = new char[1024];int len; //记录每次读入到cBuffer中的字符的个数
// while((len = br.read(cBuffer)) != -1){//方法1:
// for(int i = 0; i<len;i++){
// System.out.println(cBuffer[i]);
// }//方式2:
// String str = new String(cBuffer,0,len);
// System.out.println(str);
// }//方式2:readLine(),每次读取一行的文本数据,返回的字符串是不包含换行符的String data;while((data = br.readLine()) != null){System.out.print(data + "\n");}//br.close();}/*** 使用BufferedReader和BufferedWriter实现文本文件的复制*/@Testpublic void test2() throws IOException {//1.造文件,造流File file1 = new File("dbcp_utf-8.txt");File file2 = new File("dbcp_utf-8_copy1.txt");BufferedReader br = new BufferedReader(new FileReader(file1));BufferedWriter bw = new BufferedWriter(new FileWriter(file2));//2.文件的读写操作String data;while((data = br.readLine()) != null){bw.write(data);bw.newLine(); //表示换行操作bw.flush();//刷新的方法,每当调用此方法时,就会主动的将内存中的数据写入到磁盘文件}System.out.println("复制成功");//3.关闭资源bw.close();br.close();}
}
public class BufferedStreamTest {/*** 需求:使用BufferedInputStream \ BufferedOutputStream复制一个图片* 注意:如下的操作应该使用try-catch-finally处理异常*/@Testpublic void test1() throws IOException {//1.创建相关非File类的对象File srcFile = new File("scenery.jpg");File destFile = new File("scenery_copy.jpg");//2.创建相关的字节流,缓冲流FileInputStream fis = new FileInputStream(srcFile);FileOutputStream fos = new FileOutputStream(destFile);BufferedInputStream bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(fos);//3.数据的读入和写出byte[] buffer = new byte[1024]; //1kbint len; //记录每次读入到buffer中字节的个数while ((len = fis.read(buffer)) != -1) {fos.write(buffer, 0, len);}System.out.println("复制成功");//4.关闭资源//外层的流的关闭//由于外层流的关闭也会自动的对内层的流进行关闭操作,所以可以省略内层流的关闭bos.close();bis.close();//内层流的关闭
// fis.close();
// fos.close();}
}
测试 FileInputStream +File0utputstream 复制文件BufferedInputstream +Buffered0utputstream 复制文件测试二者的效率。
public class CopyFileTest {@Testpublic void testSpendTime(){long start = System.currentTimeMillis();String src = "C:\\Users\\nihao\\Desktop\\1.mp4";String dest = "C:\\Users\\nihao\\Desktop\\3.mp4";
// copyFileWithFileStream(src, dest); //128copyFileWithBufferedStream(src, dest);long end = System.currentTimeMillis();System.out.println("花费的时间为:" + (end-start));}/*** 使用BufferedInputstream +Buffered0utputstream复制文件*/public void copyFileWithBufferedStream(String src,String dest){BufferedInputStream bis = null;BufferedOutputStream bos = null;try {//1.创建相关非File类的对象File srcFile = new File(src);File destFile = new File(dest);//2.创建相关的字节流,缓冲流FileInputStream fis = new FileInputStream(srcFile);FileOutputStream fos = new FileOutputStream(destFile);bis = new BufferedInputStream(fis);bos = new BufferedOutputStream(fos);//3.数据的读入和写出byte[] buffer = new byte[50]; //1kbint len; //记录每次读入到buffer中字节的个数while ((len = fis.read(buffer)) != -1) {fos.write(buffer, 0, len);}System.out.println("复制成功");} catch (IOException e) {throw new RuntimeException(e);} finally {//4.关闭资源//外层的流的关闭//由于外层流的关闭也会自动的对内层的流进行关闭操作,所以可以省略内层流的关闭try {if (bos != null)bos.close();} catch (IOException e) {e.printStackTrace();}try {if (bis != null)bis.close();} catch (IOException e) {e.printStackTrace();}}}/*** 使用FileInputStream +File0utputstream 复制文件*/public void copyFileWithFileStream(String src,String dest){FileInputStream fis = null;FileOutputStream fos = null;try {//1.创建相关非File类的对象File srcFile = new File(src);File destFile = new File(dest);//2.创建相关的字节流fis = new FileInputStream(srcFile);fos = new FileOutputStream(destFile);//3.数据的读入和写出byte[] buffer = new byte[50]; //1kbint len; //记录每次读入到buffer中字节的个数while((len = fis.read(buffer)) != -1){fos.write(buffer, 0, len);}System.out.println("复制成功");} catch (IOException e) {throw new RuntimeException(e);} finally {//4.关闭资源try {if(fis != null) fis.close();} catch (IOException e) {e.printStackTrace();}try {if (fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}}}
}
处理流之二:转换流
总结:
1.复习 字符编码:字符、字符串、字符数组--->字节、字节数组(从我们能看得懂的--->我们看不懂的) 字符解码:字节、字节数组 --->字符、字符串、字符数组(从我们看不懂的--->我们能看得懂的)2.如果希望程序在读取文本文件时,不出现乱码,需要注意什么? > 解码时使用的字符集必须与当初编码时使用的字符集得相同。 > 拓展:解码集必须要与编码集兼容。比如:文件编码使用的是GBK,解码时使用的是utf-8。如果文件中只有abc等英文字符,此情况下也不会出现乱码。因为GBK和utf-8都向下兼容了ASCII(或 ascii) 3.转换流: ① 作用: 实现字节与字符之间的转换 ② API: InputstreamReader:将一个输入型的字节流转换为输入型的字符流 0utputstreamWriter:将一个输出型的字符流转换为输出型的字节流。 4.关于字符集的理解 4.1 在存储的文件中的字符: ascii:主要用来存储a、b、c等英文字符和1、2、3、常用的标点符号。每个字符占用1个字节。 iso-8859-1:了解,每个字符占用1个字节。向下兼容ascii。 gbk:用来存储中文简体繁体、a、b、c等英文字符和1、2、3、常用的标点符号等字符。中文字符使用2个字节存储的。向下兼容ascii,意味着英文字符、1、2、3、标点符号仍使用1个字节 utf-8:可以用来存储世界范围内主要的语言的所有的字符。使用1-4个不等的字节表示一个字符。中文字符使用3个字节存储的。向下兼容ascii,意味着英文字符、1、2、3、标点符号仍使用1个字节。 4.2 在内存中的字符: 一个字符(char)占用2个字节。在内存中使用的字符集称为Unicode字符集。
代码:
public class InputStreamReaderTest {/*** 读取到的数据出现了乱码* 因为dbcp_utf-8.txt文件使用的是utf-8的字符集进行的编码,所以在读取此文件时使用的解码集必须也是utf-8* 否则会出现乱码*/@Testpublic void test1() throws IOException {//File file1 = new File("dbcp_utf-8.txt");//FileInputStream fis = new FileInputStream(file1);
// InputStreamReader isr = new InputStreamReader(fis); //此时使用的是IDEA默认的UTF-8的字符集InputStreamReader isr1 = new InputStreamReader(fis, "gbk"); //显示的使用utf-8或gbk的字符集char[] cBuffer = new char[1024];int len;while((len = isr1.read(cBuffer)) != -1){String str = new String(cBuffer, 0, len);System.out.println(str);}//关闭资源isr1.close();}@Testpublic void test2() throws IOException {//File file1 = new File("dbcp_utf-8.txt");//FileInputStream fis = new FileInputStream(file1);
// InputStreamReader isr = new InputStreamReader(fis); //此时使用的是IDEA默认的UTF-8的字符集InputStreamReader isr1 = new InputStreamReader(fis, "utf-8"); //显示的使用utf-8的字符集char[] cBuffer = new char[1024];int len;while((len = isr1.read(cBuffer)) != -1){String str = new String(cBuffer, 0, len);System.out.println(str);}//关闭资源isr1.close();}@Testpublic void test3() throws IOException {//File file1 = new File("dbcp_gbk.txt");//FileInputStream fis = new FileInputStream(file1);
// InputStreamReader isr = new InputStreamReader(fis); //此时使用的是IDEA默认的UTF-8的字符集InputStreamReader isr1 = new InputStreamReader(fis, "gbk"); //显示的使用gbk的字符集char[] cBuffer = new char[1024];int len;while((len = isr1.read(cBuffer)) != -1){String str = new String(cBuffer, 0, len);System.out.println(str);}//关闭资源isr1.close();}/*** 需求:将gbk格式的文件转换为utf-8格式的文件存储*/@Testpublic void test4() throws IOException {//1.造文件File file1 = new File("dbcp_gbk.txt");File file2 = new File("dbcp_gbk_to_utf-8.txt");//2.造流FileInputStream fis = new FileInputStream(file1);//参数2对应的是解码集,必须与dbcp_gbk.txt的编码集一致InputStreamReader isr = new InputStreamReader(fis,"GBK");FileOutputStream fos = new FileOutputStream(file2);//参数2指明内存中的字符存储到文件中的字节过程中使用的编码集OutputStreamWriter oosw = new OutputStreamWriter(fos,"utf-8");//3.读写过程char[] cBuffer = new char[1024];int len;while((len = isr.read(cBuffer)) != -1){oosw.write(cBuffer,0,len);}System.out.println("操作完成");//4.关闭资源oosw.close();isr.close();}
}
处理流之三:标准输入、输出流(了解)
处理流之四:打印流(了解)
apache-common包的使用
总结:
1. 标准输入、输出流 System.in:标准的输入流,默认从键盘输入 System.out:标准的输出流,默认从显示器输出(理解为控制台输出)通过调用如下的方法,修改输入流和输出流的位置 setIn(InputStream is) setOut(PrintStream ps) 2.打印流3.apache-common包的使用
代码:
OtherStream
public class OtherStream {/*** 从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续* 进行输入操作,直至当输入“e”或者“exit”时,退出程序。*/@Testpublic void test1() {System.out.println("请输入信息(退出输入e或者exit):");//把“标准”输入流(键盘输入)这个字节流包装成字符流,在包装成缓冲流BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s = null;try {while ((s = br.readLine()) != null) { //读取用户输入的一行数据 ---> 阻塞程序if ("e".equalsIgnoreCase(s) || "exit".equalsIgnoreCase(s)) {System.out.println("安全退出");break;}//将读取到的操作整行字符串转成大写输出System.out.println("--->:" + s.toUpperCase());System.out.println("继续输入信息");}} catch (IOException e) {e.printStackTrace();} finally {try {if (br != null)br.close(); //关闭过滤流时,会自动关闭它包装的底层节点流} catch (IOException e) {e.printStackTrace();}}}@Testpublic void test2() throws FileNotFoundException {PrintStream ps = new PrintStream("io.txt");ps.println("hello");ps.println(1);ps.println(1.5);System.setOut(ps);System.out.println("你好,atguigu");ps.close();}@Testpublic void test3(){PrintStream ps = null;try {FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt"));//创建打印输出流,设置为自动刷新模式(写入换行符或字节 '\n' 时都会自动刷新输出缓冲区ps = new PrintStream(fos,true);if(ps != null){ //把标准输出流(控制台输出)改成文件System.setOut(ps);}for(int i = 0;i<=255;i++){ //输出ASCII字符System.out.print((char)i);if(i%50 ==0){ //每50个数据一行System.out.println(); //换行}}} catch (FileNotFoundException e) {e.printStackTrace();} finally {if(ps != null)ps.close();}}//测试自定义的日志类@Testpublic void test4(){//测试工具类是否好用Logger.log("调用了System类的gc()方法,建议启动垃圾回收");Logger.log("调用了TeamView的addMember()方法");Logger.log("用户尝试进行登录,验证失败");}@Testpublic void test5() throws IOException {//赋值一个图片File srcFile = new File("scenery.jpg");File destFile = new File("scenery_copy2.jpg");FileUtils.copyFile(srcFile,destFile);System.out.println("复制成功");}
}Logger
public class Logger {/*** 记录日志的方法*/public static void log(String msg){try {//指向一个日志文件PrintStream out = new PrintStream(new FileOutputStream("log.txt",true));//改变输出方法System.setOut(out);//日期当前时间Date nowTime = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");String strTime = sdf.format(nowTime);System.out.println(strTime + ":" + msg);} catch (FileNotFoundException e) {e.printStackTrace();}}
}
针对于test5而言的apache-common包
在当前包简历libs文件并引入包,在当前包下面放入需要使用的文件,不可以打开查看具体文件的话,点击右键,选择添加为库即可
处理流之五:数据流(了解)
处理流之六:对象流
总结:
1.数据流及其作用(了解) DataOutputstream:可以将内存中的基本数据类型的变量、string类型的变量写出到具体的文件中 DataInputstream:将文件中保存的数据还原为内存中的基本数据类型的变量、String类型的变量。 2.对象流及其作用 2.1 API: 0bjectInputSteam 0bjectOutputStream 2.2 作用: 可以读写基本数据类型的变量、引用数据类型的变量。 3.对象的序列化机制是什么 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上, 或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。 4.如下两个过程使用的流: 序列化过程:使用0bject0utputstream流实现。将内存中的Java对象保存在文件中或通过网络传输出去 反序列化过程:使用0bjectInputSteam流实现。将文件中的数据或网络传输过来的数据还原为内存中的Java对象 5.自定义类要想实现序列化机制,需要满足: ① 自定义类需要实现接口:Serializable ② 要求自定义类声明一个全局常量: static final long serialVersionUID = 42234234L;用来唯一的标识当前的类 ③ 要求自定义类的各个属性也必须是可序列化的> 对于基本数据类型的属性:默认就是可以序列化的> 对于引用数据类型的属性:要求实现Serializable接口 6.注意点: ① 如果不声明全局常量serialVersionUID,系统会自动声明生成一个针对于当前类的serialVersionUID, 如果修改此类的话,会导致serialVersionUID变化,进而导致反序列化时,出现InvalidClassException ② 类中的属性如果声明为transient或static,则不会实现序列化。
代码:
public class ObjectInputOutputStreamTest {/*** 序列化过程:使用0bject0utputstream流实现。将内存中的Java对象保存在文件中或通过网络传输出去*/@Testpublic void test1() throws IOException {//1.File file = new File("Object.txt");ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));//2.写出数据即为序列化的过程oos.writeUTF("江山如此多娇,引无数英雄尽折腰");oos.flush();oos.writeObject("轻轻地我走了,正如我轻轻地来");oos.flush();oos.close();}/*** 反序列化过程:使用0bjectInputSteam流实现。将文件中的数据或网络传输过来的数据还原为内存中的Java对象*/@Testpublic void test2() throws IOException, ClassNotFoundException {//1.File file = new File("Object.txt");ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));//2.读取文件中的对象(或反序列化的过程)String str1 = ois.readUTF();System.out.println(str1);String str2 = (String)ois.readObject();System.out.println(str2);//3.ois.close();}/*** 演示自定义类的对象的序列化和反序列化的过程*///序列化过程:@Testpublic void test3() throws IOException {//1.File file = new File("Object1.txt");ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));//2.写出数据即为序列化的过程Person p1 = new Person("Tom",12);oos.writeObject(p1);oos.flush();Person p2 = new Person("Jerry",23,1001,new Account(2000));oos.writeObject(p2);oos.flush();//3.oos.close();}//反序列化的过程@Testpublic void test4() throws IOException, ClassNotFoundException {//1.File file = new File("Object1.txt");ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));//2.读取文件中的对象(或反序列化的过程)Person person = (Person)ois.readObject();System.out.println(person);Person person1 = (Person) ois.readObject();System.out.println(person1);//3.ois.close();}
}
Person
public class Person implements Serializable { //Serializable:属于一个标识接口transient String name;static int age;int idd;Account acct;static final long serialVersionUID = 42234234L;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public Person(String name, int age, int id) {this.name = name;this.age = age;this.idd = id;}public Person(String name, int age, int idd, Account acct) {this.name = name;this.age = age;this.idd = idd;this.acct = acct;}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 int getId() {return idd;}public void setId(int id) {this.idd = id;}
// @Override
// public String toString() {
// return "Person{" +
// "name='" + name + '\'' +
// ", age=" + age +
// '}';
// }// @Override
// public String toString() {
// return "Person{" +
// "name='" + name + '\'' +
// ", age=" + age +
// ", id=" + idd +
// '}';
// }@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", idd=" + idd +", acct=" + acct +'}';}
}
class Account implements Serializable {double balance;static final long serialVersionUID = 422574234L;public Account(double balance) {this.balance = balance;}@Overridepublic String toString() {return "Account{" +"balance=" + balance +'}';}
}
随机存取文件流
NIO.2中Path、Paths、Files类的使用
相关文章:
java学习笔记13——IO流
File 类的使用 常用构造器 路径分隔符 常用方法 File类的获取功能和重命名功能 File 类的判断功能 File类的创建功能和删除功能 File 类的使用 总结: 1.File类的理解 > File类位于java.io包下,本章中涉及到的相关流也都声明在java.io包下 > File…...
防DDoS流量清洗核心机制解析
本文深度剖析DDoS流量清洗技术演进路径,揭示混合云清洗系统的四层过滤架构,结合2023年新型反射攻击案例,提出基于AI行为分析的动态防御策略。通过Gartner最新攻防效能数据与金融行业实战方案,阐明流量清洗系统在误判率、清洗延迟、…...
边缘计算革命:低功耗GPU在自动驾驶实时决策中的应用
边缘计算革命:低功耗GPU在自动驾驶实时决策中的应用 ——分析NVIDIA Jetson与华为昇腾的嵌入式方案差异 一、自动驾驶的实时决策挑战与边缘计算需求 自动驾驶系统需在30ms内完成环境感知、路径规划与车辆控制的全流程闭环。传统云端计算受限于网络延迟…...
ubuntu24.04-MyEclipse的项目导入到 IDEA中
用myeclipse创建的一个web项目, jdk1.7,tomcat7,mysql8.0,导入到idea项目中 1.导入现有项目 1.打开IDEA,选择“Import Project”进入下一步 2.选择所需要导入的项目,点击“OK” 3.点击创建一个新的项目,然后下一步 4.直接点…...
基于SpringBoot的律师事务所案件管理系统【附源码】
基于SpringBoot的律师事务所案件管理系统(源码L文说明文档) 目录 4 系统设计 4.1界面设计原则 4.2功能结构设计 4.3数据库设计 4.3.1属性图 4.3.2 数据库物理设计 5 系统实现 5.1客户信息管理 5.2 律师…...
电力网关:推动电力物联网及电力通信系统革新
在“双碳”目标与新型电力系统建设的背景下,电力行业正加速向数字化、智能化、绿色化转型。作为国内领先的电力物联网解决方案提供商,厦门计讯物联科技有限公司(以下简称“计讯物联”)依托自主研发的电力专用网关、边缘计算平台及…...
Android系统的Wi-Fi系统框架和详细启动流程
目录 一、前言 二、系统架构层次 1、应用层 2、Framework层 3、HAL层 4、驱动层 三、Wi-Fi 目录树结构 四、系统流程 1、应用层请求 2、Wi-Fi管理服务处理 3、硬件交互 4、数据处理与事件通知 5.连接管理 6.状态维护 五、WiFi启动流程及函数调用…...
Scala基础知识8
集合计算高级函数 包括过滤、转换或映射、扁平化、扁平化加映射、分组、简化(归约),折叠 过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合。 转换或映射:将原始集合中的元素映射到某个函数中。 扁平化:取消嵌套格式&…...
SwiftUI 本地推送(Local Notification)教程目录
1. 本地推送简介 1.1 什么是本地推送?1.2 本地推送的应用场景(提醒、定时任务、用户交互等)1.3 本地推送与远程推送的区别 2. 前提条件 2.1 开发环境要求(Xcode 13、iOS 15)2.2 需要的基础知识(SwiftUI …...
大数据技术与Scala
集合高级函数 过滤 通过条件筛选集合元素,返回新集合。 映射 对每个元素应用函数,生成新集集合 扁平化 将嵌套集合展平为单层集合。 扁平化映射 先映射后展平,常用于拆分字符串。 分组 按规则将元素分组为Map结构。 归约 …...
golang通过飞书邮件服务API发送邮件功能详解
一.需求 需要实现通过飞书邮件服务API发送邮件验证码功能:用户输入邮箱, 点击发送邮件,然后发送邮件验证码, 这里验证码有过期时间, 保存到redis缓存中 二.实现 实现的部分代码如下: 控制器部分代码 // 发送邮件控制器 func EmailSendController(userId uint64, m proto.Messa…...
BoostSearch搜索引擎项目 —— 测试用例设计 + web自动化测试代码
web自动化代码: https://gitee.com/chicken-c/boost-search/tree/master/AutoTest...
MySQL学习笔记集--触发器
触发器 MySQL触发器(Trigger)是一种特殊的存储过程,它在指定的数据库表上指定的事件(INSERT、UPDATE、DELETE)之前或之后自动执行。触发器可以用来强制执行复杂的业务逻辑、数据完整性规则、自动更新数据等。 触发器…...
算力驱动未来:从边缘计算到高阶AI的算力革命
算力驱动未来:从边缘计算到高阶AI的算力革命 摘要 本文深入探讨了不同算力水平(20TOPS至160TOPS)在人工智能领域的多样化应用场景。从边缘计算的实时目标检测到自动驾驶的多传感器融合,从自然语言处理的大模型应用到AI for Scie…...
4.8刷题记录(双指针)
今天刷的部分是代码随想录中的双指针专题代码随想录 由于里面包含的题目大部分之前刷过,并且用双指针做过。所以今天仅仅复习,不再进行代码的搬运。 1.19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 分析:此题无…...
在shell脚本中,$@和$#的区别与联系
在 Shell 脚本里,$ 和 $* 都是用于表示传递给脚本或函数的所有参数,下面详细介绍它们的区别与联系。 联系 表示所有参数:二者都能够代表传递给脚本或者函数的全部参数。当你在执行脚本时带上了多个参数,$ 和 $* 都能把这些参数呈…...
IP节点详解及国内IP节点获取指南
获取国内IP节点通常涉及网络技术或数据资源的使用,IP地址作为网络设备的唯一标识,对于网络连接和通信至关重要。详细介绍几种修改网络IP地址的常用方法,无论是对于家庭用户还是企业用户,希望能找到适合自己的解决方案。以下是方法…...
Google Play上架:解决android studio缓存问题(内容清理不干净导致拒审)
在as打包中,经常会遇到改变工程参数或者对应文件参数的情况,比如 修改android gradle版本 快捷键:ctrl + alt + shift + s 修改SDK文件路径 快捷键:ctrl + alt + shift + s 修改Gradle存储下载文件的默认位置 快捷键:ctrl + alt + s 先打开设置 修改compile...
蓝桥杯备赛 Day 21 图论基础
图的基础 ![[图的基础.png]] 1.图的存储方式 (1)邻接表(常用) vector<pair<int,int>> g[N]; //g[x]存放x的所有出点信息,二维数组 g[i][j]{first,second},first是从i出发的第j个出点,second表示边权 例如上图: g[1]{{2,0}.{3,0}} g[6]{{3,7}} g[4]{{5,0},{6,0}…...
MySQL数据库应用技术试卷
建一个以自己名字拼音为命名的数据库。(3分) CREATE DATABASE example; 令这个数据库为当前所使用的数据库。(2分) USE example; 写出如下student表结构语句。(95分) 表1: 列名 数据类型 …...
openssl源码分析之加密模式(modes)
openssl实现分组加密模式(例如AES128-CBC的CBC部分)的模块名字叫做modes,源代码位于 https://gitee.com/gh_mirrors/openssl/tree/master/crypto/modes 博主又打不开github了TT,只能找个gitee镜像 头文件是modes.h。 该模块目前…...
【Unity】Unity Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作
【Unity 】Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作 在Unity开发中,Transform组件承担着场景中物体的空间信息控制,包括位置、旋转和缩放。而缩放(Scale)操作,作为三…...
集成nacos2.2.1出现的错误汇总
总结 1.jdk问题 jdk要一致 2.idea使用问题 idea启动nacos要配置,idea启动类要启动两次,并配置两次vm参数 3.项目依赖问题 依赖要正确添加,有的模块就是不能用公共模块的pom配置,需要独立配置,先后启动顺序也要注意…...
从零到有的游戏开发(visual studio 2022 + easyx.h)
引言 本文章适用于C语言初学者掌握基本的游戏开发, 我将用详细的步骤引领大家如何开发属于自己的游戏。 作者温馨提示:不要认为开发游戏很难,一些基本的游戏逻辑其实很简单, 关于游戏的开发环境也不用担心,我会详细…...
海外高防服务器延迟优化——跨国业务安全加速的底层逻辑
本文深度解析海外高防服务器延迟优化的技术实现路径,揭示跨国业务场景下DDoS防护与网络性能的平衡法则。从物理线路选择到协议栈调优,从流量调度算法到安全检测机制重构,系统阐述降低20ms-50ms延迟的工程实践方案,并附2023年东南亚…...
常用环境部署(二十六)——Centos搭建MQTT服务端EMQX
1、安装docker https://blog.csdn.net/wd520521/article/details/112609796?spm1011.2415.3001.5331 2、安装EMQX4.4.4 (1)使用docker pull指令安装emqx镜像 docker pull emqx/emqx:4.4.4 (2)查看镜像 docker images 3、启…...
ecovadis认证基本概述,ecovadis认证审核有效期
EcoVadis认证基本概述 1. 什么是EcoVadis认证? EcoVadis是全球领先的企业可持续发展(ESG)评级平台,专注于评估企业在**环境(E)、劳工与人权(S)、商业道德(L)…...
2.8.4 iOS覆盖率SDK开发
iOS系统的覆盖率SDK,通过搭建本地的pod仓库,直接在podfile中添加指定的下载地址,就可以实现对被测试的app注入覆盖率SDK。 2.8.4.1 开发iOS覆盖率获取Pod私有库 在网上查找了相应的开发方法后,决定开发自己的依赖库,开发方法及步骤如下: 1,开发新的包 (1)通过Xcode创…...
Redhat(6)-ansible-变量
变量 1.作用域 Global scope:命令行中设置。 Play scope:play中设置。 Host scope :inventory中定义、facts收集或任务中注册,在主机组和主机上设置。 1.全局变量 1.1cmd命令 #1.全局变量 #显示变量 echo %PATH1.2.ansible变量 全局变量 var变量不加…...
麦科信光隔离探头在碳化硅(SiC)MOSFET动态测试中的应用
碳化硅(SiC)MOSFET 是基于宽禁带半导体材料碳化硅(SiC)制造的金属氧化物半导体场效应晶体管,相较于传统硅(Si)MOSFET,具有更高的击穿电压、更低的导通电阻、更快的开关速度以及更优异…...
android audiorecord
这里写目录标题 初始化失败记录 AudioRecord 初始化及参数介绍基本初始化参数详解1. audioSource (音频源)2. sampleRateInHz (采样率)3. channelConfig (声道配置)4. audioFormat (音频格式)5. bufferSizeInBytes (缓冲区大小) 完整初始化示例使用注意事项 参考地址 初始化失败…...
有一个变量 在有些线程没有加锁 有些线程加锁了,那我在这些加锁的线程中能起到对应的作用吗
这是一个非常经典、但也很危险的问题。 🧨 简单结论: 如果一个变量在某些线程访问时没有加锁,即使其他线程对它加了锁,也: ❌ 不能保证线程安全! ❌ 加锁的部分不会“保护”未加锁的部分! &am…...
【人工智能】AI大模型开发数学基础指南
目录 学习内容**1. 线性代数****2. 概率与统计****3. 微积分****4. 优化理论****5. 信息论****6. 数值计算****7. 离散数学****8. 统计学进阶****如何学习?****总结** 如何学习**1. 明确学习目标****2. 分阶段学习计划****阶段 1:夯实基础****阶段 2&…...
直流减速电机控制实验:Simulink应用层开发(3)
文章目录 1 阶段目标2 单元测试方法3 单元测试过程3.1 按键指令识别测试3.2 电机状态转换测试4 代码生成5 总结1 阶段目标 本文是《直流减速电机控制实验》的第四部分,会通过图文结合的方式,手把手带读者操作Simulink工具进行直流减速电机的应用层开发。 本章主要将《直流减…...
隔行换色总结
功能效果展示: 第一种思路: 使用数组,将数组的内容渲染到页面上,序号也就是将数组的下标输出到第一个td上,将数组的内容输出到第二个td上,(使用拼接字符串) 具体操作: …...
【kind管理脚本-2】脚本使用说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本
当然可以,以下是为你这份 Kind 管理脚本写的一份使用说明文档,可作为 README.md 或内部文档使用: 🚀 Kind 管理脚本说明文档 本脚本是一个便捷的工具,帮助你快速创建、管理和诊断基于 Kind (Kubernetes IN Docker) 的…...
Python星球日记 - 第13天:封装、继承与多态
🌟引言: 上一篇:Python星球日记 - 第12天:面向对象编程(OOP)基础 名人说:不要人夸颜色好,只留清气满乾坤(王冕《墨梅》) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言二、封装的概念与实现1. 公有属性与私有属性2. 使用getter和sett…...
基于AT89C52单片机的GSM上报智能家居报警温度烟雾防盗系统
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90579530?spm1001.2014.3001.5503 功能介绍: 1、功能:具有温度、烟雾、入侵报警功能,采用LCD1602液晶显示屏实时显示温度值与…...
北重数控滑台厂家:机器人地轨究竟是如何运作的,又在哪些领域发光发热呢?
机器人地轨是指利用机器人技术在地面上移动或执行任务的轨道系统。这种系统通常包括导轨、传动装置、传感器和控制系统等组成部分。机器人地轨的运作原理是通过控制传动装置沿着导轨移动,同时利用传感器获取周围环境信息并通过控制系统进行实时调节。 机器人地轨在…...
2025最新系统 Git 教程(三)
2.3 Git 基础 - 查看提交历史 查看提交历史 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log 命令。 我们使用一个非常简单的 simplegit 项目作为示例。 运行下面的命令获取该项目&…...
显示器各类异常处理方法
显示器各类异常处理方法 导航 文章目录 显示器各类异常处理方法导航画面无显示/黑屏/无HDMI信号输入显示器闪烁显示器花屏显示画面模糊或扭曲显示器颜色异常显示器出现死点或亮点 画面无显示/黑屏/无HDMI信号输入 首先应该检查的是显示器电源(真的有人弄掉电源…...
Error 1062 (23000): Duplicate entry ‘‘ for key ‘id‘`
目录 Error 1062 (23000): Duplicate entry for key id1. **问题分析**2. **解决方法****步骤 1:检查 id 字段的值****步骤 2:检查表结构****步骤 3:检查现有数据****步骤 4:检查插入逻辑****步骤 5:修改表结构&#…...
谈谈模板方法模式,模板方法模式的应用场景是什么?
一、模式核心理解 模板方法模式是一种行为设计模式,通过定义算法骨架并允许子类重写特定步骤来实现代码复用。 如同建筑图纸规定房屋结构,具体装修由业主决定,该模式适用于固定流程中需要灵活扩展的场景。 // 基础请求处理…...
未来蓉城:科技与生态共舞的诗意栖居-成都
故事背景 故事发生在中国四川成都的2075年,展现科技与自然深度交融的未来城市图景。通过六个充满想象力的生态装置场景,描绘市民在智慧城市中诗意栖居的生活状态,展现环境保护与人文传承的和谐共生。 故事内容 在电子竹林轻轨站,通…...
模仿axios的封装效果来封装fetch,实现baseurl超时等
因为要在cocos游戏项目里面发送网络请求获取数据,并且还有可能用到websocket发送请求,所以这里封装一个fetch放便使用: // fetch封装// 基础配置 const BASE_URL 你的url const TIMEOUT 5000// 请求封装 const http async (url: string, …...
Linux(CentOS10) gcc编译
本例子摘自《鸟哥的linux私房菜-基础学习第四版》 21.3 用make进行宏编译 书中的代码在本机器(版本见下)编译出错,改正代码后发布此文章: #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…...
Design Compiler:语法检查工具dcprocheck
相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 dcprocheck是一个在Design Compiler存在于安装目录下的程序(其实它是一个指向snps_shell的符号链接,但snps_shell可以根据启动命令名判…...
根据日期格式化的常见规则和标准
根据日期格式化的常见规则和标准,2025年1月9日17:00可以正常格式化。具体分析如下: 1. 日期合法性验证 日期2025年1月9日不存在逻辑错误(如2月30日等非法日期),且时间17:00(24小时制)符合规范…...
macOS Chrome - 打开开发者工具,设置 Local storage
文章目录 macOS Chrome - 打开开发者工具设置 Local storage macOS Chrome - 打开开发者工具 方式2:右键点击网页,选择 检查 设置 Local storage 选择要设置的 url,显示右侧面板 双击面板,输入要添加的内容 2025-04-08ÿ…...
idea 的 WEB-INF 下没有 classes 编译文件,如何添加?
idea 打开项目却没有在 WEB-INF 下找到 classes 编译文件 添加流程如下: 1、选中 File ->Project Structure 后右击 2、选中 Modules ->选中项目 ->点击 Paths ->修改 output path为:项目绝对路径\WebRoot\WEB-INF\classes 3、修改完成后&…...