• IO流【】【】【】


    目录

     IO流体系结构

    文件基础知识 

    常用的文件操作

     获取文件信息方法 

     IO流原理和流的分类

    IO流常用的类

    节点流

    FileInputStream 字节输入流

    FileoutputStream 字节输出流

    实现拷贝任务。

    字符流FileRead和FileWrite

    ​编辑 FileRead

    FileWriter

    节点流和处理流

    缓冲流 

    BufferedReader

    BufferedWriter

    复制操作

    BufferedInputStream\BufferedOutputStream复制二进制文件

    对象处理流 

    ObjectOutputStream 序列化保存

     ObjectInputStream 反序列化

    标准输入输出流

    结点和处理流

     ImputStreamReader

     OutputStreamWriter

     打印流printStream和printWriter

     Properties类


     IO流体系结构

    文件基础知识 

     

    常用的文件操作

     获取文件信息方法 

    1. @Test
    2. public void info(){
    3. File file = new File("e:\\news1.txt");
    4. System.out.println("文件名字"+file.getName());
    5. System.out.println("文件绝对路径"+file.getAbsolutePath());
    6. System.out.println("文件父目录"+file.getParent());
    7. System.out.println("文件大小"+file.length());
    8. System.out.println("文件是否存在"+file.exists());
    9. System.out.println("是不是一个文件"+file.isFile());
    10. System.out.println("是不是一个目录"+file.isDirectory());
    11. }

     IO流原理和流的分类

     

    字节流主要用来处理二进制文件(doc、音频、视频),也可以处理文本文件

    字符流用来处理字符文件(文本文件) 

    IO流常用的类

     类的继承关系

    节点流

    FileInputStream 字节输入流

     read()读取文件中的数据

    如果文件中有中文,会出现中文乱码问题

    1. @Test
    2. public void readFile01(){
    3. String filePath = "e:\\IoTest\\hello.txt";
    4. int read = 0;
    5. FileInputStream fileInputStream =null;
    6. try {
    7. fileInputStream = new FileInputStream(filePath);
    8. while ((read = fileInputStream.read()) != -1){
    9. System.out.print((char)read);
    10. }
    11. } catch (IOException e) {
    12. e.printStackTrace();
    13. }finally {//关闭流 释放资源
    14. try {
    15. fileInputStream.close();
    16. } catch (IOException e) {
    17. e.printStackTrace();
    18. }
    19. }
    20. }

     read(byte[] b)一次性一个数组长度的字符

    1. @Test //使用read(byte[] b)的方法一次性读取多个字符
    2. public void readFile02(){
    3. String filePath = "e:\\IoTest\\hello.txt";
    4. int read = 0;
    5. //新建个数组
    6. byte[] buf =new byte[8];//一次读取8个字符
    7. int readLen = 0;
    8. FileInputStream fileInputStream =null;
    9. try {
    10. fileInputStream = new FileInputStream(filePath);
    11. //该输入流最多读取b。length字节的数据到字节数组。
    12. //返回值为-1 表示读取完毕
    13. //如果读取正常,返回读取的字符数
    14. while ((readLen = fileInputStream.read(buf)) != -1){
    15. System.out.print(new String(buf,0,readLen));
    16. }
    17. } catch (IOException e) {
    18. e.printStackTrace();
    19. }finally {//关闭流 释放资源
    20. try {
    21. fileInputStream.close();
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }
    25. }
    26. }

    FileoutputStream 字节输出流

     write()三种输出到文件方法

    1. @Test
    2. public void writeFile(){
    3. String filePath = "e:\\IoTest\\hello.txt";
    4. FileOutputStream fileOutputStream = null;
    5. try {
    6. fileOutputStream = new FileOutputStream(filePath);
    7. /*fileOutputStream.write('A');//写入一个字节*/ //方法一
    8. /* String string = "hello world";
    9. //get Byte()可以将字符串转成数组
    10. fileOutputStream.write(string.getBytes());//输出一个数组*/ //方法2
    11. //方法3输出指定长度字符串
    12. String string = "hhh hello world";
    13. fileOutputStream.write(string.getBytes(),0,3);
    14. } catch (IOException e) {
    15. e.printStackTrace();
    16. } finally {
    17. try {
    18. fileOutputStream.close();
    19. } catch (IOException e) {
    20. e.printStackTrace();
    21. }
    22. }
    23. }

    上面的方法会覆盖原来的内容,要想追加用

    实现拷贝任务。

    1. public class FileCopy {
    2. public static void main(String[] args) {
    3. byte[] buf = new byte[1024];
    4. int fileLen = 0;
    5. FileInputStream fileInputStream =null;
    6. FileOutputStream fileOutputStream =null;
    7. String filePath1 ="e:\\copy.png";
    8. String filePath2 ="d:\\copy.png";
    9. try {
    10. fileInputStream = new FileInputStream(filePath1);
    11. fileOutputStream = new FileOutputStream(filePath2);
    12. while ((fileLen = fileInputStream.read(buf))!= -1){//边读边传
    13. fileOutputStream.write(buf,0,fileLen);
    14. }
    15. } catch (IOException e) {
    16. e.printStackTrace();
    17. } finally {
    18. try {
    19. if (fileInputStream != null){
    20. fileInputStream.close();
    21. }
    22. if (fileOutputStream != null){
    23. fileOutputStream.close();
    24. }
    25. } catch (IOException e) {
    26. e.printStackTrace();
    27. }
    28. }
    29. }
    30. }

    字符流FileRead和FileWrite

     FileRead

     单个字符读取

    1. @Test //单个字符读取
    2. public void Reader01(){
    3. FileReader fileReader01 =null;
    4. String filePath = "e:\\hello.txt";
    5. int date = 0;
    6. try {
    7. fileReader01 = new FileReader(filePath);
    8. //单个字符读取
    9. while ((date = fileReader01.read())!= -1){
    10. System.out.print((char) date);
    11. }
    12. } catch (IOException e) {
    13. e.printStackTrace();
    14. } finally {
    15. if (fileReader01 != null){
    16. try {
    17. fileReader01.close();
    18. } catch (IOException e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. }
    23. }

    数组读取

    1. @Test //数组读取
    2. public void reader(){
    3. FileReader fileReader02 =null;
    4. char[] buf = new char[10];
    5. int readLen = 0;
    6. String filePath = "e:\\hello.txt";
    7. try {
    8. fileReader02 = new FileReader(filePath);
    9. while ((readLen = fileReader02.read(buf)) != -1){
    10. System.out.println(new String(buf,0,readLen));
    11. }
    12. } catch (IOException e) {
    13. e.printStackTrace();
    14. } finally {
    15. if (fileReader02 != null){
    16. try {
    17. fileReader02.close();
    18. } catch (IOException e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. }
    23. }

    FileWriter

    使用方法

    1. @Test
    2. public void writer(){
    3. FileWriter fileWriter = null;
    4. String filePath ="e:\\hello.txt";
    5. char[] buf = {'A','B','C'};
    6. try {
    7. fileWriter = new FileWriter(filePath);
    8. fileWriter.write('擦');//输入单个字符
    9. fileWriter.write("输入整个字符串");//输入
    10. fileWriter.write("输入整个字符串",0,3);
    11. fileWriter.write(buf);//输入整个buf数组
    12. fileWriter.write(buf,0,1);//输入buf数组0-1部分
    13. System.out.println("添加成功");
    14. } catch (IOException e) {
    15. e.printStackTrace();
    16. } finally {
    17. try {
    18. fileWriter.close();
    19. } catch (IOException e) {
    20. e.printStackTrace();
    21. }
    22. }
    23. }

    节点流和处理流

     

    缓冲流 

    BufferedReader

    1. //bufferedReader 使用
    2. public class BufferedReader_ {
    3. public static void main(String[] args) throws Exception {
    4. String filePath = "e:\\hello.txt";
    5. String line;//按行读取
    6. //创建bufferedReader
    7. BufferedReader bufferedReader =new BufferedReader(new FileReader(filePath));
    8. while ((line = bufferedReader.readLine()) != null){//readLine 返回为null时表示为读取完毕
    9. System.out.println(line);
    10. }
    11. bufferedReader.close();//只需要关闭bufferedReader就行,传入的new FileReader(filePath)会在底层关闭
    12. }
    13. }

    BufferedWriter

    1. public class BufferedWriter_ {
    2. public static void main(String[] args) throws IOException {
    3. String filePath = "e:\\hello.txt";
    4. char[] buf ={'a','b','c'};
    5. //创建BufferedWriter
    6. BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));
    7. bufferedWriter.write("红红火火恍恍惚惚");
    8. bufferedWriter.newLine();//插入一个换行
    9. bufferedWriter.write(buf,1,2);
    10. //关闭外层流
    11. bufferedWriter.close();
    12. }
    13. }

    复制操作

    1. public class BufferedCopy_ {
    2. public static void main(String[] args) throws IOException {
    3. String filePath = "e:\\hello.txt";
    4. String destFilePath = "d:\\hello.txt";
    5. String line;
    6. BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
    7. BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));
    8. while ((line = bufferedReader.readLine()) != null){
    9. bufferedWriter.write(line);//每读取一行,粘贴一行
    10. bufferedWriter.newLine();//换行
    11. System.out.println("以复制过去一行");
    12. }
    13. bufferedReader.close();
    14. bufferedWriter.close();
    15. }
    16. }

    BufferedInputStream\BufferedOutputStream复制二进制文件

    1. public class BufferedCopy02_ {
    2. public static void main(String[] args) throws IOException {
    3. int date = 0;
    4. byte[] buf = new byte[1080];//每次读取1080个字节
    5. String srcFilePath = "e:\\copy.png";//初始路径
    6. String destFilePath = "d:\\copy.png";//复制后路径
    7. BufferedInputStream bufferedReader =
    8. new BufferedInputStream(new FileInputStream(srcFilePath));//使用BufferedInputStream创建对象
    9. BufferedOutputStream bufferedOutputStream =
    10. new BufferedOutputStream(new FileOutputStream(destFilePath));//使用BufferedInputStream创建对象
    11. while ((date = bufferedReader.read(buf)) != -1){//循环取出字节,当bufferedReader.read(buf) = -1时表示取出完毕
    12. bufferedOutputStream.write(buf,0,date);
    13. }
    14. //关闭流
    15. bufferedOutputStream.close();
    16. bufferedReader.close();
    17. }
    18. }

    对象处理流 

    ObjectOutputStream 序列化保存

    1. //演示ObjectOutputStream的使用,完成数据的序列化
    2. public class ObjectOutputStream_ {
    3. public static void main(String[] args) throws IOException {
    4. //序列化后,保存的文本格式不是纯文本,而是按照他的格式来保存
    5. String filePath = "e:\\data.dat";
    6. ObjectOutputStream objectOutputStream =
    7. new ObjectOutputStream(new FileOutputStream(filePath));
    8. //序列化数据到指定位置
    9. objectOutputStream.writeInt(100);//int-->Integer(实现了Serializable)
    10. objectOutputStream.writeBoolean(true);//boolean->Boolean(实现了Serializable)
    11. objectOutputStream.writeChar('a');//char -Character
    12. objectOutputStream.writeDouble(0.5);//double Double
    13. objectOutputStream.writeUTF("是是是");//String
    14. objectOutputStream.writeObject(new Dog("旺财",10));
    15. objectOutputStream.close();
    16. System.out.println("数据保存完毕(以序列化形式)");
    17. }
    18. }
    19. class Dog implements Serializable {
    20. private String name;
    21. private int age;
    22. public Dog(String name, int age) {
    23. this.name = name;
    24. this.age = age;
    25. }
    26. }

     这些类都实现了Serializable接口,如下图。所有我们要把 Dog类也实现下。

     看下保存的文件

    出现乱码很正常,因为这个文件不是存文本的。 

     ObjectInputStream 反序列化

    1. //演示ObjectOutputStream的使用,完成数据的序列化
    2. public class ObjectOutputStream_ {
    3. public static void main(String[] args) throws IOException {
    4. //序列化后,保存的文本格式不是纯文本,而是按照他的格式来保存
    5. String filePath = "e:\\data.dat";
    6. ObjectOutputStream objectOutputStream =
    7. new ObjectOutputStream(new FileOutputStream(filePath));
    8. //序列化数据到指定位置
    9. objectOutputStream.writeInt(100);//int-->Integer(实现了Serializable)
    10. objectOutputStream.writeBoolean(true);//boolean->Boolean(实现了Serializable)
    11. objectOutputStream.writeChar('a');//char -Character
    12. objectOutputStream.writeDouble(0.5);//double Double
    13. objectOutputStream.writeUTF("是是是");//String
    14. objectOutputStream.writeObject(new Dog("旺财",10));
    15. objectOutputStream.close();
    16. System.out.println("数据保存完毕(以序列化形式)");
    17. }
    18. }

    反序列化成功 如果要重写toString方法,记得要再序列化一次再反序列化。要不然会抛出异常。

    可以理解成dog的存储内容也变了。

     

     3.

    加了这句话后如果对Dog类进行修改,程序就不会认为你是个全新的类,会认为只是版本号的修改 

    标准输入输出流

    1. public static void main(String[] args) {
    2. //System 类的 public final static InputSteam in = null;
    3. //System.in 编译类型 InputStream
    4. //System,in 运行类型 BufferedInputStream
    5. //代表标准输入 键盘
    6. System.out.println(System.in.getClass());
    7. //System.in 编译类型 printStream
    8. //System,in 运行类型 printStream
    9. //代表标准输出 显示器
    10. System.out.println(System.out.getClass());
    11. //用法
    12. System.out.println("hello");
    13. Scanner scanner = new Scanner(System.in);
    14. String next = scanner.next();
    15. System.out.println(next);
    16. }

    结点和处理流

    读取文件如下

    1. public class CodeQuestion {
    2. public static void main(String[] args) throws IOException {
    3. //读取文件
    4. //思路 使用BufferedReader对象读取文件
    5. //默认条件下是按照 utf-8 编码
    6. String filePath = "e:\\hello.txt";
    7. BufferedReader bufferedReader =
    8. new BufferedReader(new FileReader(filePath));
    9. String s = bufferedReader.readLine();
    10. System.out.println(s);
    11. bufferedReader.close();
    12. }
    13. }

    没有任何问题,但这是读取编码为UTF-8的文件,我们把文件格式换一个读取试试 

    出现了乱码,结点和处理流就是用来防止乱码的,出现这个问题的根本原因是没有指定这个文件的编码方式。

     

     ImputStreamReader

    1. //用InputStreamReader 解决中文乱码问题
    2. //将字节流 FileStreamReader 转成字符流 InputStreamReader
    3. public class InputStreamReader_ {
    4. public static void main(String[] args) throws IOException {
    5. String filePath ="e:\\hello.txt";
    6. // FileStreamReader 转成字符流 InputStreamReader 将InputStreamReader 转成 BufferedReader指定编码为gdk
    7. BufferedReader br =
    8. new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gbk"));
    9. String len = br.readLine();
    10. System.out.println(len);
    11. }
    12. }

     OutputStreamWriter

     

     打印流printStream和printWriter

     字节打印流printStream

    1. public class PrentStream {
    2. public static void main(String[] args) throws IOException {
    3. PrintStream out = System.out;
    4. out.println("sdads");//在标准情况下,PrintStream输出数据位置是 标准输出 (显示器)
    5. //因为Print底层用的是write 使用可以直接调用write进行打印
    6. out.write("sdasfasd".getBytes());
    7. //修改打印流输出的位置或设备
    8. System.setOut(new PrintStream("e:\\t1.txt"));
    9. System.out.println("hello zzz");
    10. out.close();
    11. }
    12. }

     字符打印流printWriter

    1. public class PrintWriter_ {
    2. public static void main(String[] args) throws IOException {
    3. PrintWriter printWriter = new PrintWriter(//FileWriter(System.in)就是默认输出位置
    4. new FileWriter("e:\\t1.txt"));
    5. printWriter.println("hhhhhh,您好");
    6. printWriter.close();
    7. }
    8. }

     Properties类

     

     

    1. //使用Properties来读取对象
    2. public class Properties1 {
    3. public static void main(String[] args) throws IOException {
    4. //1。创建Properties对象
    5. Properties properties = new Properties();
    6. //2.指定文件
    7. String filePath = "src\\mysql.properties";
    8. properties.load(new FileReader(filePath));
    9. //3.把键值对显示到控制台
    10. //properties.list(System.out);
    11. //根据k 获取对应的值(读取)
    12. String user = properties.getProperty("user");
    13. System.out.println(user);
    14. //创建(如果该文件没有这个key 是成绩,有这个key就是修改
    15. properties.setProperty("charset","utf8");
    16. properties.setProperty("pwd","abc111");
    17. properties.setProperty("name","汤姆");
    18. //将配置文件存储到文件中
    19. properties.store(new FileOutputStream
    20. ("src\\mysql.properties"),null);//这里的null代表注释
    21. }
    22. }

  • 相关阅读:
    【.NET Core】创建一个在后台运行的控制台程序(ConsoleApp)
    jdk11生成jre
    壁纸小程序Vue3(分类页面和用户页面基础布局)
    使用结构体组织相关联的数据(5)
    12. 测试搭建百万并发项目
    精通Nginx(14)-配置HTTPS
    设计模式之工厂模式(Factory)
    C# FileInfo类
    蓝桥杯1039
    Blink SQL内置函数大全
  • 原文地址:https://blog.csdn.net/hagong9/article/details/125960211