• Java之文件流(26个Demo)


    Java文件流主要包括字节流和字符流,字符流本质上就是字节流+编码表,下面通过26个案例介绍了字符流和字节流对文件的操作,包括创建文件路径,文件的读取和写入,文件判断,文件删除,遍历文件,文件复制,文件的编码与解码,文件异常处理以及对象序列化和反序列化等。

    目录

    1-File类的三个构造方法

    2-File类的创建功能

    3-File类判断和获取功能

    4-File类删除功能

    5-简单递归

    6-遍历目录打印绝对路径

    7-字节流写数据的三种方式

    8-字节流读数据的方式

    9-字节流复制文本文件

    10-字节流读数据(一次读一组)

    11-字节流复制图片

    12-字节缓冲流读取数据

    13-初识编码与解码

    14-字符流的编码与解码

    15-字符流写数据的5种方式

    16-字符流读数据的2种方式

    17-字符流复制文件

    18-字符缓冲流复制文件

    19-使用字符缓冲流特有功能复制文件

    20-集合数据传入文件

    21-文件数据读入集合

    22-复制单级文件夹(目录含文件,不含目录)

    23-复制多级文件夹(目录中包含目录和文件)

    24-复制文件的异常处理(try---catch代替throws)

    25-对象序列化流与对象反序列化流

    26-序列化中的serialVersionUID和transient


    1-File类的三个构造方法

    1. import java.io.File;
    2. public class FileDemo01 {
    3. public static void main(String[] args) {
    4. //File封装路径
    5. //创建File实例的三种方法
    6. File file = new File("src\\com\\learn\\java.txt") ;
    7. System.out.println(file);
    8. File file1 = new File("src\\com\\learn","java.txt") ;
    9. System.out.println(file1);
    10. File file2 = new File("src\\com\\learn") ;
    11. File file3 = new File(file2,"java.txt") ;
    12. System.out.println(file3);
    13. }
    14. }

    2-File类的创建功能

    1. import java.io.File;
    2. import java.io.IOException;
    3. public class FileDemo02 {
    4. public static void main(String[] args) throws IOException {
    5. //在目录下创建java.txt文件
    6. File file = new File("New\\src\\com\\learn\\java.txt") ;
    7. System.out.println(file.createNewFile());
    8. System.out.println("------------------");
    9. //在目录下创建目录study
    10. File file1 = new File("New\\src\\com\\learn\\study") ;
    11. System.out.println(file1.mkdir());
    12. System.out.println("------------------");
    13. //在目录下创建多级目录study1\Java
    14. File file2 = new File("New\\src\\com\\learn\\study1\\Java");
    15. System.out.println(file2.mkdirs());
    16. System.out.println("------------------");
    17. }
    18. }

    3-File类判断和获取功能

    1. import java.io.File;
    2. import java.io.IOException;
    3. public class FileDemo03 {
    4. public static void main(String[] args) throws IOException {
    5. File file = new File("New\\src\\com\\learn\\java.txt");
    6. file.createNewFile() ;
    7. System.out.println(file.isFile()); //是否是文件
    8. System.out.println(file.isDirectory()); //是否是目录
    9. System.out.println(file.exists()); //是否存在
    10. System.out.println(file.getAbsolutePath()); //绝对路径
    11. System.out.println(file.getPath()); //抽象的路径
    12. System.out.println(file.getName()); //最后的文件或者目录名
    13. //返回文件和目录或者目录的字符串
    14. File file1 = new File("New\\src") ;
    15. String [] files = file1.list() ;
    16. for(String s : files){
    17. System.out.println(s);
    18. }
    19. //返回文件和目录的File对象
    20. File [] files1 = file1.listFiles() ;
    21. for(File file2 : files1){
    22. System.out.println(file2);
    23. }
    24. }
    25. }

    4-File类删除功能

    1. import java.io.File;
    2. import java.io.IOException;
    3. public class FileDemo04 {
    4. public static void main(String[] args) throws IOException {
    5. //创建java.txt文件并删除
    6. File file = new File("New\\src\\com\\learn\\java.txt") ;
    7. file.createNewFile() ;
    8. file.delete() ;
    9. // System.out.println("------------");
    10. //创建study目录并删除
    11. File file1 = new File("New\\src\\com\\learn\\study") ;
    12. file1.mkdir() ;
    13. file1.delete() ;
    14. // System.out.println("-------------");
    15. //先创建目录,再创建文件,然后先删除文件,后删除目录
    16. File file2 = new File("New\\src\\com\\learn\\study") ;
    17. file2.mkdir() ;
    18. File file3 = new File("New\\src\\com\\learn\\study","java.txt") ;
    19. file3.createNewFile() ;
    20. file3.delete() ;
    21. file2.delete() ;
    22. }
    23. }

    5-简单递归

    1. import java.util.Scanner;
    2. public class FileDemo05 {
    3. public static void main(String[] args) {
    4. //递归求阶乘
    5. Scanner input = new Scanner(System.in) ;
    6. long n = input.nextLong() ;
    7. System.out.println(f(n));
    8. }
    9. public static long f(long n){
    10. return n==1 ? 1 : n * f(n-1) ;
    11. }
    12. }

    6-遍历目录打印绝对路径

    1. import java.io.File;
    2. public class FileDemo06 {
    3. public static void main(String[] args) {
    4. //遍历文件,输出绝对路径
    5. File file = new File("New\\src") ;
    6. findPath(file) ;
    7. }
    8. private static void findPath(File file) {
    9. if(file != null) {
    10. for (File file1 : file.listFiles()) {
    11. if (file1.isDirectory()) {
    12. findPath(file1); //是目录,递归调用
    13. } else {
    14. //不是目录,打印绝对路径
    15. System.out.println(file1.getAbsolutePath());
    16. }
    17. }
    18. }
    19. }
    20. }

    7-字节流写数据的三种方式

    1. import java.io.FileOutputStream;
    2. import java.io.IOException;
    3. public class FileDemo07 {
    4. public static void main(String[] args) throws IOException {
    5. //true表示追加,如果没有true就默认为覆盖
    6. FileOutputStream fos = new FileOutputStream("New\\src\\com\\learn\\java.txt",true) ;
    7. fos.write(97); //写单个
    8. fos.write("\r\n".getBytes());
    9. fos.write("abcde\r\n".getBytes()); //写一组
    10. fos.write("xyzw\r\n".getBytes(),1,3); //写指定长度
    11. fos.close();
    12. }
    13. }

    8-字节流读数据的方式

    1. import java.io.FileInputStream;
    2. import java.io.IOException;
    3. public class FileDemo08 {
    4. public static void main(String[] args) throws IOException {
    5. FileInputStream fis = new FileInputStream("New\\src\\com\\learn\\java.txt") ;
    6. //读取一次数据
    7. int by = fis.read() ;
    8. System.out.println(by);
    9. System.out.println((char)by);
    10. //读取所有数据
    11. while((by=fis.read()) != -1){
    12. System.out.print((char)by);
    13. }
    14. fis.close();
    15. }
    16. }

    9-字节流复制文本文件

    1. import java.io.FileInputStream;
    2. import java.io.FileOutputStream;
    3. import java.io.IOException;
    4. public class FileDemo09 {
    5. public static void main(String[] args) throws IOException {
    6. //字节流依次读取文件内容并写入新文件
    7. FileInputStream fis = new FileInputStream("New\\src\\com\\learn\\java.txt") ;
    8. FileOutputStream fos = new FileOutputStream("New\\src\\com\\learn\\python.txt") ;
    9. int by ;
    10. while((by=fis.read()) != -1){
    11. fos.write((char)by);
    12. }
    13. fis.close();
    14. fos.close();
    15. }
    16. }

    10-字节流读数据(一次读一组)

    1. import java.io.FileInputStream;
    2. import java.io.IOException;
    3. public class FileDemo10 {
    4. public static void main(String[] args) throws IOException {
    5. FileInputStream fis = new FileInputStream("New\\src\\com\\learn\\java.txt") ;
    6. byte [] bytes = new byte[1024] ;
    7. int len ;
    8. while((len=fis.read(bytes)) != -1){
    9. System.out.println(new String(bytes,0,len));
    10. }
    11. fis.close();
    12. }
    13. }

    11-字节流复制图片

    1. import java.io.FileInputStream;
    2. import java.io.FileOutputStream;
    3. import java.io.IOException;
    4. public class FileDemo11 {
    5. public static void main(String[] args) throws IOException {
    6. //字节流复制图片
    7. FileInputStream fis = new FileInputStream("New\\src\\com\\learn\\x.jpg") ;
    8. FileOutputStream fos = new FileOutputStream("New\\src\\com\\my\\x.jpg") ;
    9. byte [] bytes = new byte[1024] ;
    10. int len ;
    11. while((len=fis.read(bytes)) != -1){
    12. fos.write(bytes,0,len);
    13. }
    14. fis.close();
    15. fos.close();
    16. }
    17. }

    12-字节缓冲流读取数据

    1. import java.io.BufferedInputStream;
    2. import java.io.FileInputStream;
    3. import java.io.IOException;
    4. public class FileDemo12 {
    5. public static void main(String[] args) throws IOException {
    6. //字节缓冲流
    7. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("New\\src\\com\\learn\\java.txt")) ;
    8. byte [] bytes = new byte[1024] ;
    9. int len ;
    10. while((len=bis.read(bytes)) != -1){
    11. System.out.println(new String(bytes,0,len));
    12. }
    13. }
    14. }

    13-初识编码与解码

    1. import java.io.UnsupportedEncodingException;
    2. import java.util.Arrays;
    3. public class FileDemo13 {
    4. public static void main(String[] args) throws UnsupportedEncodingException {
    5. String s = "中国" ;
    6. //编码
    7. byte [] bytes = s.getBytes("GBK") ;
    8. byte [] bytes1 = s.getBytes("UTF-8") ;
    9. System.out.println(Arrays.toString(bytes));
    10. System.out.println(Arrays.toString(bytes1));
    11. //解码
    12. String s1 = new String(bytes,"GBK") ;
    13. String s2 = new String(bytes1, "UTF-8") ;
    14. System.out.println(s1);
    15. System.out.println(s2);
    16. }
    17. }

    14-字符流的编码与解码

    1. import java.io.*;
    2. public class FileDemo14 {
    3. public static void main(String[] args) throws IOException {
    4. //以GBK编码字符流写入
    5. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("New\\src\\com\\learn\\java.txt"),"GBK") ;
    6. osw.write("中国");
    7. osw.close();
    8. //以GBK编码字符流读取
    9. InputStreamReader osr = new InputStreamReader(new FileInputStream("New\\src\\com\\learn\\java.txt"),"GBK") ;
    10. int len ;
    11. while((len=osr.read()) != -1){
    12. System.out.print((char) len);
    13. }
    14. }
    15. }

    15-字符流写数据的5种方式

    1. import java.io.FileOutputStream;
    2. import java.io.IOException;
    3. import java.io.OutputStreamWriter;
    4. public class FileDemo15 {
    5. public static void main(String[] args) throws IOException {
    6. //字符流写数据的5种方式
    7. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("New\\src\\com\\learn\\java.txt")) ;
    8. //写单个字符
    9. // osw.write("a");
    10. // osw.flush();
    11. // osw.close();
    12. //写字符数组
    13. // char [] chars = {'a','b','c','e','d'} ;
    14. // osw.write(chars);
    15. // osw.flush();
    16. // osw.close();
    17. //写字符数组的一部分
    18. // char [] chars1 = {'a','c','d','b'} ;
    19. // osw.write(chars1,1,2);
    20. // osw.flush();
    21. // osw.close();
    22. //写字符串
    23. // osw.write("abcdefg");
    24. // osw.flush();
    25. // osw.close();
    26. //写字符串的一部分
    27. osw.write("abcdefg",1,4);
    28. osw.flush();
    29. osw.close();
    30. }
    31. }

    16-字符流读数据的2种方式

    1. import java.io.FileInputStream;
    2. import java.io.IOException;
    3. import java.io.InputStreamReader;
    4. public class FileDemo16 {
    5. public static void main(String[] args) throws IOException {
    6. InputStreamReader isr = new InputStreamReader(new FileInputStream("New\\src\\com\\learn\\java.txt")) ;
    7. //一次读取一个字符
    8. int len ;
    9. while((len=isr.read()) != -1){
    10. System.out.print((char)len);
    11. }
    12. //一次读取一组字符
    13. char [] bytes = new char[1024] ;
    14. int by ;
    15. while((by=isr.read(bytes)) != -1){
    16. System.out.println(new String(bytes,0,by));
    17. }
    18. isr.close();
    19. }
    20. }

    17-字符流复制文件

    1. import java.io.*;
    2. public class FileDemo17 {
    3. public static void main(String[] args) throws IOException {
    4. InputStreamReader isr = new InputStreamReader(new FileInputStream("New\\src\\com\\learn\\java.txt")) ;
    5. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("New\\src\\com\\my\\copy.txt")) ;
    6. //
    7. // //方法1:单个字符依次读写
    8. // int len ;
    9. // while ((len=isr.read()) != -1){
    10. // osw.write(len);
    11. // }
    12. // osw.close();
    13. //方法2:一组字符的读写
    14. int len ;
    15. char [] chars = new char[1024] ;
    16. while ((len = isr.read(chars)) != -1){
    17. osw.write(chars,0,len);
    18. }
    19. osw.close();
    20. isr.close();
    21. }
    22. }
    1. import java.io.FileReader;
    2. import java.io.FileWriter;
    3. import java.io.IOException;
    4. public class FileDemo18 {
    5. public static void main(String[] args) throws IOException {
    6. FileReader fr = new FileReader("New\\src\\com\\learn\\java.txt") ;
    7. FileWriter fw = new FileWriter("New\\src\\com\\my\\copy.txt") ;
    8. //一次读写一个字符
    9. // int len ;
    10. // while((len=fr.read()) !=-1){
    11. // fw.write(len);
    12. // }
    13. // fw.close();
    14. //一次写一组数据
    15. int len ;
    16. char [] chars = new char[1024] ;
    17. while((len=fr.read(chars)) != -1){
    18. fw.write(chars,0,len);
    19. }
    20. fr.close();
    21. fw.close();
    22. }
    23. }

    18-字符缓冲流复制文件

    1. import java.io.*;
    2. public class FileDemo19 {
    3. public static void main(String[] args) throws IOException {
    4. BufferedReader br = new BufferedReader(new FileReader("New\\src\\com\\learn\\java.txt")) ;
    5. BufferedWriter bw = new BufferedWriter(new FileWriter("New\\src\\com\\my\\copy.txt")) ;
    6. //一次读写一个字符
    7. // int len ;
    8. while((len=br.read()) != -1){
    9. bw.write(len);
    10. }
    11. br.close();
    12. bw.close();
    13. //一次写一组字符
    14. int len ;
    15. char [] chars = new char[1024] ;
    16. while((len=br.read(chars)) != -1){
    17. bw.write(chars,0,len);
    18. }
    19. bw.close();
    20. br.close();
    21. }
    22. }

    19-使用字符缓冲流特有功能复制文件

    1. import java.io.*;
    2. public class FileDemo20 {
    3. public static void main(String[] args) throws IOException {
    4. BufferedReader br = new BufferedReader(new FileReader("New\\src\\com\\learn\\java.txt")) ;
    5. BufferedWriter bw = new BufferedWriter(new FileWriter("New\\src\\com\\my\\copy.txt")) ;
    6. String line ;
    7. while ((line=br.readLine()) != null){
    8. bw.write(line);
    9. bw.newLine();
    10. bw.flush();
    11. }
    12. bw.close();
    13. br.close();
    14. }
    15. }

    20-集合数据传入文件

    1. import java.io.BufferedWriter;
    2. import java.io.FileWriter;
    3. import java.io.IOException;
    4. import java.util.ArrayList;
    5. public class FileDemo21 {
    6. public static void main(String[] args) throws IOException {
    7. ArrayList arrayList = new ArrayList<>() ;
    8. arrayList.add("Java") ;
    9. arrayList.add("python");
    10. arrayList.add("c");
    11. BufferedWriter bw = new BufferedWriter(new FileWriter("New\\src\\com\\learn\\java.txt"));
    12. for(String s : arrayList){
    13. bw.write(s);
    14. bw.newLine();
    15. bw.flush();
    16. }
    17. bw.close();
    18. }
    19. }

    21-文件数据读入集合

    1. import java.io.BufferedReader;
    2. import java.io.FileReader;
    3. import java.io.IOException;
    4. import java.util.ArrayList;
    5. public class FileDemo22 {
    6. public static void main(String[] args) throws IOException {
    7. BufferedReader br = new BufferedReader(new FileReader("New\\src\\com\\learn\\java.txt")) ;
    8. ArrayList arrayList = new ArrayList<>() ;
    9. String line ;
    10. while((line = br.readLine()) != null){
    11. arrayList.add(line);
    12. }
    13. for(String str : arrayList){
    14. System.out.println(str);
    15. }
    16. }
    17. }

    22-复制单级文件夹(目录含文件,不含目录)

    1. import java.io.*;
    2. public class FileDemo23 {
    3. /**
    4. * 有2个问题需要注意
    5. * 第一,该方法只能复制单级文件,即目录里不能含有目录,只能含有文件
    6. * 第二,对于源路径和目标路径一定要具体到文件名,否则会拒绝访问
    7. * @param args
    8. * @throws IOException
    9. */
    10. public static void main(String[] args) throws IOException {
    11. File srcFile = new File("D:\\files") ;
    12. File destFile = new File("New\\src\\com\\my\\",srcFile.getName()) ;
    13. if(!destFile.exists()){
    14. destFile.mkdir() ;
    15. }
    16. for(File files : srcFile.listFiles()){
    17. String name = files.getName() ;
    18. File newFile = new File(destFile,name) ;
    19. copyFiles(files,newFile) ;
    20. }
    21. }
    22. private static void copyFiles(File srcFile, File newFile) throws IOException {
    23. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile)) ;
    24. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile)) ;
    25. byte [] bytes = new byte[1024] ;
    26. int len ;
    27. while((len=bis.read(bytes)) != -1){
    28. bos.write(bytes,0,len);
    29. }
    30. bis.close();
    31. bos.close();
    32. }
    33. }

    23-复制多级文件夹(目录中包含目录和文件)

    1. import java.io.*;
    2. public class FileDemo24 {
    3. public static void main(String[] args) throws IOException {
    4. File srcFile = new File("D:\\file") ;
    5. File destFile = new File("New\\src\\com\\my") ;
    6. copyFolder(srcFile,destFile) ;
    7. }
    8. private static void copyFolder(File srcFile, File destFile) throws IOException {
    9. //从源目录复制到目标目录
    10. if(srcFile.isDirectory()){
    11. File newFile = new File(destFile,srcFile.getName()) ;
    12. if(!newFile.exists()){
    13. newFile.mkdir() ;
    14. }
    15. for(File file : srcFile.listFiles()){
    16. copyFolder(file,newFile);
    17. }
    18. }else{ //是文件,直接复制
    19. File newFile = new File(destFile,srcFile.getName()) ;
    20. copyFile1(srcFile,newFile);
    21. }
    22. }
    23. private static void copyFile1(File srcFile, File newFile) throws IOException {
    24. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile)) ;
    25. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile)) ;
    26. int len ;
    27. byte [] bytes = new byte[1024] ;
    28. while((len=bis.read(bytes)) != -1){
    29. bos.write(bytes,0,len);
    30. }
    31. bis.close();
    32. bos.close();
    33. }
    34. }

    24-复制文件的异常处理(try---catch代替throws)

    1. import java.io.FileReader;
    2. import java.io.FileWriter;
    3. import java.io.IOException;
    4. public class FileDemo25 {
    5. public static void main(String[] args) {
    6. method1() ;
    7. method2() ;
    8. }
    9. //方法1:直接进行try-catch处理异常
    10. private static void method1() {
    11. FileReader fr = null;
    12. FileWriter fw = null;
    13. try {
    14. fr = new FileReader("New\\src\\com\\learn\\java.txt");
    15. fw = new FileWriter("New\\src\\com\\my\\copy1.txt");
    16. int len ;
    17. char [] chars = new char[1024] ;
    18. while((len=fr.read(chars)) != -1){
    19. fw.write(chars,0,len);
    20. }
    21. }catch (IOException e){
    22. e.printStackTrace();
    23. }finally {
    24. try {
    25. if (fr != null) {
    26. fr.close();
    27. }
    28. }catch (IOException e){
    29. e.printStackTrace();
    30. }
    31. try {
    32. if (fw != null) {
    33. fw.close();
    34. }
    35. }catch (IOException e){
    36. e.printStackTrace();
    37. }
    38. }
    39. }
    40. //改进版本的异常处理
    41. private static void method2() {
    42. try(
    43. FileReader fr = new FileReader("New\\src\\com\\learn\\java.txt");
    44. FileWriter fw = new FileWriter("New\\src\\com\\my\\copy2.txt");) {
    45. int len ;
    46. char [] chars = new char[1024] ;
    47. while((len=fr.read(chars)) != -1){
    48. fw.write(chars,0,len);
    49. }
    50. }catch (IOException e){
    51. e.printStackTrace();
    52. }
    53. }
    54. }

    25-对象序列化流与对象反序列化流

    1. import java.io.Serializable;
    2. public class Student implements Serializable {
    3. private String name ;
    4. private int age ;
    5. public Student() {
    6. }
    7. public Student(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. }
    1. import java.io.*;
    2. public class FileDemo26 {
    3. public static void main(String[] args) throws IOException, ClassNotFoundException {
    4. //对象序列化流
    5. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("New\\src\\com\\my\\c.txt")) ;
    6. Student student = new Student("张三", 18) ;
    7. oos.writeObject(student);
    8. oos.close();
    9. //对象反序列化流
    10. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("New\\src\\com\\my\\c.txt")) ;
    11. Object object = ois.readObject() ;
    12. Student student1 = (Student) object ;
    13. System.out.println(student1.getName() + "," + student1.getAge());
    14. }
    15. }

    26-序列化中的serialVersionUID和transient

    1. import java.io.Serializable;
    2. public class Student implements Serializable {
    3. //加入序列化后修改类文件,会报错,需要加一个版本号
    4. private static final long serialVersionUID = 42L ;
    5. private transient String name ; //给变量加transient关键字,可以不被序列化
    6. private int age ;
    7. public Student() {
    8. }
    9. public Student(String name, int age) {
    10. this.name = name;
    11. this.age = age;
    12. }
    13. public String getName() {
    14. return name;
    15. }
    16. public void setName(String name) {
    17. this.name = name;
    18. }
    19. public int getAge() {
    20. return age;
    21. }
    22. public void setAge(int age) {
    23. this.age = age;
    24. }
    25. @Override
    26. public String toString() {
    27. return "Student{" +
    28. "name='" + name + '\'' +
    29. ", age=" + age +
    30. '}';
    31. }
    32. }
    1. import java.io.*;
    2. public class FileDemo26 {
    3. public static void main(String[] args) throws IOException, ClassNotFoundException {
    4. //对象序列化流
    5. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("New\\src\\com\\my\\c.txt")) ;
    6. Student student = new Student("张三", 18) ;
    7. oos.writeObject(student);
    8. oos.close();
    9. //对象反序列化流
    10. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("New\\src\\com\\my\\c.txt")) ;
    11. Object object = ois.readObject() ;
    12. Student student1 = (Student) object ;
    13. System.out.println(student1.getName() + "," + student1.getAge());
    14. }
    15. }
  • 相关阅读:
    RabbitMQ系列【2】核心概念
    【入门篇】UML-FlowChat流程图
    全志A33使用主线U-Boot
    基于SpringBoot招聘管理系统设计和实现(源码+LW+调试文档+讲解等)
    计算机二级WPS 选择题(模拟和解析十三)
    JavaWeb文件上传/下载(Servlet)
    【网络篇】如何给虚拟机添加网卡,设置固定ip
    【Spark】计算LSH引入新jar包-LinkedInAttic ScANNS
    PBR系列-物理材质(上)
    02_SpringSecurity学习之多种配置共存
  • 原文地址:https://blog.csdn.net/nuist_NJUPT/article/details/126184758