当前位置: 首页 > news >正文

简单了解java中的File类

1、File类

1.1、概述

File对象就表示一个路径,可以是文件路径也可以是文件夹路径,这个路径可以 是存在的,也可以是不存在的

1.2、常见的构造方法

方法名称说明
public File(String pathname)根据文件路径创建文件对象
public File(String parent, String child)根据父路径名字符串和子路径名字符串创建文件对象
public File(File parent, String child)根据父路径对应文件对象和子路径名字字符串创建文件对象

示例:

public class Test {public static void main(String[] args) {//根据文件路径创建文件对象String url1 = "D:\\实习\\笔记\\Java\\md\\File类\\md\\File.md";File file1 = new File(url1);System.out.println(file1);//根据父路径名字符串和子路径名字符串创建文件对象String parent = "D:\\实习\\笔记\\Java\\md\\File类\\md";//父级路径String child = "File.md";//子级路径File file2 = new File(parent, child);System.out.println(file2);//根据父路径对应文件对象和子路径名字字符串创建文件对象File par = new File("D:\\实习\\笔记\\Java\\md\\File类\\md");File file3 = new File(par, child);System.out.println(file3);}
}

补充:

  • 绝对路径:带盘符
  • 相对路径:不带盘符,默认到当前项目找

1.3、File中常见的成员方法

1.3.1、判断、获取

成员方法名称说明
public boolean isDrectory()判断此路径名表示的File是否为文件夹
public boolean isFile()判断此路径名表示的File是否为文件
public boolean exists()判断此路径名表示的File是否存在
public long length()返回文件的大小(字节数量)
public String getAbsolutePath()返回文件的绝对路径
public String getPath()返回定义文件时使用的路径
public String getName()返回文件的名称(带后缀)
public long lastModified()返回文件最后修改的时间(毫秒值)

判断示例:

public class Test1 {public static void main(String[] args) {//对一个文件路径进行判断String url1 = "D:\\实习\\笔记\\Java\\md\\File类\\md\\File.md";File file1 = new File(url1);System.out.println(file1.isDirectory());System.out.println(file1.isFile());System.out.println(file1.exists());System.out.println("----------------------------------");//对一个文件夹进行判断String url2 = "D:\\实习\\笔记\\Java\\md\\File类\\md";File file2 = new File(url2);System.out.println(file2.isDirectory());System.out.println(file2.isFile());System.out.println(file2.exists());System.out.println("----------------------------------");//对一个不存在的文件进行判断String url3 = "D:\\实习\\笔记\\Java\\md\\File类\\md\\file.txt";File file3 = new File(url3);System.out.println(file3.isDirectory());System.out.println(file3.isFile());System.out.println(file3.exists());}
}

结果展示:

false
true
true
----------------------------------
true
false
true
----------------------------------
false
false
false

获取示例:

public class Test2 {public static String url = "D:\\实习\\笔记\\Java\\md\\File类\\md\\File.md";public static void main(String[] args) {File file = new File(url);//获取一个文件大小System.out.println("文件的大小为" + file.length() + "个字节");//获取一个文件的绝对路径System.out.println("文件的绝对路径是:" + file.getAbsoluteFile());//获取一个文件的定义时的路径System.out.println("定义文件时的路径是:" + file.getPath());//返回一个文件的名字System.out.println("文件的名字是:" + file.getName());//返回一个文件最后修改的时间DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String date = dateFormat.format(new Date(file.lastModified()));System.out.println("最后一次修改文件是在:" + date);}
}

结果展示:

文件的大小为4318个字节
文件的绝对路径是:D:\实习\笔记\Java\md\File类\md\File.md
定义文件时的路径是:D:\实习\笔记\Java\md\File类\md\File.md
文件的名字是:File.md
最后一次修改文件是在:2024061309:30:05

1.3.2、创建和删除

成员方法名称说明
public boolean createNewFile()创建一个新的文件夹
public boolean mkdir()创建单级文件夹
public boolean mkdirs()创建多级文件夹
public boolean delete()删除文件、空文件夹

注意:delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站

创建和删除示例:

public class Test {public static void main(String[] args) throws IOException {//创建一个新的文件//如果当前路径表示的文件是不存在的,则创建成功,方法返回true//如果当前路径表示的文件是存在的,则创建失败,方法返回false//如果父级路径不存在,那么方法会发生异常IOException//createNewFile方法创建的一定是文件,如果路径中不含后缀名,则创建一个没有后缀的文件
//        File file1 = new File("D:\\实习\\笔记\\Java\\md\\File类\\md\\demo.txt");
//        System.out.println(file1.createNewFile());//创建一个单级文件夹//Windows中路径是唯一的,如果当前路径已经存在,则创建失败,返回false//mkdir只能创建单级文件夹
//        File file2 = new File("D:\\实习\\testDir\\aaa");
//        System.out.println(file2.mkdir());//创建一个多级文件夹
//        File file3 = new File("D:\\实习\\testDir\\aaa\\bbb\\ccc");
//        System.out.println(file3.mkdirs());//删除文件,文件夹//如果删除的是文件,直接删除,不走回收站//如果删除的是空文件夹,直接删除,不走回收站//如果删除的是由内容的文件夹,则删除失败File file4 = new File("D:\\实习\\testDir");System.out.println(file4.delete());}
}

1.3.3、获取并遍历

最常用:

成员方法名称说明
public File[] listFiles()获取当前路径下所有内容

注意:

