IO流的讲解(4)

这篇具有很好参考价值的文章主要介绍了IO流的讲解(4)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

转换流

基本介绍

应用案例1

应用案例2

打印流

演示PrintStream (字节打印流/输出流)

演示 PrintWriter 使用方式

Properties类

Properties基本介绍

应用案例

本章习题

第一题

第二题

第三题


转换流

基本介绍

Java中的转换流是用来处理字符和字节之间转换的流。转换流在字节输入流和字节输出流之间起到了一个桥梁的作用,它可以将字节流转换成字符流或者将字符流转换成字节流。

Java中提供了两种转换流:InputStreamReader和OutputStreamWriter。InputStreamReader将字节输入流转换成字符输入流,OutputStreamWriter将字符输出流转换成字节输出流。这两种转换流都接收一个字符集名称作为参数,该字符集决定了字节到字符的转换方式。

注意事项

使用InputStreamReader和OutputStreamWriter时需要注意字符集的问题,如果不指定字符集或者指定错误的字符集可能会导致乱码问题。常见的字符集有UTF-8、GBK、ISO-8859-1等。

应用案例1

代码演示:

package com.transformation;

import java.io.*;

/**
 * 演示使用 InputStreamReader 转换流解决中文乱码问题
 * 将字节流 FileInputStream 转成字符流  InputStreamReader, 指定编码 gbk/utf-8
 */
public class InputStreamReader_ {
    public static void main(String[] args) throws IOException {

        String filePath = "e:\\abc.txt";
        //解读
        //1. 把 FileInputStream 转成 InputStreamReader
        //2. 指定编码 gbk
        //InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");
        //3. 把 InputStreamReader 传入 BufferedReader
        //BufferedReader br = new BufferedReader(isr);

        //将2 和 3 合在一起
        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(filePath), "gbk"));

        //4. 读取
        String s = br.readLine();
        System.out.println("读取内容=" + s);
        //5. 关闭外层流
        br.close();

    }
}

应用案例2

代码演示:

package com.transformation;

import java.io.*;

/**
 * 演示 OutputStreamWriter 使用
 * 把FileOutputStream 字节流,转成字符流 OutputStreamWriter
 * 指定处理的编码 gbk/utf-8/utf8
 */
public class OutputStreamWriter_ {
    public static void main(String[] args) throws IOException {
        String filePath = "e:\\hello.txt";
        String charSet = "utf-8";
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charSet);
        osw.write("hi, 你好");
        osw.close();
        System.out.println("按照 " + charSet + " 保存文件成功~");
    }
}

打印流

演示PrintStream (字节打印流/输出流)

代码演示:

package com.printstream;

import java.io.IOException;
import java.io.PrintStream;

/**
 * 演示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("john, hello");
        //因为print底层使用的是write , 所以我们可以直接调用write进行打印/输出
        out.write("你好".getBytes());
        out.close();

        //我们可以去修改打印流输出的位置/设备
        //1. 输出修改成到 "e:\\f1.txt"
        //2. "hello, 你好" 就会输出到 e:\f1.txt
        //3. public static void setOut(PrintStream out) {
        //        checkIO();
        //        setOut0(out); // native 方法,修改了out
        //   }
        System.setOut(new PrintStream("e:\\f1.txt"));
        System.out.println("hello, 你好");


    }
}

演示 PrintWriter 使用方式

代码演示:

package com.transformation;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 演示 PrintWriter 使用方式
 */
public class PrintWriter_ {
    public static void main(String[] args) throws IOException {

        //PrintWriter printWriter = new PrintWriter(System.out);
        PrintWriter printWriter = new PrintWriter(new FileWriter("e:\\f2.txt"));
        printWriter.print("hi, 北京你好~~~~");
        printWriter.close();//flush + 关闭流, 才会将数据写入到文件..

    }
}

Properties类

Properties基本介绍

Java中的Properties是一个可以保存键值对的类。它是Hashtable的子类,因此可以使用Hashtable的方法来查询和操作其中的元素。Properties类常用于读取和写入配置文件,例如数据库连接信息、应用程序设置等。

Properties类中的键和值都是字符串类型。可以使用getProperty(String key)方法通过键获取对应的值。也可以使用setProperty(String key, String value)方法向Properties中添加新的键值对。

Properties常用方法

  1. getProperty(String key): 获取指定键的值。
  2. setProperty(String key, String value): 设置指定键的值。
  3. load(InputStream inStream): 从输入流中加载属性列表。
  4. load(Reader reader): 从字符输入流中加载属性列表。
  5. store(OutputStream out, String comments): 将属性列表写入输出流。
  6. store(Writer writer, String comments): 将属性列表写入字符输出流。
  7. getProperty(String key, String defaultValue): 获取指定键的值,如果不存在返回默认值。
  8. stringPropertyNames(): 返回所有的属性键值。
  9. getPropertyNames(): 返回所有的属性键对象。
  10. list(PrintStream out): 将属性列表输出到指定的输出流。
  11. list(PrintWriter out): 将属性列表输出到指定的输出流。

应用案例

代码演示:

package com.properties_;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

public class Properties02 {
    public static void main(String[] args) throws IOException {
        //使用Properties 类来读取mysql.properties 文件

        //1. 创建Properties 对象
        Properties properties = new Properties();
        //2. 加载指定配置文件
        properties.load(new FileReader("src\\mysql.properties"));
        //3. 把k-v显示控制台
        properties.list(System.out);
        //4. 根据key 获取对应的值
        String user = properties.getProperty("user");
        String pwd = properties.getProperty("pwd");
        System.out.println("用户名=" + user);
        System.out.println("密码是=" + pwd);

    }
}

