目录

1、概念

2、常用的文件操作

2.1 创建文件

2.2 获取文件相关信息

2.3 目录的操作和文件删除

3、 IO流原理及流的分类

3.1 流的分类

4、InputStream 字节输入流

4.1 InputStream的常用子类

5、FileInputStream 和FileOutputStream

5.1 FileInputStream

5.2 FileOutputStream

6、FileReader 和 FileWriter

6.1 FileReader相关方法

6.2 FileWriter相关方法

6.3 案例

7、节点流和处理流

7.1 节点流

7.2 处理流

7.3 节点流和处理流的区别和联系

8、BufferedReader 和BufferedWriter

案例1 BufferedReader

案例2 BufferedWriter

案例3 同时使用

9、BufferedInputStream 和 BufferedOutputStream

应用 同时使用

10、 对象流 ObjectInputStream 和 ObjectOutputStream

10.1 需求:

10.2 序列化和反序列化

10.3 对象流 ObjectInputStream 和 ObjectOutputStream

10.4 案例 ObjectOutputStream 序列化

10.5 案例 ObjectInputStream 反序列化

10.6 对象处理流的注意事项

11、标准输入输出流

11.1 案例

12、 转换流

12.1 为什么需要转换流

12.2 InputStreamReader 和 OutputStreamWriter

13、打印流

13.1 PrintStream

13.2 PrintWriter

14、 Properties类

14.1 基本介绍

14.2 常见方法


1、概念

文件:就是保存数据的地方

文件流:文件在程序中是以流的形式来操作的

流:数据在数据源(文件)和程序(内存)之间经历的路径

输入流:数据从数据源(文件)到程序(内存)之间的路径

输出流: 数据从程序(内存)到数据源(文件)之间的路径

2、常用的文件操作

2.1 创建文件

  • new File(String pathname) //根据路径构建一个File对象

  • new File(File parent ,String child) //根据父目录文件 + 子路径构建

  • new File(String parent,String child) //根据父目录 + 子路径构建

  • createNewFile 创建新文件

案例:在e盘上,创建news1.txt、news2.txt、news3.txt 用三种不同方式创建

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.File;
import java.io.IOException;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/7 19:47* @version: 1.0* @email 1660420659@qq.com* @description: 创建文件 利用三种方式*/
public class CreateIoFile {
​
​@Test//方式1 new File(String pathname) //根据路径构建一个File对象public  void create01() {String filePath = "e:\\news1.txt";File file = new File(filePath);try {file.createNewFile();System.out.println("文件创建成功!");} catch (IOException e) {e.printStackTrace();}}
​//方式2 new File(File parent ,String child) //根据父目录文件 + 子路径构建@Testpublic void create02() {File file = new File("e:\\");File file1 = new File(file,"news2.txt");try {//这个代码才是真正将内存中数据 创建到磁盘中file1.createNewFile();System.out.println("文件创建成功!");} catch (IOException e) {e.printStackTrace();}}
​//方式3 new File(String parent,String child) //根据父目录 + 子路径构建@Testpublic void create03() {String parenPath = "e:\\";String childPath = "news3.txt";File file = new File(parenPath,childPath);try {file.createNewFile();System.out.println("文件创建成功");} catch (IOException e) {e.printStackTrace();}}
}

2.2 获取文件相关信息

  • getName

  • getAbsolutePath

  • getParent

  • length

  • exists

  • isFile

  • isDirectory

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.File;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/7 20:01* @version: 1.0* @email 1660420659@qq.com* @description: 获取文件信息*/
public class FileInformation {public static void main(String[]args){
​}
​//获取文件信息@Testpublic void info() {//创建文件对象File file = new File("e:\\news1.txt");
​//调用相应的方法,得到对应信息System.out.println("文件名字="+file.getName());System.out.println("文件绝对路径"+file.getAbsolutePath());System.out.println("文件父类目录"+file.getParent());System.out.println("文件大小(字节)"+file.length());System.out.println("文件是否存在"+file.exists());System.out.println("文件是否 是一个文件"+file.isFile());System.out.println("文件是否 是一个目录"+file.isDirectory());}
}