  • 当调用者File表示的路径不存在时,返回null
  • 当调用者File表示的路径是文件时,返回null
  • 当调用者File表示的路径是一个需要权限才能访问的文件夹时,返回null
  • 当调用者File表示的路径是一个空文件夹时,返回一个长度为零的数组
  • 当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面的文件文件夹的路径放在File数组中返回,包含隐藏文件
  • 当调用者File表示的路径是一个由内容的文件夹时,将里面所有的文件和文件夹的路径放到File数组中返回

其他获取并遍历的方法:

方法名称说明
public static File[] listRoots()列出可用的文件系统根
public String[] list()获取当前路径下所有内容
public String[] list(FilenameFilter filter)利用文件名过滤器获取当前路径下所有内容
public File[] listFiles (FileFilter filter)利用文件名过滤器获取当前路径下所有内容
public File[] listFiles(FilenameFilter filter)利用文件名过滤器获取当前路径下所有内容

2、IO流

2.1、概述

IO流用于读写文件中的数据,是存储和读取数据的解决方案

2.2、IO流的分类

2.2.1、流的方向

  • 输入流(InputStream读入)
  • 输出流(OutputStream写出)

2.2.2、操作文件的类型

  • 字节流(操作所有类型的文件)
  • 字符流(操作纯文本文件)

不要用字节流去读取中文,会乱码!!!

2.3、FileOutputStream

2.3.1、概念

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中

2.3.2、书写步骤

  • 创建字节输出流对象

    注意:

    参数是字符串表示的路径或者是File对象都是可以的

    如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

    如果文件已经存在则会清空文件

  • 写数据

    注意:

    write方法的参数是整数,但实际上写到本地文件中是整数在ASCII上对应的字符

  • 释放资源

    注意:

    每次使用完都要记得释放资源

简单示例:

public class OutputStreamDmeo {public static void main(String[] args) throws IOException {//创建对象FileOutputStream fos = new FileOutputStream("D:\\Application\\IDEA\\code\\javaThread\\demo.txt");//写出数据fos.write(99);//释放资源fos.close();}
}

2.3.3、FileOutputStream写数据的三种方式

方法名称说明
void write(int b)一次写一个字节数据
void write(byte)一次写一个字节数组数据
void write(byte[] b, int off, int len)一次写一个字节数组的部分数据

代码示例:

public class OutputStreamDemo1 {public static void main(String[] args) throws IOException {//创建对象FileOutputStream fos = new FileOutputStream("D:\\Application\\IDEA\\code\\javaThread\\demo.txt");//写出数据byte[] b = {97, 98, 99, 100, 101};fos.write(b);//一次写一个字节数组数据
//        fos.write(b, 0, 2);//一次写一个字节数组的数据的一部分//释放资源fos.close();}
}

2.3.3、换行续写

代码示例:

/*** FileOutputStream演示换行续写** 换行写:* 再次写出一个换行就可以啦* windows:/r/n* linux:/n* mac:/r* 细节:* 在windows操作系统中,java对回车做了优化,虽然完整的是/r/n,但是我们写一* 个/r或者/n都是可以的,因为java在底层会自动补全* * 续写:* FileOutputStream中第二个参数为续写开关* 第二个参数默认为false(不续写)* 第二个参数改为true(续写)*/
public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {//创建对象FileOutputStream fos = new FileOutputStream("demo.txt", true);//写出第一行数据String str1 = "Hello ";byte[] arr1 = str1.getBytes();fos.write(arr1);//换行String str2 = "\r\n";byte[] arr2 = str2.getBytes();fos.write(arr2);//写出第二行数据String str3 = "World!";byte[] arr3 = str3.getBytes();fos.write(arr3);//释放资源fos.close();}
}

2.4、FileInputStream

2.4.1、概念

操作本地文件的字节输入流,可以把本地文件中的数据读取出来

2.4.2、书写步骤

