Java IO流全面教程

此笔记来自于B站黑马程序员

File

创建对象

image-20241005222459829

public class FileTest1 {public static void main(String[] args) {// 1.创建一个 File 对象,指代某个具体的文件// 路径分隔符// File f1 = new File("D:/resource/ab.txt");// File f1 = new FIle("D:\\resource\\ab.txt");File f1 = new File(pathname: "D:" + File.separator + "resource" + File.separator + "ab.txt");System.out.println(f1.length()); //文件大小File f2 = new File("D:/resource");System.out.println(f2.length());// 注意: File 对象可以代指一个不存在的文件路径File f3 = new File("D:/resource/aaaa.txt");System.out.println(f3.length());System.out.println(f3.exists()); // false/ **我现在要定位的文件是在模块中,应该怎么定位呢?绝对路径:带盘符的File f4 = new File("D:\\code\\javasepromax\\file-io-app\\src\\itheima.txt");相对路径(重点):不带盘符,默认是直接去工程下寻找文件的*/   File f4 = new File("file-io-app\\src\\itheima.txt");}
}
  • File对象既可以代表文件、也可以代表文件夹。
  • File封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许是不存在的。

image-20241005225438100

常用方法1:判断文件类型、获取文件信息

image-20241005223959659

就不演示代码了,Java 有一个很好的优势,即见名知意思

常用方法2:创建文件、删除文件

/***
** 目标:掌握 File 的创建和删除文件相关的
**/
public class FileTest3 {public static void main(String[] args) {// 1.public boolean createFile(); 创建一个新文件(文件内容为空), 创建成功返回true, 反之File f1 = new File("D:/resurce/itheima2.txt");System.out.println(f1.createNewFile());// 2.public boolean mkdir(); 用于创建文件夹,注意:只能创建一级文件夹File f2 = new File("D:/resource/aaa");System.out.println(f2.mkdir());// 3.public boolean mkdirs() 用于创建文件夹,注意;可以创建多级文件夹File f3 = new File("D:/resource/bbb/ccc/ddd/eee/fff/ggg");System.out.println(f3.mkdirs());// 4.public boolean delete() 删除文件,或者空文件,注意:不能删除非空文件夹System.out.println(f1.delete());System.out.println(f2.delete());File f4 = new File("D:/resource");System.out.println(f4.delete());}
}

delete方法默认只能删除文件和空文件夹,删除文件后的文件不会进入回收站

常用方法3:遍历文件夹

public class FilleTest4 {public static void main(String[] args) {// 1. public String[] list(): 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回"File f1 = new File("D:/course/带研发内容");String[] names = f1.list();for (String name : names) {System.out.println(name);}// 2 public File[] listFiles(): (重点)获取当前目录下所有的“一级文件对象"到一个文件对象数组中去返回(重点)File f = new File("D:/resource/aaa");File[] files1 = f.listFiles();System.out.println(Arrays.toString(files1));}
}
使用 listFiles 方法时的注意事项:
  • 当主调是文件,或者路径不存在时,返回null
  • 当主调是空文件夹时,返回一个长度为0的数组
  • 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
  • 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
  • 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null

前置知识:方法递归

什么是方法递归?

递归是一种算法,在程序设计语言中广泛应用。

从形式上说:方法调用自身的形式称为方法递归(recursion)

递归的形式

直接递归:方法自己调用自己。

间接递归:方法调用其他方法,其他方法又回调方法自己。

使用方法递归时需要注意的问题:

递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出错误。

文件搜素

image-20241005231038801

package com.itheima.d2_recursionimport java.io.File;public class RecursionTest3 {public static void main(String[] args) {searchFile(new File("D:/"), "QQ.exe");}/*** 去目录下搜索某个文件* @param dir 目录* @param fileName 要搜索的文件名称*/public static void searchFile(File dir, String fileName) {// 1.把非法的情况都拦截住if (dir == null || !dir.exists() || dir.isFile()) {reutrn;}// 2.dir不是null,存在,一定是目录对象// 获取当前目录下的全部一级文件对象File[] files = dir.listFiles();// 3. 判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象if (files != null && files.length > 0) {// 4.遍历全部一级文件对象for (File f : files) {if (f.isFile()) {if (f.getName().contains(fileName)) {System.out.println("找到了: " + f.getAbsolutePath());}} else {searchFile(f, fileName);   }}}}
}

前置知识:字符集

image-20241006002947388

image-20241006003403394

image-20241006003517166

image-20241006003531605

image-20241006134415217

本节要点
  • ASCI字符集:只有英文、数字、符号等,占1个字节。
  • GBK字符集:汉字占2个字节,英文、数字占1个字节。
  • UTF-8字符集:汉字占3个字节,英文、数字占1个字节。

注意1:字符编码时使用的字符集,和解码时使用的字符集必须一致,**否则会出现乱码 **⚠️

注意2:英文,数字一般不会乱码,因为很多字符集都兼容了 ASCII 编码。 ⚠️

image-20241006134944825

import java.util.Arrays;public class Test {public static void main(String[] args) throws Exception {// 1.编码String data = "a我b";byte[] bytes = data.getBytes(); // 默认是按照平台字符集 (UTF-8) 进行编码的System.out.println(Arrays.toString(bytes));// 按照指定字符集进行编码byte[] bytes1 = data.getBytes("GBK");System.out.println(Arrays.toString(bytes1));// 2.解码String s1 = new String(bytes);System.out.println(s1);String s2 = new String(bytes1, "GBK");System.out.println(s2);}
}

IO 流

image-20241006140113709

IO 流的应用场景

image-20241006140335209

IO 流概述

image-20241006140806697

IO流-字节流

文件字节输入流:每次读取一个字节(FileInputStream)

image-20241006141529213

public class FileInputStreamTest1 {public static void main(String[] args) throws Exception {// 1. 创建文件字节输入流管道,与源文件接通// InpustStream is = new FileInputStream(new File("file-io-app\\src\\itheima01.txt"));// 简化写法,推荐使用InputStream is = new FileInputStream(("file-io-app\\src\\itheima01.txt"));// 2.开始读取文件的字节数据// public int read(); 每次读取一个字节返回,如果没有数据了,返回-1//  int b1 = is.read();//  System.out.println((char)b1);//   //   int b2 = is.read();//   System.out.println((char) b2);//   int b3 = is.read();//  System.out.println(b3);int b;while ((b = is.read()) != -1) {System.out.print((char) b);}// 读取的性能很差// 读取汉字会乱码// 流使用完毕后,必须关闭,释放系统资源is.close();}
}
public class FileInputStreamTest1 {public static void main(String[] args) throws Exception {// 1. 创建文件字节输入流管道,与源文件接通// InpustStream is = new FileInputStream(new File("file-io-app\\src\\itheima01.txt"));// 简化写法,推荐使用InputStream is = new FileInputStream(("file-io-app\\src\\itheima01.txt"));// 2.开始读取文件的字节数据: 每次读取多个数据// public int read(byte b[]) throws IOException// 每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回 -1byte[] buffer = new byte[3];int len = is.read(buffer);String rs = new String(buffer);System.out.println(rs);System.out.println("当次读取的字节数量: " + len);// buffer = [abc]// buffer = [66c]int len2 = is.read(buffer);// 注意:读取多少,倒出多少String rs2 = new String(buffer, 0, len2);System.out.println(rs2);System.out.println("当次读取的字节数量: " + len2);int len3 = is.read(buffer);System.out.println(len3); // -1is.close();}
}

文件字节输入流:每次读取多个字节 (FileOutputStream)

public class FileInputStreamTest1 {public static void main(String[] args) throws Exception {// 1. 创建文件字节输入流管道,与源文件接通// InpustStream is = new FileInputStream(new File("file-io-app\\src\\itheima01.txt"));// 简化写法,推荐使用InputStream is = new FileInputStream(("file-io-app\\src\\itheima01.txt"));byte[] buffer = new byte[3];int len; // 记住每次读取了多少个字节。abc 66while ((len = is.read(buffer)) != -1) {// 注意:读取多少,倒出多少String rs = new String(buffer, 0, len);System.out.print(rs);}// 性能得到了明显的提升!!// 这种方案也不能避免读取汉字输出乱码的问题!!is.close(); // 关闭流}
}

文件字节输入流:一次读取完全部字节 (FileReader)

文件字节输入流:一次读取完全部字节
  • 方式一: 自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节。
  • image-20241006145641914
public class FileInputStreamTest1 {public static void main(String[] args) throws Exception {// 1. 创建文件字节输入流管道,与源文件接通// InpustStream is = new FileInputStream(new File("file-io-app\\src\\itheima01.txt"));// 简化写法,推荐使用InputStream is = new FileInputStream(("file-io-app\\src\\itheima01.txt"));// 2.准备一个字节数组,大小与文件的大小正好是一样大File f = new File("file-io-app\\src\\itheima03.txt");long size = f.length();byte[] buffer = new byte[(int)size];int len = is.read(buffer);System.out.println(new String(buffer));System.out.println(size);System.out.println(len);is.close(); // 关闭流}
}
方式二:Java官方为lnputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。

image-20241006150532012

public class FileInputStreamTest1 {public static void main(String[] args) throws Exception {// 1. 创建文件字节输入流管道,与源文件接通// InpustStream is = new FileInputStream(new File("file-io-app\\src\\itheima01.txt"));// 简化写法,推荐使用InputStream is = new FileInputStream(("file-io-app\\src\\itheima01.txt"));byte[] buffer = is.readAllBytes();System.out.println(new String(buffer));is.close(); // 关闭流}
}
总结

image-20241006150614013

文件字节输出流:写字节出去 (FileWriter)

作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。

image-20241006151008372

public class FileOutputStreamTest4 {public static void main(String[] args) throws Exception {//1、创建一个字节输出流管道与目标文件接通。//覆盖管道:覆盖之前的数据// OutputStream os =//     new File0utputStream("file-io-app/src/itheima04out.txt");//追加数据的管道OutputStream os =new File0utputStream(name:"file-io-app/src/itheima04out.txt", append:true);//2、开始写字节数据出去了os.write(97); //97 就是一个字节,代表 aos.write('b'); //‘b'也是一个字节//os.write('磊');//[ooo]默认只能写出去一个字节byte[] bytes = "我爱你中国abc".getBytes();os.write(bytes);os.write(bytes, off:0, len:15);os.close()//关闭流}
}

案例:文件复制

image-20241006152027887

public class FileOutputStreamTest4 {public static void main(String[] args) throws Exception {// 复制文件InputStream is = new FileInputStream("file-io-app\\src\\itheima03.txt");// 2.创建一个字节输出流管道与目标文件接通OutputStream os = new FileOutputStream("file-io-app\\src\\itheima03copy.txt");// 1024 * 1024 + 6;// 3.创建要给字节数组,负责转移字节数组byte[] buffer = new byte[1024]; // 1kbint lne;while ((len == is.read(buffer)) != -1) {os.write(buffer, 0, len);}os.close();is.close();System.out.println("复制完成!!!");}
}

IO流-资源释放方式

  • finally 代码区的特点:无论 try 中的程序是正常执行了,还是出现了异常,最后都一定会执行 finally区,除非JVM终止。

作用:一般用于在程序执行完成后进行资源的释放操作**(专业级做法)。**

public class Test1 {public static void main(String[] args) {try {System.out.println(10 / 0);} catch (Exception e) {e.printStackTrace();} finally {System.out.println("===finally执行了一次===");}}public static int chu(int a, int b) {try {return a / b;} catch (Exception e) {return -1;} finally {// 千万不要在 finally 中返回数据(会覆盖之前return的语句)return 111;}}
}
public class FileOutputStreamTest4 {public static void main(String[] args) throws Exception {InputStream is = null;OutputStream os = null;// 复制文件try {System.out.println(10 / 0);is = new FileInputStream("file-io-app\\src\\itheima03.txt");// 2. 创建一个字节输出流管道与目标文件接通os = new FileOutputStream("file-io-app\\src\\itheima03copy.txt");// 制作一个错误System.out.println(10 / 0);// 3. 创建要给字节数组,负责转移字节数组byte[] buffer = new byte[1024]; // 1KB// 4. 从字节输入流中读取字节数据,写出去到字节输出流中。读多少写出去多少。int lne; // 记住每次读取了多少个字节while ((len == is.read(buffer)) != -1) {os.write(buffer, 0, len);}System.out.println("复制完成!!!");} catch(IOException e) {e.printStackTrace();} finally {if (os != null) os.close();if(is != null) is.close();}}
}

image-20241006160922550

JDK7 开始提供了更简单的资源释放方案:try-with-resource****

image-20241006161003253

该资源使用完毕后,会自动调用其 close()方法,完成对资源的释放!

public class FileOutputStreamTest4 {public static void main(String[] args) throws Exception {// 复制文件try ( InputStream is = new FileInputStream("file-io-app\\src\\itheima03.txt");// 2. 创建一个字节输出流管道与目标文件接通OutputStream os = new FileOutputStream("file-io-app\\src\\itheima03copy.txt");){            System.out.println(10 / 0);// 制作一个错误// 3. 创建要给字节数组,负责转移字节数组byte[] buffer = new byte[1024]; // 1KB// 4. 从字节输入流中读取字节数据,写出去到字节输出流中。读多少写出去多少。int lne; // 记住每次读取了多少个字节while ((len == is.read(buffer)) != -1) {os.write(buffer, 0, len);}System.out.println("复制完成!!!");} catch(IOException e) {e.printStackTrace();} }
}
public class MyConnection implements AutoCloseable {@Overridepublic void close() throws Exception {System.out.println("释放了与某个硬件的链接资源~~~~");}
}
  • () 中只能放置资源,否则报错
  • 什么是资源呢?
  • 资源一般指的是最终实现了 AutoCloseable 接口。
  • public abstract class InputStream implements Closeable { }
  • public abstract class OutputStream implements Closeable, Flushable { }
  • public interface Closeable extends AutoCloseable { }

IO 流-字符流(字节流:适合复制文件等,不适合读写文本文件)

文件字符输入流(FileReader)-读字符数据进来

image-20241006162637865

image-20241006162730811

public class itcasttest2 {public static void main(String[] args) {try (// 1.创建一个文件字符输入流管道与源文件接通Reader fr = new FileReader("io-app2\\src\\itheima01.txt");) {char[] buffer = new char[3];int len; // 记住每次读取了多少字符while ((len = fr.read(buffer)) != -1) {// 读取多少倒出多少System.out.print(new String(buffer, 0, lent));}// 性能是比较不错的} catch (Exception e) {e.printStackTrace();}}
}

文件字符输出流(FileWriter)-写字符数据出去

image-20241006163819987

image-20241006163900254

public class test3 {public static void main(String[] args) {try {( // 0.创建一个文件输出流管道与目标文件接通// 覆盖管道// Writer fw = new FileWriter("io-app2/src/itheima02out.txt");Writer fw = new FileWriter("io-app2/src/itheima02out.txt", true)){// 1.public void write(int c)写一个字符出去fw.write('a');fw.write(97);fw.write('磊');fw.write("\r\n"); //换行(可兼容性好)// 2.public void write(String c) 写一个字符串出去fw.write("我爱你中国abc");fw.write("\r\n");// 3.public void write(String c, int pos, int len) 写字符串的一部分出去fw.write("我爱你中国abc", 0, 5);fw.write("\r\n");// 4. public void write(char[] buffer): 写一个字符数组出去char[] buffer = {'黑''马', 'a', 'b', 'c'};fw.write(buffer);fw.write("\r\n");fw.close();}}}
}
**字符输出流写出数据后,必须刷新流,或者关闭流,**写出去的数据才能生效 ⚠️

image-20241006165421514

IO 流-缓冲流

image-20241006170037134

字节缓冲流

提高字节流读写数据的性能

image-20241006170415695

image-20241006170630810

public class BufferInputStreamTest1 { public static void main(String[] args)) {tyr (InputStream is = new FileInputStream("io-app2/src/itheima01.txt");// 1.定义一个字节缓冲输入流包装原始的字节输入流InputStream bis = new BufferedInputStream(is);OutputStream os = new FileOutputStream("io-app2/src/itheima01_back.txt");// 2.定义一个字节缓冲输出流包装原始的字节输出流OutputStream bos = new BufferedOutputStream(os);) {byte[] buffer = new byte[1024];int len;while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len);}System.out.println("复制完成!!");} catch (Exception e) {e.printStackTrace();}}
}

字符缓冲流

字符缓冲输入流(BufferedReader)

作用:自带 8K(8192)的字符缓冲池,可以提高字符输入流读取字符数据的性能。

image-20241006171450175

public class BufferedReaderTest2 {public static void main(String[] args) {try (Reader fr = new FileReader("io-app2\\src\\itheima02.txt");// 创建一个字符缓存输入流包装原始的字符输入流BufferedReader br = new BufferedReader(fr);) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch(Exception e) {e.printStackTrace();}}
}
字符缓冲输出流(BufferedWriter)

image-20241006172337012

public class BufferedWriterTest3 {public static void main(String[] args) {try (Writer fw = new FileWriter("io-app2/src/itheimao5out.txt", true);BufferWriter bw = new BufferedWriter(fw);) {bw.write('a');bw.write(97);bw.write('磊');bw.newLine();bw.write("我爱你中国abc");bw.newLine();} catch (Exception e) {e.printStackTrace();}}
}

原始流、缓冲流的性能分析[重点]

测试用例:

分别使用原始的字节流,以及字节缓冲流复制一个很大视频。

测试步骤:
使用低级的字节流按照一个一个字节的形式复制文件。
使用低级的字节流按照字节数组的形式复制文件。
使用高级的缓冲冲字节流按照一个一个字节的形式复制文件。
使用高级的缓冲字节流按照字节数组的形式复制文件。
public class TimeTest4 {private static final String SRC_FILE = "D:\\resource\\线程池.avi";private static final String DEST_FILE = "D:\\";public static void main(String[] args) {copy01(); //copy01();//低级字节流一个一个字节的赋值,慢的简直让人无法忍受,直接淘汰!copy02(); //低级的字节流流按照一个一个字节数组的形式复制,速度较慢!copy03(); // 缓冲流按照一个一个字节的形式复制,速度较慢copy04(); //缓冲流按照一个一个字节数组的形式复制,速度极快,推荐使用!}private static void copy01() {long startTime = System.currentTimeMillis();try (InputStream is = new FileInputStream(SRC_FILE);outputStream os = new FileOutputStream(DEST_FILE + "1.avi");) {int b;while ((b = is.read()) != -1) {os.write(b);}} catch (Exception e) {e.printStackTrace();}logn endTime = System.currentTimeMillis();System.out.println("低级字节流一个一个字节复制耗时: " + (endTime - startTime) / 1000.0);}private static void copy02() {long startTime = System.currentTimeMillis();try (InputStream is = new FIleInputStream(SRC_FILE);OutputStream os = new FIleOutputStream(DEST_FILE + "2.avi");) {byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1 ) {os.write(buffer, 0, len);}} catch (Exception e) {e.printStackTrace();}long endTime = System.currentTimeMIllis();System.out.println("低级字节流使用字节数组复制耗时: " + (endTime - startTime) / 1000.0 + "s");}private static void copy03() {long startTime = System.currentTimeMillis();try (InputStream is = new FileInputStream(SRC_FILE);BufferInputStream bis = new BufferInputStream(is);OutputStream os = new FileOutputStream(DEST_FILE + "1.avi");BufferOutputStream bos = new BufferOutputStream(os);) {int b;while ((b = is.read()) != -1) {bos.write(b);}} catch (Exception e) {e.printStackTrace();}logn endTime = System.currentTimeMillis();System.out.println("缓冲流一个一个字节复制耗时: " + (endTime - startTime) / 1000.0);}private static void copy04() {long startTime = System.currentTimeMillis();try (InputStream is = new FIleInputStream(SRC_FILE);BufferInputStream bis = new BufferInputStream(is);OutputStream os = new FIleOutputStream(DEST_FILE + "2.avi");BufferOutputStream bos = new BufferOutputStream(os);) {byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1 ) {bos.write(buffer, 0, len);}} catch (Exception e) {e.printStackTrace();}long endTime = System.currentTimeMIllis();System.out.println("低级字节流使用字节数组复制耗时: " + (endTime - startTime) / 1000.0 + "s");}
}

IO 流-转换流

  • 如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码!

  • 如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码!

引出问题:不同编码读取时会乱码

image-20241006182332362

字符输入转换流 (InputStreamReader)

解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。

image-20241006193522774

public class InputStreamReaderTest2 {public static void main(String[] args) {try (// 1.得到文件的原始字节流(GBK的字节流形式)InputStream is = new FileInputStream("io-app2/src/itheima06.txt");// 2.把原始的字节输入流按照指定的字符集编码转换成字符输入流Reader isr = new InputStreamReader(is, "GBK");// 3. 把字符输入流包装成缓冲字符输入流BufferedReader br = new BufferedReader(isr);) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (Exception e) {e.printStackTrace();}}
}

字符输出转换流(OutputStreamWrite)

image-20241006194807562

  • 解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。

image-20241006195948045

IO 流-打印流

image-20241006200704131

作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。

image-20241006201027313

import java.io.PrintStream;
imort java.nio.charset.Charset;public class PrintTest1 {public static void main(String[] args) {try (// 1. 创建一个打印流管道PrintStream ps = new PrintStream("io-app2/src/itheima08.txt", Charset.forName("GBK"));) {ps.println(97);ps.println('a');ps.println("我爱你中国abc");ps.println(true);ps.println(99.5);ps.write(97);} catch (Exception e) {e.printStackTrace();}}
}

PrintWriter

image-20241006201842873

PrintStream 和 PrintWriter 的区别
  • 打印数据的功能上是一模一样的:两者都是使用方便,性能高效 (核心优势)
  • PrintStream 继承自字节 输出流OutputStream,因此支持写字节数据的方法。
  • PrintWriter 继承自字符 输出流Writer,因此支持写字符数据出去。
public class PrintTest2 {public static void main(String[] args) {System.out.println("老骥伏枥");System.out.println("志在千里");try (PrintStream ps = new PrintStream("io-app2/src/itheima09.txt"); ) {// 把系统默认的打印流对象改成自己设置的打印流System.setOut(ps);System.out.println("烈士暮年");System.out.println("壮心不已");} catch (Exception e) {e.printStackTrace();}}
}

image-20241006203148059

IO 流-数据流

image-20241006204604982

image-20241006204433348

image-20241006204756408

import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;public class DataOutputStreamTest1 {public static void main(String[] args) {try (// 1. 创建一个数据输出流包装低级的字节输出流DataOutputStream dos = new DataOutputStream(new FileOutputStream("io-app2/src/itheima10out.txt"));) {dos.writeInt(97);dos.writeDouble(99.5);dos.writeBoolean(true);dos.writeUTF("黑马程序员666!");} catch (Exception e) {e.printStackTrace();}}
}
public class DataInputStreamTest2 {public static void main(String[] args) {try (DataTnputStream dis = new DataInputStream(new FileInputStream("io-app2/src/itheima10out.txt"));) {int i = dis.readInt();System.out.println(i);double d = dis.readDouble();System.out.println(d);boolean b = dis.readBoolean();System.out.println(b);String rs = dis.readUTF();System.out.println(rs);} catch (Exception e) {e.printStackTrace();}}
}

IO 流-序列化流

  • 对象序列化:把Java对象写入到文件中去
  • 对象反序列化:把文件里的java对象读出来

image-20241006211813361

可以把 Java 对象进行序列化:把 Java 对象存入到文件中去

注意:对象如果要参与序列化,必须实现序列化接口**(java.io.Serializable)**

image-20241006212130859

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;public class Test1ObjectOutputStream {public static void main(Stirng[] args) {try (// 2. 创建一个对象字节输出流包装原始的字节 输出流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io-app2/src/itheima11out.txt"));) {// 1.创建一个 Java 对象User u = new User("admin", "张三", 32, "666888xyz");// 3.序列化对象到文件中oos.writeObject(u);System.out.println("序列化对象成功!!");} catch(Exception e) {e.printStackTrace();}}
}

ObjectlnputStream(对象字节输入流)

可以把 Java 对象进行反序列化:把存储在文件中的 Java 对象读入到内存中来。

image-20241006213242956

public class Test20bjectInputStream {public static void main(String[] args) {try (ObjectInputStream ois  = new ObjectInputStream(new FileInputStream("io-app/src/itheima11out.txt"));) {User u = (User) ois.readObject();System.out.println(u);}catch (Exception e) {e.printStackTrace();}}
}

transient 这个成员变量将不参与序列化

image-20241006214212793

补充知识::IO 框架

什么是框架?
  • 解决某类问题,编写的一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的。
  • 好处:在框架的基础上开发,可以得到优秀的软件架构,并能提高开发效率。
  • 框架的形式:一般是把类、接口等编译成class形式,再压缩成一个.jar结尾的文件发行出去。

image-20241006214527615

什么是 IO 框架
  • 封装了 Java 提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。
Commons-io

Commons-io 是 apache开源基金组织 提供的一组有关 lO操作 的小框架,目的是 提高lO流 的开发效率。

image-20241006214655003

image-20241006215007477

建议用 Maven, 导入依赖就是爽啊.

public class CommonsTOTest1 {public static void main(String[] args) throws Exception {// FileUtils.copyFile(new File("io-app2\\src\\itheima01.txt"), new File("io-app2/src/a.txt"));// FileUtils.copyDirectory(new File("D:\\resource\\私人珍藏"), new File("D:\\resource\\私人珍藏3"));// FileUtils.deleteDirectory(new File("D:\\resource\\私人珍藏3"));// Java提供的原生的一行代码搞定很多事情Files.copy(Path.of("io-app2\\src\\itheima01.txt"), Path.of("io-app2\\src\\b.txt"));System.out.println(Files.readString(Path.of("io-app2\\src\\itheima01.txt"));}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs 构建高性能服务器的关键技术

nodejs 构建高性能服务器的关键技术 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 在现代 Web 开发中,Node.js 已成为构建高性能、可扩展网络应用的首选平台之一。它的非阻塞 I/O 模型与事件驱动架构使其能够在处理大量并发请求时表现出色&#xff0…

【C++11】新特性

前言: C11 是C编程语言的一个重要版本,于2011年发布。它带来了数量可观的变化,包含约 140 个新特性,以及对 C03 标准中约600个缺陷的修正,更像是从 C98/03 中孕育出的新语言 列表初始化 C11 中的列表初始化&#xff0…

【自用】王道文件管理强化笔记

文章目录 操作系统引导:磁盘初始化文件打开过程角度1文件的打开过程角度2 内存映射的文件访问 操作系统引导: ①CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机) ②)将磁盘的第一块–主引导记录读入内存&…

谷粒商城のRabbitMQ基础篇

文章目录 前言一、Rabbit MQ简介1、基本概念2、组件架构 二、使用步骤1.引入依赖2.application.properties3、docker 安装Rabbit MQ3、使用案例3.1、定义队列3.2、定义交换机3.3、绑定3.4、发送消息3.5、接受消息3.5、自定义消息序列化方式3.6、演示Fanout 交换机模式3.7、演示…

Vue基础(二)

计算属性与监视姓名案例 插值语法实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>姓名案例&l…

用人工智能写作:专业作家利用 ChatGPT 的五种方式 ✍️

用人工智能写作&#xff1a;专业作家利用 ChatGPT 的五种方式 &#x1f3a8;✍️ 在写作领域&#xff0c;人工智能工具如 ChatGPT 正逐渐成为作家们的得力助手。它不仅帮助优化文本&#xff0c;还能激发灵感、完善叙事结构&#xff0c;甚至推动创新。本文将通过五个具体案例&a…

【微服务】服务注册与发现 - Eureka(day3)

CAP理论 P是分区容错性。简单来说&#xff0c;分区容错性表示分布式服务中一个节点挂掉了&#xff0c;并不影响其他节点对外提供服务。也就是一台服务器出错了&#xff0c;仍然可以对外进行响应&#xff0c;不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述&…

实验4 循环结构

1、判断素数 【问题描述】从键盘输入一个大于1的正整数&#xff0c;判断是否为素数 【输入形式】输入一个正整数 【输出形式】输出该数是否为素数 【样例输入】10 【样例输出】10 is not a prime number 【样例说明】样例2 输入&#xff1a;-10 输出&#xff1a;error! #de…

jmeter学习(7)beanshell

beanshell preprocessor 发送请求前执行 beanshell postprocessor 发送请求前执行 获取请求相关信息 String body sampler.getArguments().getArgument(0).getValue(); String url sampler.getPath(); 获取响应报文 String responseprev.getResponseDataAsString(); 获…

北京自闭症寄宿学校大盘点:优质教育资源汇总

北京自闭症寄宿学校大盘点&#xff1a;优质教育资源中的璀璨明珠——兼谈广州星贝育园 在北京&#xff0c;随着社会对自闭症儿童教育的日益重视&#xff0c;越来越多的优质寄宿学校应运而生&#xff0c;为这些特殊的孩子提供了专业的康复与教育环境。然而&#xff0c;当我们把…

【数据结构】【链表代码】随机链表的复制

/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/typedef struct Node Node; struct Node* copyRandomList(struct Node* head) {if(headNULL)return NULL;//1.拷贝结点&#xff0c;连接到原结点的后面Node…

猫头虎深度解读:过去2周,AI领域的十大突破事件与未来展望

猫头虎深度解读&#xff1a;过去2周&#xff0c;AI领域的十大突破事件与未来展望 &#x1f680;&#x1f916; 大家好&#xff0c;我是猫头虎技术团队的代表&#xff01;这两周&#xff0c;人工智能领域再次掀起了技术与应用的新浪潮。从立法到技术进展&#xff0c;再到前沿应…

初始爬虫12(反爬与反反爬)

学到这里&#xff0c;已经可以开始实战项目了&#xff0c;多去爬虫&#xff0c;了解熟悉反爬&#xff0c;然后自己总结出一套方法怎么做。 1.服务器反爬的原因 服务器反爬的原因 总结&#xff1a; 1.爬虫占总PV较高&#xff0c;浪费资源 2.资源被批量抓走&#xff0c;丧失竞争力…

交叉熵的数学推导和手撕代码

交叉熵的数学推导和手撕代码 数学推导手撕代码 数学推导 手撕代码 import torch import torch.nn.functional as F# 二元交叉熵损失函数 def binary_cross_entropy(predictions, targets):# predictions应为sigmoid函数的输出&#xff0c;即概率值# targets应为0或1的二进制标…

MathType软件7.7最新版本下载安装教程+使用深度评测

嘿&#xff0c;各位亲爱的朋友们&#xff01;&#x1f44b; 今天我要来给大家安利一个神器——MathType软件&#xff01;&#x1f389; 如果你是一位学生、老师或者需要经常和数学公式打交道的科研工作者&#xff0c;那这个软件绝对是你的不二选择&#xff01;&#x1f60e; M…

ctf.bugku-备份是个好习惯

访问页面得到字符串 这串字符串是重复的&#xff1b; d41d8cd98f00b204e9800998ecf8427e 从前端、源码上看&#xff0c;除了这段字符串&#xff0c;没有其他信息&#xff1b;尝试解密&#xff0c;长度32位&#xff1b;各种解密方式试试&#xff1b; MD5免费在线解密破解_MD5在…

市面上8款AI论文大纲一键生成文献的软件推荐

在当前的学术研究和写作领域&#xff0c;AI论文大纲自动生成软件已经成为提高写作效率和质量的重要工具。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。本文将分享市面上8款AI论文大纲一键生成文献的软件&#xff0c;并特别推…

[git] github管理项目之环境依赖管理

导出依赖到 requirements.txt pip install pipreqs pipreqs . --encodingutf8 --force但是直接使用pip安装不了torch&#xff0c;需要添加源&#xff01;&#xff01; pip install -r requirements.txt -f https://download.pytorch.org/whl/torch_stable.htmlpython 项目中 …

Stable Diffusion绘画 | AI 图片智能扩充,超越PS扩图的AI扩图功能(附安装包)

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

【数据结构】【链表代码】移除链表元素

移除链表元素 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val) { // 创建一个虚拟头节点&#xff0c;以处理头节点可能被删除的情况 struct…