2.3 目录的操作和文件删除

  • mkdir 创建一级目录

  • mkdirs 创建多级目录

  • delete 删除空目录或文件

  • 在java中 将文件夹也当做文件

3、 IO流原理及流的分类

  1. IO是Input和Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。如读写文件,网络通讯等

  2. java程序中,对数据的输入和输出操作以 流的方式进行

  3. java.io包下提供了各种流类和接口,用以获取不同种类的数据,并通过方法输入或输出数据

  4. 输入input:读取外部数据(磁盘、光盘等存储设置的数据)到程序(内存)中

  5. 输出output: 将程序(内存)数据输出到磁盘、光盘等存储设备中

3.1 流的分类

  • 按操作数据单位不同分为:字节流 (8bit) 二进制文件,字符流(字符) 文本文件

  • 按数据流的流向不同分为:输入流和输出流

  • 按流的角色不同分为:节点流,处理流/包装流

抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Wirter
  1. java的IO流共涉及40多个类,实际上非常规则,都是从上面四个抽象基类派生的

  2. 由者四个类派生出来的子类名称都是以其父类名作为子类名后缀

4、InputStream 字节输入流

4.1 InputStream的常用子类

  • FileInputStream 文件输入流

  • BufferedInputStream 缓存字节输入流

  • ObjectInputStream 对象字节输入流

5、FileInputStream 和FileOutputStream

5.1 FileInputStream

应用案例

