2024年最新Java基础IO流(案例源码)【六】,2024年互联网大厂Java面经总结

最后

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。

我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。

不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

1.3.3代码实现

public class CopyFoldersDemo {

public static void main(String[] args) throws IOException {

//创建数据源File对象,路径是E:\test

File srcFile = new File(“E:\test”);

//创建目的地File对象,路径是F:\

File destFile = new File(“F:\”);

//写方法实现文件夹的复制,参数为数据源File对象和目的地File对象

copyFolder(srcFile,destFile);

}

//复制文件夹

private static void copyFolder(File srcFile, File destFile) throws IOException {

//判断数据源File是否是目录

if(srcFile.isDirectory()) {

//在目的地下创建和数据源File名称一样的目录

String srcFileName = srcFile.getName();

File newFolder = new File(destFile,srcFileName); //F:\test

if(!newFolder.exists()) {

newFolder.mkdir();

}

//获取数据源File下所有文件或者目录的File数组

File[] fileArray = srcFile.listFiles();

//遍历该File数组,得到每一个File对象

for(File file : fileArray) {

//把该File作为数据源File对象,递归调用复制文件夹的方法

copyFolder(file,newFolder);

}

} else {

//说明是文件,直接复制,用字节流

File newFile = new File(destFile,srcFile.getName());

copyFile(srcFile,newFile);

}

}

//字节缓冲流复制文件

private static void copyFile(File srcFile, File destFile) throws IOException {

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

byte[] bys = new byte[1024];

int len;

while ((len = bis.read(bys)) != -1) {

bos.write(bys, 0, len);

}

bos.close();

bis.close();

}

}

1.4复制文件的异常处理【应用】

1.4.1基本做法