本章习题

第一题

代码演示:

要求:

(1)在判断e盘下是否有文件夹my temp ,如果没有就创建my  temp
(2)在e:  my  temp 目录下,创建文件 hello.txt
(3)如果hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了
(4)并且在hello.txt 文件中,写入 hello,world~

package com.homework;

import java.io.*;

/*
(1)在判断e盘下是否有文件夹my temp ,如果没有就创建my  temp
(2)在e:  my  temp 目录下,创建文件 hello.txt
(3)如果hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了
(4)并且在hello.txt 文件中,写入 hello,world~
 */
public class Homework01 {
    public static void main(String[] args) throws IOException {

        String directoryPath = "e:\\mytemp";//文件夹的路径
        File file = new File(directoryPath);
        if (!file.exists()) {//判断mytemp这个文件夹是否存在,如果不存在取反为真,会进入if语句  如果存在取反为false,不会进入if语句
            //创建
            if (file.mkdirs()) {
                System.out.println("创建 " + directoryPath + " 创建成功");
            } else {
                System.out.println("创建 " + directoryPath + " 创建失败");
            }
        }

        //第一种方法
//        String filepath = "hello.txt";
//        file = new File(directoryPath, filepath);

        //第二种方法
        String filepath = directoryPath + "\\hello.txt";
        file = new File(filepath);

        if (!file.exists()) {//判断文件是否存在,如果存在取反为假会进入else语句,如果文件不存在取反为真会创建文件
            if (file.createNewFile()) {
                System.out.println(filepath + "文件创建成功");
                //文件已经存在写入信息
                BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
                bufferedWriter.write("hello word,你好");//写入信息
                bufferedWriter.close();//关闭流
            } else {
                System.out.println(filepath + "文件创建失败");
            }
        } else {
            System.out.println(filepath + "已经存在不重复创建");
        }
    }
}

第二题

代码演示:

要求:

使用BufferedReader读取一个文本文件,为每行加上行号再连同内容一开输出到屏幕上。

package com.homework;

import java.io.*;

/*
要求: 使用BufferedReader读取一个文本文件,为每行加上行号再连同内容一开输出到屏幕上。
 */
public class Homework02 {
    public static void main(String[] args) {
        String path = "e:\\a1.java";
        String line = "";
        int i = 1;
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new FileReader(path));
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println((i++) + "\t" + line);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}


//如果把文件的编码 改成了 gbk,出现中文乱码,大家思考如何解决/1.默认是按照 utf-8 处理,开始没有乱码
// /2.提示: 使用我们的转换流,将 FilelnputStream -> InputStreamReader[可以指定编码> BufferedReader ..
//public class Homework02 {
//    public static void main(String[] args) {
//        String path = "e:\\abc.txt";
//        String line = "";
//        int i = 1;
//        BufferedReader bufferedReader1 = null;
//        InputStreamReader inputStreamReader = null;
//
//        try {
//            inputStreamReader= new InputStreamReader(new FileInputStream(path),"gbk");
//            bufferedReader1 = new BufferedReader(inputStreamReader);
//
//            //bufferedReader = new BufferedReader(new FileReader(path));
//            while ((line = bufferedReader1.readLine()) != null) {
//                System.out.println((i++) + "\t" + line);
//            }
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        } finally {
//            try {
//                if (bufferedReader1 != null) {
//                    bufferedReader1.close();
//                }
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//        }
//    }
//}

第三题

代码演示:

要求:

(1) 要编写一个dog.properties
name=tom
age=5
color=red
(2) 编写Dog 类(name,age,color) 创建一个dog对象,读取dog.properties 用相应的内容完成属性初始化,并输出
(3) 将创建的Dog 对象,序列化到 文件 dog.dat 文件

本题就是用到我们之前学习到的序列化和反序列,要记住序列化和反序列化的注意事项文章来源地址https://www.toymoban.com/news/detail-457810.html

package com.homework;

import java.io.*;
import java.util.Properties;

/*
(1) 要编写一个dog.properties
name=tom
age=5
color=red
(2) 编写Dog 类(name,age,color) 创建一个dog对象,读取dog.properties 用相应的内容完成属性初始化,并输出
(3) 将创建的Dog 对象,序列化到 文件 dog.dat 文件
 */
public class Homework03 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String path = "e:dog.dat";

        Properties properties = new Properties();
        Dog dog = new Dog("tom", 5, "red");
        properties.setProperty("name", dog.getName());
        properties.setProperty("age", dog.getAge() + "");//int 转成 String 在后面加“” 即可
        properties.setProperty("color", dog.getColor());


        properties.store(new FileOutputStream("src\\dog.properties"), null);

        properties.list(System.out);

        a(path);
        b(path);
    }

    public static void a(String path) throws IOException {//序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(path));
        objectOutputStream.writeObject(new Dog("tom", 5, "red"));
        objectOutputStream.close();
        System.out.println("序列化保存成功");
    }

    public static void b(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(path));
        Object dog = objectInputStream.readObject();
        System.out.println(dog);
        objectInputStream.close();
        System.out.println("反序列化");
    }
}

class Dog implements Serializable {
    private String name;
    private int age;
    private String color;

    public Dog(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    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;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}

到了这里,关于IO流的讲解(4)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包