  • 创建字节输入流对象

    注意:

    如果文件不存在,程序直接报错

  • 读取数据

    注意:

    一次读一个字节,读出来的是数据在ASCII上对应的数字

    读到了文件末尾,read方法返回-1

  • 释放资源

    注意:

    每次使用完都需要释放资源

简单示例:

/*** FileInputStream演示*/
public class FileInputStreamDemo1 {public static void main(String[] args) throws IOException {//创建对象FileInputStream fileIn = new FileInputStream("D:\\Application\\IDEA\\code\\javaThread\\demo.txt");//读取数据int read1 = fileIn.read();System.out.println((char)read1);int read2 = fileIn.read();System.out.println((char)read2);//释放资源fileIn.close();}
}

2.4.3、循环读取

在2.4.2中的代码示例当中我们读取文件中的数据是一个一个读取的,并且每次读取输出都写了两行代码,如果文件中的数据很多时,我们的代码就会十分冗余,因此我们可以通过循环读取来减轻代码冗余度。

代码示例:

/*** FileInputStream循环读取演示*/
public class FileInputStreamDmeo2 {public static void main(String[] args) throws IOException {//创建对象FileInputStream fis = new FileInputStream("D:\\Application\\IDEA\\code\\javaThread\\demo.txt");//循环读取数据int read;while((read = fis.read()) != -1){System.out.println(((char)read));}//释放资源fis.close();}

此时有人可能会想,我们的while循环是不是还有其他更简便的写法呢,上面代码中的read变量是不是可以省略,把while循环这样写

while(fis.read() != -1){System.out.println((char)fis.read());
}

可是当我们运行时发现这样写之后我们读取出来的数据会出现缺失,这是为什么呢?原因很简单,当我们调用read方法读取数据时,每读取一次数据指针就向后移动一次,也就是我们每调用一次read方法,指针就向后走一位

2.5、拷贝文件

再次熟悉FileInputStream和FileOutputStream的使用

代码示例:

/*** 文件拷贝演示(边读边写)** 选择一个较小的文件进行拷贝,此时我们还没有学习到大文件* 传输,如果文件过大,会浪费时间*/
public class FileCopyDemo {public static void main(String[] args) throws IOException {//创建对象FileInputStream fis = new FileInputStream("D:\\图片音乐视频\\视频\\demo\\es安装.mp4");FileOutputStream fos = new FileOutputStream("D:\\实习\\笔记\\Java\\md\\File类\\imgs\\demo.mp4");//边读边写int read;while((read = fis.read()) != -1){fos.write(read);}System.out.println("拷贝成功~");//释放资源//先创建的对象后关闭,后创建的对象先关闭fos.close();fis.close();}
}

在我们传输一个小文件时,上述的代码运行时间我们还是可以接受的,但是当我们传输一个大文件时,我们会疯掉的,因为它实在是太慢了,那么有没有什么方法来解决这个问题呢?当然有,我们每次可以读取多个字节,这样我们拷贝文件的时间将会大大缩减。

2.5.1、FileInputStream一次读取多个字节

方法名称说明
public int read(byte [] buffer)一次读取一个字节数组数据,每次读取尽可能把数组装满,返回一次读取多少个数据

注意:虽然数组越大,传输的速度会越快,但是我们也不能把读取数组创建的太惊人,因为我们也要为电脑内存考虑一下,一般我们所开设的数组内存大小一般是1024的整数倍。

那么上述拷贝文件我们就可以这样做啦:

/*** 拷贝文件速度优化版*/public class FileCopyDemo2 {public static void main(String[] args) throws IOException {long time1 = new Date().getTime();//创建对象FileInputStream fis = new FileInputStream("D:\\图片音乐视频\\视频\\demo\\es安装.mp4");FileOutputStream fos = new FileOutputStream("D:\\实习\\笔记\\Java\\md\\File类\\imgs\\demo.mp4");//拷贝文件int len;byte[] bytes = new byte[1024 * 1024 * 5];while((len = fis.read(bytes)) != -1){fos.write(bytes, 0, len);}long time2 = new Date().getTime();System.out.println("传输成功~共用时:" +(time2 - time1) + "ms");//释放资源fos.close();fis.close();}
}

此时我们发现这拷贝速度块啦很多很多~~

补充一下,上述代码中的异常我们都是直接抛出的,但是在我们实际开发中一般是将其进行捕获处理的捕获(若要了解异常方面知识,可以参考我之前的笔记简单了解java中的异常),所以我们来修改一下上面的代码把。

/*** 使用try  catch对代码中的异常进行处理*/public class FileCopyDemo3 {public static void main(String[] args) {long time1 = System.currentTimeMillis();FileInputStream fis = null;FileOutputStream fos = null;try {//创建对象fis = new FileInputStream("D:\\图片音乐视频\\视频\\demo\\es安装.mp4");fos = new FileOutputStream("D:\\实习\\笔记\\Java\\md\\File类\\imgs\\demo.mp4");//拷贝文件int len;byte[] bytes = new byte[1024 * 1024 * 5];while((len = fis.read(bytes)) != -1){fos.write(bytes, 0, len);}} catch (IOException e) {throw new RuntimeException(e);} finally {}long time2 = System.currentTimeMillis();System.out.println("传输成功~共用时:" +(time2 - time1) + "ms");//释放资源(当不为空时才释放资源)if(fos != null){try {fos.close();} catch (IOException e) {throw new RuntimeException(e);}}if(fis != null){try {fis.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}

2.6、字符流

2.6.1、概述

字符流的底层其实就是字节流(字符流 = 字节流 + 字符集

特点:

输入流:一次读一个字节,遇到中文时,一次读多个字节

输出流:底层会把数据按照指定的编码方式进行编码,编程字节再写到文件中

使用场景:对于纯文本文件进行读写操作

2.6.2、FileReader

  • 创建字符输入流对象
构造方法说明
public FileReader**(File file)**创建字符输入流关联本地文件
public FileReader**(String pathname)**创建字符输入流关联本地文件

注意:如果文件不存在直接报错

  • 读取数据
成员方法说明
public int read()读取数据,读到末尾返回-1
public int read(char[], buffer)读取多个数据,读到末尾返回-1
  • 释放资源
成员方法说明
public int close()释放资源/关流

代码示例(空参read):

/*** FileReader读取数据(空参read)演示*/
public class FileReaderDemo1 {public static void main(String[] args) throws IOException {//创建对象FileReader fr = new FileReader("D:\\Application\\IDEA\\code\\javaThread\\demo.txt");//读取数据int reade;while((reade = fr.read()) != -1){System.out.print((char) reade);}//释放资源fr.close();}
}
/*** FileReader读取数据(有参read)演示*/
public class FileReaderDemo2 {public static void main(String[] args) throws IOException {//创建对象FileReader fr = new FileReader("D:\\Application\\IDEA\\code\\javaThread\\demo.txt");//读取数据char[] chars = new char[1024];int len;while((len = fr.read(chars)) != -1){System.out.print(new String(chars, 0, len));}//释放资源fr.close();}
}

2.6.3、FileWriter

  • 构造方法
构造方法说明
public FileWriter(File file)创建字符输出流关联本地文件
public FileWriter(String pathname)创建字符输出流关联本地文件
public FileWriter(File file, boolean append)创建字符输出流关联本地文件、续写
public FileWriter(String pathname, boolean append)创建字符输出流关联本地文件、续写
  • 成员方法
成员方法说明
void write (int c)写出一个字符
void write (String str)写出一个字符串
void write (String str, int off, int len)写出一个字符串的一部分
void write (char[] cbuf)写出一个字符数组
void write (char[] cbuf, int off, int len)写出一个字符数组的一部分

代码示例:

/*** FileWriter写出数据演示*/
public class FileWriterDemo1 {public static void main(String[] args) throws IOException {//创建对象FileWriter fw = new FileWriter("D:\\Application\\IDEA\\code\\javaThread\\demo.txt");//写出数据String str = "大家好!\r\n我叫糖锅~\r\n希望大家能够喜欢我~~";fw.write(str);//关闭资源fw.close();}
}

2.7、字节流和字符流使用场景

字节流:拷贝任意类型的文件

字符流:读取纯文本文件中的数据,往纯文本文件中写出数据

案例1:拷贝文件夹

/*** 拷贝一个文件夹,考虑子文件夹* 拷贝的文件夹:D:\实习\笔记\Java\md\线程* 拷贝到:D:\实习\FileCopyDemo*/
public class FileCopyDemo4 {//创建数据源对象static File sta = new File("D:\\实习\\笔记\\Java\\md\\线程");//创建拷贝目的地文件对象static File en = new File("D:\\实习\\FileCopyDemo");//调用copyFiles(File sta, File en)方法进行文件夹拷贝public static void main(String[] args) throws IOException {copyFiles(sta, en);System.out.println("拷贝完成~");}//copyFiles方法内部逻辑public static void copyFiles(File sta, File en) throws IOException {//如果en路径表示的文件夹不存在,则创建en.mkdirs();//获取sta路径下的所有内容File[] files = sta.listFiles();//for循环遍历文件内容for (File file : files) {//判断内容数组中内容是文件夹还是文件,如果是文件则拷贝,反之则递归if(file.isFile()){//创建字节输入&出流对象FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(new File(en, file.getName()));//拷贝数据int len;byte[] bytes = new byte[1024 * 1024];while((len = fis.read(bytes)) != -1){fos.write(bytes, 0, len);}//释放资源fos.close();fis.close();}else{//是文件夹递归copyFiles(file, new File(en, file.getName()));}}}
}

案例2:文件加密

/*** 为了保证文件的安全性,就需要对原始文件进行加密存储,在使用的时候再对其进行解密处理* 加密原理:* 对原始文件中内一个字节数据进行更改,然后将更改后的数据存储到新的文件中* 解密原理:* 读取加密文件,按照加密的规则反向操作,变成原始文件*/
public class FileEncAndDecDemo {public static void main(String[] args) throws IOException {enc();dec();}public static void enc() throws IOException {//创建对象关联原始的文件FileInputStream fis = new FileInputStream("D:\\图片音乐视频\\图片\\PS素材\\素材3.png");//创建对象关联加密文件FileOutputStream enc = new FileOutputStream("D:\\实习\\FileCopyDemo\\imgs\\加密文件.png");//进行加密int len;byte[] bytes = new byte[1024];while((len = fis.read(bytes)) != -1){for(int i = 0; i < len; i++){bytes[i] = (byte) (bytes[i] ^ 10);}enc.write(bytes, 0, len);}//释放资源enc.close();fis.close();System.out.println("加密成功");}public static void dec() throws IOException {//创建对象关联加密原始文件FileInputStream fis = new FileInputStream("D:\\实习\\FileCopyDemo\\imgs\\加密文件.png");//创建对象关联解密文件FileOutputStream dec = new FileOutputStream("D:\\实习\\FileCopyDemo\\imgs\\解密文件.png");//进行解密int len;byte[] bytes = new byte[1024];while((len = fis.read(bytes)) != -1){for(int i = 0; i < len; i++){bytes[i] = (byte) (bytes[i] ^ 10);}dec.write(bytes, 0, len);}//释放资源dec.close();fis.close();System.out.println("解密成功");}
}

案例3:修改文件中的数据

/***文本文件中有一下数据;9-12-3-0-5-4*将文件中的数据进行排序:0-3-4-5-9-12*/
public class FileUpdateDemo {public static void main(String[] args) throws IOException {//读取数据FileReader fr = new FileReader("D:\\实习\\FileCopyDemo\\demo.txt");StringBuffer sb = new StringBuffer();int len;char[] chars = new char[1024];while((len = fr.read(chars)) != -1){sb.append(chars, 0, len);}//关闭资源fr.close();//System.out.println(sb);//获取文本中的字符串String text = sb.toString();//切割String[] str = text.split("-");//排序List<Integer> list = new ArrayList<>();for (String s : str) {list.add(Integer.parseInt(s));}Collections.sort(list);//System.out.println(list);//写出数据FileWriter fw = new FileWriter("D:\\实习\\FileCopyDemo\\res.txt");for (int i = 0; i < list.size(); i++) {if(i != list.size() - 1){fw.write(list.get(i) + "-");}else{fw.write(list.get(i) + "");}}//关闭资源fw.close();}
}

3、缓冲流

3.1、字节缓冲流

方法名称说明
public BufferedInputStream(InputStream is)把基本流包装成高级流,提高读取数据的性能
public BufferedOutputStream(OutputStream os)把基本流包装成高级流,提高写出数据的性能

代码示例:

/*** 用缓冲流实现数据拷贝*/
public class FileBufferedDemo {public static void main(String[] args) throws IOException {//创建对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\实习\\FileCopyDemo\\demo.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\实习\\FileCopyDemo\\res.txt"));//拷贝数据int read;while ((read = bis.read()) != -1) {bos.write(read);}//释放资源bos.close();bis.close();}
}

3.2、字符缓冲流

方法名称说明
public BufferedReader(Reader r)把基本流换成高级流
public BufferedWriter(Writer r)把基本流换成高级流

特有方法:

方法名称说明
public String readLine()读取一行数据,如果没有数据可读,返回null,字符缓冲输入流特有
public void newLine()跨平台的换行,字符缓冲输出流特有

代码示例:

/*** BufferedReader示例*/
public class FileBufferedDemo1 {public static void main(String[] args) throws IOException {//创建对象BufferedReader br = new BufferedReader(new FileReader("D:\\实习\\FileCopyDemo\\demo.txt"));//读取数据String line;while((line = br.readLine()) != null){System.out.println(line);}//关闭资源br.close();}
}/*** BufferedWriter演示*/
public class FielBufferedWriterDemo1 {public static void main(String[] args) throws IOException {//创建对象BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\实习\\FileCopyDemo\\res.txt"));//写出数据bw.write("hello,我是糖锅~");bw.newLine();bw.write("希望大家会喜欢我");//释放资源bw.close();}
}

4、转换流

4.1、概述

是字符流和字节流之间的桥梁

示例1:利用转换流按照指定字符编码读取文件内容

//该读取方式作为了解OutputStreamWriter类似
public class InputStreamReaderDemo1 {public static void main(String[] args) throws IOException {/*文件地址:D:\实习\FileCopyDemo\gbkdemo.txt*///创建对象InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\实习\\FileCopyDemo\\gbkdemo.txt"), "GBK");//进行数据读取int len;char[] chars = new char[1024 * 8];while((len = isr.read(chars)) != -1){System.out.println(new String(chars, 0, len));}//释放资源r.close();}
}

5、序列化流(对象操作输出流)

5.1、可以把java中的对象写到本地文件中

  • 构造方法
构造方法说明
public ObjectOutputStream(OutputStream out)把基本流包装成高级流
  • 成员方法
成员方法说明
public final void writeObject(Object obj)把对象序列化写出到文件中去

使用对象输出流将对象保存到文件中时会出现:NotSerializableException异常

解决方案是:让javabean实现Serializable接口,Serializable接口 里面是没有抽象方法的,它是一个标记型接口,一旦实现这个接口,那么表示当前的Student类可以被序列化

示例:ObjectOutputStream

public class ObjectOutputStreamDemo1 {public static void main(String[] args) throws IOException {//创建对象Person person = new Person("糖锅", 21);//创建序列化对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\实习\\FileCopyDemo\\demo.txt"));//写出数据oos.writeObject(person);//释放资源oos.close();}
}

如果一个对象中每个成员变量的值不想被序列化,给该成员加上transient关键字修饰,该关键字标记的成员变量不参与序列化过程。

6、反序列化流

6.1、概述

可以把序列化到本地中的文件中的对象,读取到程序中来

  • 构造方法
构造方法说明
public ObjectInputStream(InputStream in)把基本流包装成高级流
  • 成员方法
成员方法说明
public Object readObject()把序列化到本地文件中的对象,读取到程序中

示例:

public class ObjectInputStreamDemo1 {public static void main(String[] args) throws IOException, ClassNotFoundException {//创建反序列化流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\实习\\FileCopyDemo\\demo.txt"));//读取数据Object res = ois.readObject();System.out.println(res);//释放资源ois.close();}
}

7、打印流

打印流一般是指:PrintStream、PrintWriter两个类

特点:

打印流只操作文件目的地,不操作数据源

特有的方法可以实现,数据的原样输出、自动刷新、自动换行

  • 字节打印流
构造方法说明
public PrintStream(OutputStream/File/String)关联字节输出流/文件/文件路径
public PrintStream(String fileName, Charset charset)指定字符编码
public PrintStream(OutputStream out, boolean auroFlush)自动刷新
public PrintStream(OutputStream out, boolean auroFlush, String encoding)指定字符编码且自动刷新
  • 字符打印流
构造方法说明
public PrintWriter(Write/File/String)关联字节输出流/文件/文件路径
public PrintWriter(String fileName, Charset charset)指定字符编码
public PrintWriter(Write w, boolean autoFlush)自动刷新
public PrintWriter(OutputStream out, boolean autoFlush, Charset charset)指定字符编码且自动刷新
  • 字节打印流/字符打印流成员方法
成员方法说明
public void write(int b)将指定的字符输出
public void println(Xxx xx)打印任意数据,自动刷新,自动换行
public void print(Xxx xx)打印任意数据不换行
public void printf(String format, Object…args)带有占位符的打印语句,不换行

相关文章:

简单了解java中的File类

1、File类 1.1、概述 File对象就表示一个路径&#xff0c;可以是文件路径也可以是文件夹路径&#xff0c;这个路径可以 是存在的&#xff0c;也可以是不存在的。 1.2、常见的构造方法 方法名称说明public File&#xff08;String pathname&#xff09;根据文件路径创建文件…...

边缘检测(一)-灰度图像边缘检测方法

灰度图像边缘检测是数字图像处理与机器视觉中经常遇到的一个问题&#xff0c;边缘检测是否连续、光滑是判断检测方法优劣的一个重要标准&#xff0c;下面通过一个实例提供灰度图像边缘检测方法&#xff0c;该方法对其他图像检测也具有一定的参考价值。 首先&#xff0c;读入一幅…...

2025计算机毕业设计选题题目推荐-毕设题目汇总大全

选题在于精&#xff0c;以下是推荐的容易答辩的选题&#xff1a; SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…...

简易版 | 代码生成器(包含插件)

一、代码生成器 先导入依赖 <!-- Mybatis-Plus --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version> </dependency><!-- 代码生成器 --…...

【Python】Redis数据库

Redis数据库 Unit01一、Redis1.1 概述1.2 安装1.3 Redis-cli1.4 数据类型1.5 字符处理1.6 键的命名规则 二、通用命令三、字符串(String)3.1 概述3.2 常用命令3.3 应用场景 四、列表(List)4.1 概述4.2 常用命令 五、集合(SET)5.1 概述5.3 常用命令 六、有序集合6.1 概述6.2 常用…...

理解并应用:JavaScript响应式编程与事件驱动编程的差异

背景介绍 在现代JavaScript开发中&#xff0c;响应式编程&#xff08;Reactive Programming&#xff09;和事件驱动编程&#xff08;Event-Driven Programming&#xff09;是两种非常重要且常用的编程范式。虽然它们都用于处理异步操作&#xff0c;但在理念和实现方式上存在显…...

第4天:用户认证系统实现

第4天&#xff1a;用户认证系统实现 目标 实现用户认证系统&#xff0c;包括用户注册、登录、登出和密码管理。 任务概览 使用Django内置的用户认证系统。创建用户注册和登录表单。实现用户登出和密码重置功能。 详细步骤 1. 使用Django内置的用户认证系统 Django提供了…...

PostgreSQL源码分析 —— FunctionScan

本文分析一下FunctionScan的源码&#xff0c;加深一下理解。以SELECT * FROM generate_series(2,4);为例进行分析。 postgrespostgres# SELECT * FROM generate_series(2,4);generate_series -----------------234 (3 rows)postgrespostgres# explain SELECT * FROM generate…...

数据结构-十大排序算法集合(四万字精讲集合)

前言 1&#xff0c;数据结构排序篇章是一个大的工程&#xff0c;这里是一个总结篇章&#xff0c;配备动图和过程详解&#xff0c;从难到易逐步解析。 2&#xff0c;这里我们详细分析几个具备教学意义和实际使用意义的排序&#xff1a; 冒泡排序&#xff0c;选择排序&#xff0c…...

SpringBoot三层架构

目录 一、传统方式 二、三层架构 三、代码拆分 1、dao层 2、service层 3、control层 四、运行结果 一、传统方式 上述代码存在一定的弊端&#xff0c;在进行软件设计和软件开发中提倡单一责任原则&#xff0c;使代码的可读性更强&#xff0c;复杂性更低&#xff0c;可扩展性…...

uniapp微信小程序局部刷新,无感刷新,修改哪条数据刷新哪条

uniapp做微信小程序时&#xff0c;一个商品列表滑到几百条数据时&#xff0c;点进去详情跳转去编辑信息上下架等&#xff0c;修改完成回来商品列表就到第一条数据了&#xff0c;这样页面效果体验感不是很好&#xff0c;是因为我们把数据接口放在onshow中了&#xff0c;每次回来…...

golan的雪花id

今天记录一下 golang的雪花id golang的雪花id 还是比较简单的&#xff0c;其包含的含义以及组成我这就不讲了&#xff0c;好多大佬都有文章写过&#xff0c;我直接上怎么用 先 引入包 go get "github.com/bwmarrin/snowflake" 代码块 func main() {// 设置一个时…...

RK3568 CAN波特率500K接收数据导致CPU4满载

最近调试RK3568 CAN时发现&#xff0c;当CAN作为接收端&#xff0c;在快速接收数据时会导致cpu4满载。down掉can口或者断开外设时恢复正常。并且问题只是在部门CPU版本上出现。在CAN接收中断中打印log&#xff0c;能发现log是按照接收数据的时间打印的。 驱动(rockchip_canfd…...

AI实战 | 使用元器打造浪漫仪式小管家

浪漫仪式小管家 以前我们曾经打造过学习助手和待办助手,但这一次,我们决定创造一个与众不同的智能体,而浪漫将成为我们的主题。我们选择浪漫作为主题,是因为我们感到在之前的打造过程中缺乏了一些仪式感,无法给对方带来真正的惊喜。因此,这一次我们计划慢慢调试,将它发…...

什么是隐马尔可夫模型?

文章目录 一、说明二、玩具HMM&#xff1a;5′拼接位点识别三、那么&#xff0c;隐藏了什么&#xff1f;四、查找最佳状态路径五、超越最佳得分对齐六、制作更逼真的模型七、收获 关键词&#xff1a;hidden markov model 一、说明 被称为隐马尔可夫模型的统计模型是计算生物学…...

qt中使用qsqlite连接数据库,却没有在本地文件夹中生成db文件

exe运行起来之后&#xff0c;发现没有在exe文件夹下生成数据库文件&#xff0c;&#xff0c;之前可以&#xff0c;但中间莫名其妙不行了&#xff0c;代码如下 // 建立和SQlite数据库的连接database QSqlDatabase::addDatabase("QSQLITE");// 设置数据库文件的名字da…...

Django的‘通用视图TemplateView’

使用通用视图的好处是&#xff1a;如果有一个html需要展示&#xff0c;不需要写view视图函数&#xff0c;直接写好url即可。 使用通用视图的步骤如下&#xff1a; 1、编辑项目urls.py文件 from django.views.generic import TemplateView 在该文件的映射表中添加&#xff1a…...

java功能实现在某个时间范围之内输出true,不在某个范围输出false,时间精确到分钟

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DateTimeChecker { private static final Logger log LoggerFactory.getLogger(DateTimeChecker.class); /** * 检查当前时间是否在指定的小时和分钟范围内。 * * param startHour 开…...

macbook屏幕录制技巧,这2个方法请你收好

在当今数字化时代&#xff0c;屏幕录制成为了一项不可或缺的技能&#xff0c;无论是教学演示、游戏直播&#xff0c;还是软件操作教程&#xff0c;屏幕录制都能帮助我们更直观地传达信息。MacBook作为苹果公司的标志性产品&#xff0c;其屏幕录制功能也备受用户关注。本文将详细…...

vue-loader

Vue Loader 是一个 webpack 的 loader&#xff0c;它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件 起步 安装 npm install vue --save npm install webpack webpack-cli style-loader css-loader html-webpack-plugin vue-loader vue-template-compiler webpack…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...