public class CopyFileDemo {

public static void main(String[] args) {

}

//try…catch…finally

private static void method2() {

FileReader fr = null;

FileWriter fw = null;

try {

fr = new FileReader(“fr.txt”);

fw = new FileWriter(“fw.txt”);

char[] chs = new char[1024];

int len;

while ((len = fr.read()) != -1) {

fw.write(chs, 0, len);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if(fw!=null) {

try {

fw.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if(fr!=null) {

try {

fr.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

//抛出处理

private static void method1() throws IOException {

FileReader fr = new FileReader(“fr.txt”);

FileWriter fw = new FileWriter(“fw.txt”);

char[] chs = new char[1024];

int len;

while ((len = fr.read()) != -1) {

fw.write(chs, 0, len);

}

fw.close();

fr.close();

}

}

1.4.2JDK7版本改进

public class CopyFileDemo {

public static void main(String[] args) {

}

//JDK7的改进方案

private static void method3() {

try(FileReader fr = new FileReader(“fr.txt”);

FileWriter fw = new FileWriter(“fw.txt”)😉{

char[] chs = new char[1024];

int len;

while ((len = fr.read()) != -1) {

fw.write(chs, 0, len);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

1.4.3JDK9版本改进

public class CopyFileDemo {

public static void main(String[] args) {

}

//JDK9的改进方案

private static void method4() throws IOException {

FileReader fr = new FileReader(“fr.txt”);

FileWriter fw = new FileWriter(“fw.txt”);

try(fr;fw){

char[] chs = new char[1024];

int len;

while ((len = fr.read()) != -1) {

fw.write(chs, 0, len);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

2.IO特殊操作流


2.1标准输入流【应用】

  • System类中有两个静态的成员变量

  • public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源

  • public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标

  • 自己实现键盘录入数据

public class SystemInDemo {

public static void main(String[] args) throws IOException {

//public static final InputStream in:标准输入流

// InputStream is = System.in;

// int by;

// while ((by=is.read())!=-1) {

// System.out.print((char)by);

// }

//如何把字节流转换为字符流?用转换流

// InputStreamReader isr = new InputStreamReader(is);

// //使用字符流能不能够实现一次读取一行数据呢?可以

// //但是,一次读取一行数据的方法是字符缓冲输入流的特有方法

// BufferedReader br = new BufferedReader(isr);

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.println(“请输入一个字符串:”);

String line = br.readLine();

System.out.println(“你输入的字符串是:” + line);

System.out.println(“请输入一个整数:”);

int i = Integer.parseInt(br.readLine());

System.out.println(“你输入的整数是:” + i);

//自己实现键盘录入数据太麻烦了,所以Java就提供了一个类供我们使用

Scanner sc = new Scanner(System.in);

}

}

2.2标准输出流【应用】

  • System类中有两个静态的成员变量

  • public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源

  • public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标

  • 输出语句的本质:是一个标准的输出流

  • PrintStream ps = System.out;

  • PrintStream类有的方法,System.out都可以使用

  • 示例代码

public class SystemOutDemo {

public static void main(String[] args) {

//public static final PrintStream out:标准输出流

PrintStream ps = System.out;

//能够方便地打印各种数据值

// ps.print(“hello”);

// ps.print(100);

// ps.println(“hello”);

// ps.println(100);

//System.out的本质是一个字节输出流

System.out.println(“hello”);

System.out.println(100);

System.out.println();

// System.out.print();

}

}

2.3字节打印流【应用】

  • 打印流分类

  • 字节打印流:PrintStream

  • 字符打印流:PrintWriter

  • 打印流的特点

  • 只负责输出数据,不负责读取数据

  • 永远不会抛出IOException

  • 有自己的特有方法

  • 字节打印流

  • PrintStream(String fileName):使用指定的文件名创建新的打印流

  • 使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出

  • 可以改变输出语句的目的地

​ public static voi d setOut(PrintStream out):重新分配“标准”输出流

  • 示例代码

public class PrintStreamDemo {

public static void main(String[] args) throws IOException {

//PrintStream(String fileName):使用指定的文件名创建新的打印流

PrintStream ps = new PrintStream(“myOtherStream\ps.txt”);

//写数据

//字节输出流有的方法

// ps.write(97);

//使用特有方法写数据

// ps.print(97);

// ps.println();

// ps.print(98);

ps.println(97);

ps.println(98);

//释放资源

ps.close();

}

}

2.4字符打印流【应用】

  • 字符打印流构造房方法

| 方法名 | 说明 |

| — | — |

| PrintWriter(String fileName) | 使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新 |

| PrintWriter(Writer out, boolean autoFlush) | 创建一个新的PrintWriter out:字符输出流 autoFlush: 一个布尔值,如果为真,则println , printf ,或format方法将刷新输出缓冲区 |

  • 示例代码

public class PrintWriterDemo {

public static void main(String[] args) throws IOException {

//PrintWriter(String fileName) :使用指定的文件名创建一个新的PrintWriter,而不需要自动执行行刷新

// PrintWriter pw = new PrintWriter(“myOtherStream\pw.txt”);

// pw.write(“hello”);

// pw.write(“\r\n”);

// pw.flush();

// pw.write(“world”);

// pw.write(“\r\n”);

// pw.flush();

// pw.println(“hello”);

/*

pw.write(“hello”);

pw.write(“\r\n”);

*/

// pw.flush();

// pw.println(“world”);

// pw.flush();

//PrintWriter(Writer out, boolean autoFlush):创建一个新的PrintWriter

PrintWriter pw = new PrintWriter(new FileWriter(“myOtherStream\pw.txt”),true);

// PrintWriter pw = new PrintWriter(new FileWriter(“myOtherStream\pw.txt”),false);

pw.println(“hello”);

/*

pw.write(“hello”);

pw.write(“\r\n”);

pw.flush();

*/

pw.println(“world”);

pw.close();

}

}

2.5复制Java文件打印流改进版【应用】

  • 案例需求

  • 把模块目录下的PrintStreamDemo.java 复制到模块目录下的 Copy.java

  • 分析步骤

  • 根据数据源创建字符输入流对象

  • 根据目的地创建字符输出流对象

  • 读写数据,复制文件

  • 释放资源

  • 代码实现

public class CopyJavaDemo {

public static void main(String[] args) throws IOException {

/*

//根据数据源创建字符输入流对象

BufferedReader br = new BufferedReader(new FileReader(“myOtherStream\PrintStreamDemo.java”));

//根据目的地创建字符输出流对象

BufferedWriter bw = new BufferedWriter(new FileWriter(“myOtherStream\Copy.java”));

//读写数据,复制文件

String line;

while ((line=br.readLine())!=null) {

bw.write(line);

bw.newLine();

bw.flush();

}

//释放资源

bw.close();

br.close();

*/

//根据数据源创建字符输入流对象

BufferedReader br = new BufferedReader(new FileReader(“myOtherStream\PrintStreamDemo.java”));

//根据目的地创建字符输出流对象

PrintWriter pw = new PrintWriter(new FileWriter(“myOtherStream\Copy.java”),true);

//读写数据,复制文件

String line;

while ((line=br.readLine())!=null) {

pw.println(line);

}

//释放资源

pw.close();

br.close();

}

}

2.6对象序列化流【应用】

  • 对象序列化介绍

  • 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象

  • 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息

  • 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息

  • 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

  • 对象序列化流: ObjectOutputStream

  • 将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象

  • 构造方法

| 方法名 | 说明 |

| — | — |

| ObjectOutputStream(OutputStream out) | 创建一个写入指定的OutputStream的ObjectOutputStream |

  • 序列化对象的方法

| 方法名 | 说明 |

| — | — |

| void writeObject(Object obj) | 将指定的对象写入ObjectOutputStream |

  • 示例代码

  • 学生类

public class Student implements Serializable {

private String name;

private int age;

public Student() {

}

public Student(String name, int age) {

this.name = name;

this.age = age;

}

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;

}

@Override

public String toString() {

return “Student{” +

“name='” + name + ‘’’ +

“, age=” + age +

‘}’;

}

}

  • 测试类

public class ObjectOutputStreamDemo {

public static void main(String[] args) throws IOException {

//ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“myOtherStream\oos.txt”));

//创建对象

Student s = new Student(“林青霞”,30);

//void writeObject(Object obj):将指定的对象写入ObjectOutputStream

oos.writeObject(s);

//释放资源

oos.close();

}

}

  • 注意事项

  • 一个对象要想被序列化,该对象所属的类必须必须实现Serializable 接口

  • Serializable是一个标记接口,实现该接口,不需要重写任何方法

2.7对象反序列化流【应用】

  • 对象反序列化流: ObjectInputStream

  • ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象

  • 构造方法

| 方法名 | 说明 |

| — | — |

| ObjectInputStream(InputStream in) | 创建从指定的InputStream读取的ObjectInputStream |

  • 反序列化的方法

| 方法名 | 说明 |

| — | — |

| Object readObject() | 从ObjectInputStream读取一个对象 |

  • 示例代码

public class ObjectInputStreamDemo {

public static void main(String[] args) throws IOException, ClassNotFoundException {

//ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectInputStream

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“myOtherStream\oos.txt”));

//Object readObject():从ObjectInputStream读取一个对象

Object obj = ois.readObject();

Student s = (Student) obj;

System.out.println(s.getName() + “,” + s.getAge());

ois.close();

}

}

2.8serialVersionUID&transient【应用】

  • serialVersionUID

  • 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?

  • 会出问题,会抛出InvalidClassException异常

  • 如果出问题了,如何解决呢?

  • 重新序列化

  • 给对象所属的类加一个serialVersionUID

  • private static final long serialVersionUID = 42L;

  • transient

  • 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?

  • 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

  • 示例代码

  • 学生类

public class Student implements Serializable {

private static final long serialVersionUID = 42L;

private String name;

// private int age;

private transient int age;

public Student() {

}

public Student(String name, int age) {

this.name = name;

this.age = age;

}

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;

}

// @Override

// public String toString() {

// return “Student{” +

// “name='” + name + ‘’’ +

// “, age=” + age +

// ‘}’;

// }

}

  • 测试类

public class ObjectStreamDemo {

public static void main(String[] args) throws IOException, ClassNotFoundException {

// write();

read();

}

//反序列化

private static void read() throws IOException, ClassNotFoundException {

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“myOtherStream\oos.txt”));

Object obj = ois.readObject();

Student s = (Student) obj;

System.out.println(s.getName() + “,” + s.getAge());

ois.close();

}

//序列化

private static void write() throws IOException {

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“myOtherStream\oos.txt”));

Student s = new Student(“林青霞”, 30);

oos.writeObject(s);

oos.close();

}

}

3.Properties集合


3.1Properties作为Map集合的使用【应用】

  • Properties介绍

  • 是一个Map体系的集合类

  • Properties可以保存到流中或从流中加载

  • 属性列表中的每个键及其对应的值都是一个字符串

  • Properties基本使用

public class PropertiesDemo01 {

public static void main(String[] args) {

//创建集合对象

// Properties<String,String> prop = new Properties<String,String>(); //错误

Properties prop = new Properties();

//存储元素

prop.put(“itheima001”, “林青霞”);

prop.put(“itheima002”, “张曼玉”);

prop.put(“itheima003”, “王祖贤”);

//遍历集合

Set keySet = prop.keySet();

for (Object key : keySet) {

Object value = prop.get(key);

System.out.println(key + “,” + value);

}

}

}

3.2Properties作为Map集合的特有方法【应用】

  • 特有方法

| 方法名 | 说明 |

| — | — |

| Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put |

| String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |

| Set stringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |

  • 示例代码

public class PropertiesDemo02 {

public static void main(String[] args) {

//创建集合对象

Properties prop = new Properties();

//Object setProperty(String key, String value):设置集合的键和值,都是String类型,底层调用Hashtable方法put

prop.setProperty(“itheima001”, “林青霞”);

/*

Object setProperty(String key, String value) {

return put(key, value);

}

Object put(Object key, Object value) {

return map.put(key, value);

}

*/

prop.setProperty(“itheima002”, “张曼玉”);

prop.setProperty(“itheima003”, “王祖贤”);

//String getProperty(String key):使用此属性列表中指定的键搜索属性

// System.out.println(prop.getProperty(“itheima001”));

本次面试答案,以及收集到的大厂必问面试题分享:

字节跳动超高难度三面java程序员面经,大厂的面试都这么变态吗?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

keySet();

for (Object key : keySet) {

Object value = prop.get(key);

System.out.println(key + “,” + value);

}

}

}

3.2Properties作为Map集合的特有方法【应用】

  • 特有方法

| 方法名 | 说明 |

| — | — |

| Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put |

| String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |

| Set stringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |

  • 示例代码

public class PropertiesDemo02 {

public static void main(String[] args) {

//创建集合对象

Properties prop = new Properties();

//Object setProperty(String key, String value):设置集合的键和值,都是String类型,底层调用Hashtable方法put

prop.setProperty(“itheima001”, “林青霞”);

/*

Object setProperty(String key, String value) {

return put(key, value);

}

Object put(Object key, Object value) {

return map.put(key, value);

}

*/

prop.setProperty(“itheima002”, “张曼玉”);

prop.setProperty(“itheima003”, “王祖贤”);

//String getProperty(String key):使用此属性列表中指定的键搜索属性

// System.out.println(prop.getProperty(“itheima001”));

本次面试答案,以及收集到的大厂必问面试题分享:

[外链图片转存中…(img-LoXhKRWq-1715143670720)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值