要求:请使用FileInputStream 读取hello.txt文件并将文件内容显示到控制台

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLOutput;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/7 21:26* @version: 1.0* @email 1660420659@qq.com* @description: 文件输入流  (字节输入流)*/
public class FileInputStream_ {public static void main(String[]args){
​}
​/*** 单个字节的读取 效率比较低*   使用 read(byte[] bytes)进行优化**  一般字节输入流都是用于读取二进制文件,文本文件是由字符输入流读取*  因为一旦出现汉字 一个一个读取字节,但是一个汉字代表是哪个字节 就会出现中文乱码的问题*/@Testpublic void readFile01() {int readData;InputStream io = null;try {//创建FileInputStreamio = new FileInputStream("e:\\hello.txt");//从该输入流读取一个字节的数据 ,如果没有返回-1 表示读取完毕while ((readData = io.read()) != -1) {System.out.print((char)(readData));}} catch (IOException e) {e.printStackTrace();} finally {//一定要关闭流try {io.close();} catch (IOException e) {e.printStackTrace();}}}
​@Testpublic void readFile02() {int len = 0;InputStream io = null;byte[] b = new byte[8]; //一次读取8个字节try {//创建FileInputStreamio = new FileInputStream("e:\\hello.txt");//一次读取 byte数组长度 如果返回成功  len为文件中读取的个数  如果数据读完返回-1while ((len = io.read(b)) != -1) {System.out.print(new String(b,0,len));}} catch (IOException e) {e.printStackTrace();} finally {//一定要关闭流try {io.close();} catch (IOException e) {e.printStackTrace();}}}
}
​

5.2 FileOutputStream

应用案例

要求:请使用FileOutputStream 在a.txt文件中写入 “helloWorld” ,(如果文件不存在,会自动创建文件)

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/7 22:07* @version: 1.0* @email 1660420659@qq.com* @description: FileOutputStream_*/
public class FileOutputStream_ {
​
​/*** 演示使用FileOutputStream 将数据写到文件中,如果该文件不存在,则创建该文件*/@Testpublic void wirteFile() {OutputStream op = null;try {//1.如果new FileOutputStream("e:\\a.txt"); 创建方式//   当写入内容会覆盖原先的内容//2.如果new FileOutputStream("e:\\a.txt",true); 创建方式//   当写入内容会追加到文件后面op = new FileOutputStream("e:\\a.txt");String str = "helloWorld";//也可以指定编码op.write(str.getBytes());System.out.println("写入成功");} catch (IOException e) {e.printStackTrace();}finally {try {op.close();} catch (IOException e) {e.printStackTrace();}}}
​}

综合案例

要求:使用FileInputStream和FileOutputStream将图片进行拷贝

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.*;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 11:04* @version: 1.0* @email 1660420659@qq.com* @description: 文件拷贝*/
public class FileCopy {
​@Test//完成文件拷贝 将e:\\1.JPG 拷贝到 f:\\2.JPGpublic void  copyFile() {InputStream io = null;OutputStream op = null;byte[] b = new byte[1024];int dataLen = 0;//1、创建文件输入流 将文件读入到程序//2. 创建文件输出流 将读取的数据写入到磁盘中(文件中)//3.读取部分数据就写入到文件中try {io = new FileInputStream("e:\\1.JPG");op = new FileOutputStream("f:\\2.JPG");while ((dataLen = io.read(b)) != -1) {//读取到后就写入到文件op.write(b,0,dataLen);}System.out.println("拷贝成功");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {//最后关闭资源try {if (op != null) {op.close();}if (io != null) {io.close();}} catch (IOException e) {e.printStackTrace();}}
​}
}

6、FileReader 和 FileWriter

6.1 FileReader相关方法

  1. new FileReader(File/String)

  2. read 每次读取单个字符,返回该字符,如果到文件末尾就返回-1

  3. read(char[]) 批量读取多个字符到数组,返回读取到到的字符数 ,如果到文件莫问返回-1

6.2 FileWriter相关方法

  1. new FileWriter(File/String) :覆盖模式,相当于流的指针在首端

  2. new FileWriter(File/String , true) :追加模式,相当于流的指针在尾端

  3. writer(int) 写入单个字符

  4. writer(char[]) 写入整个数组

  5. writer(char[],off,len) 写入指定数组的指定部分

  6. writer(String) 写入整个字符串

  7. writer(String ,off,len) 写入字符串的指定文职

  8. 注意: FileWriter使用后,必须要关闭 (close)或刷新(flush),否则写入不到指定的文件

6.3 案例

要求:使用FileReader 从 reader.txt 中读取内容并显示

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 11:27* @version: 1.0* @email 1660420659@qq.com* @description: TODO*/
public class FileReader_ {
​//从f:\\reader.txt 读取内容并显示出来@Testpublic  void  fileReader() {Reader reader  = null;int readData = 0;try {reader = new FileReader("f:\\reader.txt");//单个字符读取while ((readData = reader.read()) != -1) {System.out.print((char)readData);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (reader == null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}
​@Testpublic  void  fileReader2() {Reader reader  = null;int readLen = 0;char[] chars = new char[8];try {reader = new FileReader("f:\\reader.txt");//按照字符数组读取文件while ((readLen = reader.read(chars)) != -1) {System.out.print(new String(chars,0,readLen));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (reader == null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}
}
​

要求:使用FileWriter 将"风雨之后,必见彩虹"写入到 note.txt中文件中

注意细节 使用后必须要关闭或者刷新

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 11:37* @version: 1.0* @email 1660420659@qq.com* @description: 文件输出流*/
public class FileWriter_ {
​@Testpublic  void fileWriter() {Writer writer = null;char[] chars = {'a','b','网'};try {//默认是覆盖写入 会覆盖文件之前的内容//最终将writer方法的内容加入进去//例如原先文件有aaa三个内容//执行两个write   1.write('h')  2. write('w')//结果就变成了 hw  覆盖了之前的aaawriter = new FileWriter("f:\\node.txt");
//            1. writer(int) 写入单个字符writer.write('我');
//            2. writer(char[]) 写入整个数组writer.write(chars);
//            3. writer(char[],off,len) 写入指定数组的指定部分writer.write(chars,0,1);
//            4. writer(String) 写入整个字符串writer.write("风雨之后,必见彩虹");
//            5. writer(String ,off,len) 写入字符串的指定文职writer.write("伤害",0,1);} catch (IOException e) {e.printStackTrace();}finally {//对应的FileWriter  一定要关闭流 或者flush才能真正的把数据写入到文件中/*对应源码  当执行close的时候才走到这个关键的 this.out.writer进行写数据this.bb.flip();int var1 = this.bb.limit();int var2 = this.bb.position();
​assert var2 <= var1;
​int var3 = var2 <= var1 ? var1 - var2 : 0;if (var3 > 0) {if (this.ch != null) {assert this.ch.write(this.bb) == var3 : var3;} else {this.out.write(this.bb.array(), this.bb.arrayOffset() + var2, var3);}}*/try {writer.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("程序结束");}
}
​

7、节点流和处理流

7.1 节点流

节点流可以从一个特定的数据源读写数据 如FileReader FileWriter

7.2 处理流

处理流(包装类) 是“连接” 已存在的流(处理流或节点流)之上,为程序提供更为强大的读写功能,如BufferedReader BufferedWriter

7.3 节点流和处理流的区别和联系

  1. 节点流是底层流/低级流,直接跟数据源相接

  2. 处理流(包装流),用于包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入和输出

  3. 处理流对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连

  4. 处理流的功能主要体现 (我认为类似于多态一样)

    • 性能的提高: 主要以增加缓冲的方式来提高输入输出的效率

    • 操作的便捷: 处理流提供了一系列便捷的方法来一次输入输出大批量数据,使得更加灵活方便

8、BufferedReader 和BufferedWriter

BufferedReader 和BufferedWriter 属于字符流,是按照字符来读取数据的

关闭的时候,只需要关闭外层流即可 也就是包装流即可(真正处理读写的是节点流,处理流(包装流)只是一个包装,但是从写了close方法 只要关闭包装流就会自动将节点流关闭)

案例1 BufferedReader

要求: 使用BufferedReader 读取文本文件,并显示在控制台

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 15:19* @version: 1.0* @email 1660420659@qq.com* @description: TODO*/
public class BufferedReaderTest {
​@Testpublic void  bufferedReaderTest() throws IOException {
​BufferedReader bufferedReader = new BufferedReader(new FileReader("f:\\node.txt"));//读取String line;//按行读取//当返回null的时候 代表读取完毕while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}//关闭流,注意只需要关闭外层流就可以//因为底层会自动关闭节点流bufferedReader.close();/*public void close() throws IOException {synchronized (lock) {if (in == null)return;try {in.close();  //这个in就是我们传入的fileReader} finally {in = null;cb = null;}}}*/}
}
​

案例2 BufferedWriter

要求:使用BufferedWriter 将“hello,你好啊,宝贝”写入到文件中

package com.sofwin.config;
​
import org.junit.Test;
​
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 15:30* @version: 1.0* @email 1660420659@qq.com* @description: TODO*/
public class BufferWriterTest {
​@Testpublic  void bufferWriter() throws IOException {
​BufferedWriter  writer = new BufferedWriter(new FileWriter("f:\\c.txt"));
​writer.write("hello,你好啊,宝贝1");//插入一个和系统相关的换行符writer.newLine();writer.write("hello,你好啊,宝贝2");writer.newLine();writer.write("hello,你好啊,宝贝3");
​writer.close();
​}
​//如果设置的是追加@Testpublic  void bufferWriter2() throws IOException {//new FileWriter("f:\\c.txt",true) 以追加的方式写入到文件中BufferedWriter  writer = new BufferedWriter(new FileWriter("f:\\c.txt",true));
​writer.write("hello,你好啊,宝贝1");//插入一个和系统相关的换行符writer.newLine();writer.write("hello,你好啊,宝贝2");writer.newLine();writer.write("hello,你好啊,宝贝3");writer.close();
​}
}
​

案例3 同时使用

要求:使用BufferedReader和BufferedWriter 完成文本的拷贝

package com.sofwin.config;
​
import java.io.*;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 15:38* @version: 1.0* @email 1660420659@qq.com* @description: TODO*/
public class BufferedCopy {public static void main(String[]args)  {String srcFilePath = "f:\\c.txt";String destFilePath = "f:\\wt.txt";BufferedReader bufferedReader = null;BufferedWriter bufferedWriter = null;String str ;try {bufferedReader = new BufferedReader(new FileReader(srcFilePath));bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));//readLine 读取一行数据 但是没有带换行while ((str = bufferedReader.readLine()) !=null) {bufferedWriter.write(str);bufferedWriter.newLine(); //进行换行}System.out.println("拷贝完毕");} catch (IOException e) {e.printStackTrace();} finally {try {if (bufferedReader != null) {bufferedReader.close();}if (bufferedWriter != null) {bufferedWriter.close();}} catch (IOException e) {e.printStackTrace();}
​}
​}
}
​

9、BufferedInputStream 和 BufferedOutputStream

BufferedInputStream ,在创建的时候,会创建一个内部缓冲区数组

BufferedOutputStream 实现了缓冲的输出流,可以讲多个字节写入底层输出流和在那个,而不必对每次字节写入调用底层系统

应用 同时使用

要求:使用BufferedInputStream 和 BufferedOutputStream 完成对图片/音乐的拷贝

package com.sofwin.config;
​
import java.io.*;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 15:58* @version: 1.0* @email 1660420659@qq.com* @description: 使用BufferedInputStream 和 BufferedOutputStream 完成对图片/音乐的拷贝* 字节流可以操作文本文件的拷贝吗?  可以操作*/
public class BufferedTest {public static void main(String[]args){String srcFilePath = "e:\\1.JPG"; //源文件位置String destFilePath = "e:\\wt.JPG"; //目的位置BufferedInputStream inputStream = null;BufferedOutputStream outputStream = null;byte[] b = new byte[1024];int readLen = 0;try {inputStream = new BufferedInputStream(new FileInputStream(srcFilePath));outputStream = new BufferedOutputStream(new FileOutputStream(destFilePath));while ((readLen = inputStream.read(b)) != -1) {outputStream.write(b,0,readLen);}System.out.println("拷贝成功");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//关闭流try {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}} catch (IOException e) {e.printStackTrace();}}}
}

10、 对象流 ObjectInputStream 和 ObjectOutputStream

10.1 需求:

  1. 将 int num = 10这个int数据保存到文件中,注意保存的不单单是数据,还有数据类型,使得我们能够从文件中直接恢复int num = 10

  2. 将Dog dog = new Dog(“旺财”,3)这个对象保存到文件中,并且能够从文件中恢复成dog对象

  3. 上面的要求,就是能够将基本数据类型或者对象进行序列化和反序列化

10.2 序列化和反序列化

  1. 序列化就是保存数据的时候,保存数据的值和数据类型

  2. 反序列化就是恢复数据的时候,恢复数据的值和数据类型

  3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让类是可序列化的,该类必须要实现如下两个接口的一个

    • Serializable (推荐 这个是一个标记接口)

    • Externallizable //该接口有方法需要实现,一般我们使用上面的Serializable接口

10.3 对象流 ObjectInputStream 和 ObjectOutputStream

  1. 功能:提供了对基本数据类型或者对象类型的序列化和反序列化的方法

  2. ObjectOutputStream 提供了序列化的功能

  3. ObjectInputStream 提供了反序列化的功能

  4. 这两个也是处理流(包装流)

10.4 案例 ObjectOutputStream 序列化

要求:使用ObjectOutputStream 序列化基本数据类型和一个Dog对象(name ,age) ,并保存到data.txt文件中

package com.sofwin.config;
​
import java.io.*;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 16:44* @version: 1.0* @email 1660420659@qq.com* @description: 使用ObjectOutputStream 序列化基本数据类型和一个Dog对象(name ,age) ,并保存到data.txt文件中*/
public class ObjectOutputStream_ {public static void main(String[]args) throws IOException {//序列化后保存的文件格式,不是存文本的,而是按照它的格式保存的String filePaht ="e:\\data.txt";ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePaht));//序列化数据到文件中//100 -->Integer --> 这个类实现了Serializable接口objectOutputStream.writeInt(100);objectOutputStream.writeBoolean(true);objectOutputStream.writeChar('a');objectOutputStream.writeDouble(9.5);objectOutputStream.writeUTF("风花雪月");//保存一个Dog对象objectOutputStream.writeObject(new Dog("大黄",2));objectOutputStream.close();System.out.println("数据化序列化到文件中");
​
​}
}
class  Dog implements Serializable {private  String name;private  int age ;
​public Dog(String name, int age) {this.name = name;this.age = age;}
}
​

10.5 案例 ObjectInputStream 反序列化

要求:使用ObjectInputStream data.txt文件中数据反序列化出来

package com.sofwin.config;
​
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 16:54* @version: 1.0* @email 1660420659@qq.com* @description: TODO*/
public class ObjectInputStream_ {public static void main(String[]args) throws IOException, ClassNotFoundException {String filePath ="e:\\data.txt";
​ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filePath));//注意: 读取顺序一定要和存储的顺序一致  否则会出现异常int read = objectInputStream.readInt();System.out.println(read);boolean b = objectInputStream.readBoolean();System.out.println(b);char c = objectInputStream.readChar();System.out.println(c);double v = objectInputStream.readDouble();System.out.println(v);String s = objectInputStream.readUTF();System.out.println(s);//o的编译运行是Object  运行类型是dogObject o = objectInputStream.readObject();System.out.println(o.getClass());System.out.println(o);//这里有一个非常很重要的细节//1.如果我们希望调用Dog的方法 需要向下转型//但是我们没有创建Dog类  所以需要将Dog类拷贝到key引入的位置System.out.println("解读完毕");objectInputStream.close();}
}
​

10.6 对象处理流的注意事项

  1. 读写顺序要一致

  2. 要求实现序列化或反序列化的对象,需要实现Serializable接口

  3. 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性

  4. 序列化对象的时候,默认将里面的所有属性进行序列化,但是除了static或transient修饰的成员

  5. 序列化对象的时候,要求里面的数据性类型也需要实现序列化接口

  6. 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化

11、标准输入输出流

类型 默认设备
System.in 标准输入 InputStream 键盘
System.out 标准输出 PrintStream 显示器
package com.sofwin.config;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 19:45* @version: 1.0* @email 1660420659@qq.com* @description: TODO*/
public class standardInputAndOutput {public static void main(String[]args){//System类 public final static InputStream in = null;//它的编译类型 InputStream    运行类型 BufferedInputStream//标准输入 键盘System.out.println(System.in.getClass());
​//public final static PrintStream out = null;//编译类型 PrintStream   运行类型 PrintStream//表示标准输出 显示器System.out.println(System.out.getClass());}
}

11.1 案例

  • 传统方法 System.out.println() 是使用out对象将数据输出到显示器

  • 传统方法 Scanner scan = new Scanner(System.in) 是从标准输入键盘接受数据

12、 转换流

12.1 为什么需要转换流

package com.sofwin.config;
​
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 19:55* @version: 1.0* @email 1660420659@qq.com* @description: 看一个中文乱码问题*/
public class Transformation {public static void main(String[]args) throws IOException {//读取f:\\node.txt 文件到程序//创建字符输入流  BufferReader 处理流//在默认情况下 读取文件是按照utf-8编码读取的//如果修改成国标码后 就会出现中文路那么问题了//这个时候就出现了转换流 因为转换流可以设置编码格式 设置完毕后进行转换为字符流String s;BufferedReader bufferedReader = new BufferedReader(new FileReader("f:\\node.txt"));while ((s = bufferedReader.readLine()) != null) {System.out.println(s);}bufferedReader.close();}
}
​

12.2 InputStreamReader 和 OutputStreamWriter

  1. InputStreamReader 是Reader的子类 可以将InputStream (字节流)包装成Reader(字符流)

  2. OutputStreamWriter 是Writer的子类 实现将OutputStream(字节流)包装成Writer(字符流)

  3. 当处理纯文本数据的时候,如果使用字符流效率更高,并且可以有效解决中文乱码问题,所以建议将字节流转换成字符流

  4. 可以在使用时指定编码格式(比如 utf-8、gbk、iso8850-1)

案例:

要求 字节流FileInputStream 包装成字符流InputStreamReader,对文件进行读取 按照gbk格式,进而包装成ufferedReader

package com.sofwin.config;
​
import com.sun.org.apache.bcel.internal.generic.NEW;
​
import java.io.*;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 19:55* @version: 1.0* @email 1660420659@qq.com* @description: FileInputStream 转换为 InputStreamReader 指定编码gbk*/
public class Transformation {public static void main(String[] args) throws IOException {String s;BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("f:\\node.txt"), "gbk"));while ((s = bufferedReader.readLine()) != null) {System.out.println(s);}bufferedReader.close();}
}

案例:

要求: 编程将字节流FileOutputStream 保证成字符流 OutputStreamWriter,对文件进行写入(按照gbk的格式)

package com.sofwin.config;
​
import java.io.*;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 20:39* @version: 1.0* @email 1660420659@qq.com* @description: TODO*/
public class OutputStreamWriter_ {public static void main(String[]args) throws IOException {OutputStreamWriter gbk = new OutputStreamWriter(new FileOutputStream("f:\\lkj.txt"), "gbk");gbk.write("我是一个小孩子\n");gbk.write("java开发");gbk.close();System.out.println("保存文件,按照gbk格式");}
}
​

13、打印流

打印了只有输出流,没有输入流

PrintStream(字节流) 和 PrintWriter(字符流)

13.1 PrintStream

package com.sofwin.config;
​
import java.io.IOException;
import java.io.PrintStream;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 20:49* @version: 1.0* @email 1660420659@qq.com* @description: PrintStream 字节打印流*/
public class PrintStream_ {public static void main(String[]args) throws IOException {PrintStream out = System.out;
​//在默认情况下 打印流PrintStream 输出数据的位置是 标准输出显示器/*public void print(String s) {if (s == null) {s = "null";}write(s);}*/out.print("join hello");//因为print底层使用的write  所以我们可以直接调用write进行打印/输出out.write("哈哈,小宝贝".getBytes());out.close();
​//我们可以去修改打印流输出的位置System.setOut(new PrintStream("e:\\t1.txt"));System.out.println("hello 李科技");}
}

13.2 PrintWriter

package com.sofwin.config;
​
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 21:09* @version: 1.0* @email 1660420659@qq.com* @description: 演示PrintWriter 使用方式*/
public class PrintWriter_ {public static void main(String[]args) throws IOException {
//        PrintWriter writer  = new PrintWriter(System.out); //默认控制台//指定位置PrintWriter writer  = new PrintWriter(new FileWriter("e:\\f2.txt"));writer.print("北京你好");writer.close();  //如果不关闭  无法写入
​
​}
}

14、 Properties类

传统方法获取 Properties类中的jdbc.driver对应的值

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/xiangmu?serverTimezone=UTC
jdbc.username=root
jdbc.pwd=root
package com.sofwin.config;
​
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 21:27* @version: 1.0* @email 1660420659@qq.com* @description: 传统方式获取properties文件内容  * */
public class Porperties_01 {public static void main(String[]args) throws IOException {BufferedReader bufferedReader = new BufferedReader(new FileReader("jdbc.properties"));String data;while ((data = bufferedReader.readLine()) != null) {//要求我们获取指定jdbc.driver的值String[] split = data.split("=");System.out.println(split[0]+"对应的值:"+split[1]);}bufferedReader.close();}
}

使用传统的方法我们是可以读取到 xxx .properties文件

但是读取的是一行数据,我们只是对应等号右边的值

因此我们得到的数据 还要进行处理,当数据量多的时候,处理麻烦

所以这时候就引出了Properties类 专门进行处理 xxx.properties文件 ,非常方便

14.1 基本介绍

  1. 专门用于读写配置文件的集合类

    配置文件的格式: 键=值

  2. 注意:键值对不需要空格,值不需要用引号引起来。默认类型是String

14.2 常见方法

  • load 加载配置文件的键值对到Properties对象

  • list 将数据显示到指定设备/流对象

  • getProperty(key) 根据键获取值

  • setPorperty(key,value) 设置键值对到Properties对象

  • store 将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码

package com.sofwin.config;
​
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
​
/*** @packageName: com.sofwin.config* @author: wentao* @date: 2022/11/8 22:41* @version: 1.0* @email 1660420659@qq.com* @description: TODO*/
public class Properties02 {public static void main(String[]args) throws IOException {//1.使用Properties类来读取jdbc.properties文件Properties properties = new Properties();//2.加载指定的配置文件properties.load(new FileReader("D:\\springboot\\springbootTest\\springboot_01_01test\\src\\main\\resources\\jdbc.properties"));//3.显示到控制台properties.list(System.out);//4.根据key获取值String userName = properties.getProperty("jdbc.username");String pwd = properties.getProperty("jdbc.pwd");System.out.println("userName:"+userName);System.out.println("pwd:"+pwd);//5. 添加/修改键值对 如果没有key就是创建  如果有key 就是相当于替换(修改)properties.setProperty("wt","123456");properties.setProperty("lkh","李科技");//6.将键值对保存起来//第二个null 代表一个注释  如果有的话直接会在properties文件最上面写上注释properties.store(new FileOutputStream("D:\\springboot\\springbootTest\\springboot_01_01test\\src\\main\\resources\\jdbc.properties"),null);
​}
}

java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类相关推荐

  1. Java基础IO流之字符流的使用

    ☆引言☆ 大家好,我是痛而不言笑而不语的浅伤.IO流分为字节流和字符流,而上一篇文章我们学习了字节流(Java基础IO流之字符流的使用),这篇文章带大家一起来学习字符流吧.对文章中描述错误的希望大家积 ...

  2. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  3. # Java基础——IO流

    Java基础--IO流 File类的使用(熟悉构造器和方法的使用) File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) File类的声明在java.io包下 文件和文件目录路径的抽象表示 ...

  4. Java基础-IO流之其他流

    1. 缓冲流 昨天学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等.这些功能更为强大的流,都是在基本 ...

  5. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  6. Java基础—IO流(三)

    IO流(三) File类 一.概述 File类用于将文件或文件夹封装成对象,方便对文件和文件夹的属性信息进行操作.该类可以作为参数传递给IO流的构造函数,弥补流对象在操作文件和文件夹上的缺陷. 二.F ...

  7. java基础----IO打印流PrintStream

    package com.henu.io;import java.io.PrintStream;/** •public PrintStream(String fileName): 使用指定的文件名创建一 ...

  8. 黑马 程序员——Java基础---IO(下)

    黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...

  9. Java基础IO流概述、字符流、字节流、流操作规律、File类、Properties类、打印流、序列流

    IO流:(Input Output)流 字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的码表,获取对应的文字进行操作 简单说:字符流 = 字节流 + 编码表 字节流的两个顶层父 ...

最新文章

  1. 转:python——IPy库
  2. 七十三、Python | Leetcode数字系列(上篇)
  3. 11.Java面向对象(二)
  4. [JS] 修改Navigator对象
  5. C#LeetCode刷题之#589-N叉树的前序遍历(N-ary Tree Preorder Traversal)
  6. FluorineFx:视频录制及回放(Flash/AS3环境)
  7. 吴恩达教授机器学习课程笔记【三】广义线性模型(1)-指数族分布
  8. logistic模型预测人口python_基于python的logistic回归建模预测
  9. Ubuntu下安装stlink-v2驱动
  10. java deff_java – 在配置中添加时出现Spring NoClassDefF...
  11. Python制作七夕表白实例项目-让你的情人心动起来
  12. Web开发 | Spring4 - 01.Spring的概述
  13. java byte数组和文件互转
  14. 梦幻西游服务器维护,《梦幻西游》12月1日维护公告
  15. OCI runtime create failed: runc create failed: unable to start container process: --docker加载镜像
  16. Moveit运动学模型
  17. 数字电子技术复习第一章
  18. 求两个矩阵中向量的欧氏距离(python实现)
  19. 关于bfs的原理和应用
  20. 【转载】简单好用的粉碎文件方法

热门文章

  1. 知晓当前是在哪一个 Activity Kotlin.Android
  2. SpringBoot引入Dubbo问题解析
  3. 10649物联卡查询, 10649物联卡官网
  4. 手把手教学--Python爬取有道词典
  5. acmclub 2081 班级聚会上的游戏
  6. Laravel Trait method broker has not been applied, because there are collisions with other trait meth
  7. 分数测试录取率软件,圆梦志愿app准吗?测试大学录取概率高吗?
  8. IPS性能测试实践一
  9. python读书心得体会范文_读书心得体会范文五篇-读书心得体会
  10. Shortcuts快速入门