IO流进阶2

灰太狼 2022-06-11 08:10 309阅读 0赞

标准输入流 & 转换流 & 打印流

标准输入输出流

public static final InputStream in:标准输入流
public static final PrintStream out:标准输出流

转换流
OutputStreamWriter:将字节输出流转换为字符输出流

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.io.Writer;
  9. public class OutputStreamWriterDemo {
  10. public static void main(String[] args) throws IOException {
  11. //method2();
  12. //创建输入流对象
  13. BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
  14. //创建输出流对象
  15. //OutputStream os = System.out;
  16. //Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象
  17. //BufferedWriter bw = new BufferedWriter(w);
  18. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
  19. //进行数据的读写
  20. String line;//用于存储读取到的数据
  21. while((line = br.readLine()) != null) {
  22. bw.write(line);
  23. bw.newLine();
  24. }
  25. //释放资源
  26. bw.close();
  27. br.close();
  28. }
  29. private static void method2() throws FileNotFoundException, IOException {
  30. //创建输入流对象
  31. BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
  32. //创建输出流对象
  33. //OutputStream os = System.out;
  34. Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象
  35. //进行数据的读写
  36. String line;//用于存储读取到的数据
  37. while((line = br.readLine()) != null) {
  38. w.write(line);
  39. w.write("\r\n");
  40. }
  41. //释放资源
  42. w.close();
  43. br.close();
  44. }
  45. private static void method() throws FileNotFoundException, IOException {
  46. //创建输入流对象
  47. BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
  48. //创建输出流对象
  49. OutputStream os = System.out;
  50. String line;//用于存储读取到的数据
  51. while((line = br.readLine()) != null) {
  52. os.write(line.getBytes());
  53. os.write("\r\n".getBytes());
  54. }
  55. //释放资源
  56. os.close();
  57. br.close();
  58. }
  59. }

InputStreamReader:将字节输入流转换为字符输入流

  1. import java.io.FileWriter;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.Reader;
  6. public class InputStreamReaderDemo {
  7. public static void main(String[] args) throws IOException {
  8. //创建输入流对象
  9. InputStream is = System.in;
  10. Reader r = new InputStreamReader(is);
  11. //创建输出流对象
  12. FileWriter fw = new FileWriter("a.txt");
  13. //读写数据
  14. char[] chs = new char[1024];
  15. int len;
  16. while((len = r.read(chs)) != -1) {
  17. fw.write(chs,0,len);
  18. fw.flush();
  19. }
  20. //释放资源
  21. fw.close();
  22. is.close();
  23. }
  24. private static void method() throws IOException {
  25. //创建输入流对象
  26. InputStream is = System.in;
  27. //创建输出流对象
  28. FileWriter fw = new FileWriter("a.txt");
  29. //读写数据
  30. byte[] bys = new byte[1024];
  31. int len;//用于存储读取到的字节个数
  32. while((len = is.read(bys)) != -1) {
  33. fw.write(new String(bys,0,len));
  34. fw.flush();
  35. }
  36. //释放资源
  37. fw.close();
  38. is.close();
  39. }
  40. }

打印流

打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
字符打印流 PrintWriter
void print(String str): 输出任意类型的数据,
void println(String str): 输出任意类型的数据,自动写入换行操作

  1. import java.io.FileNotFoundException;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. public class PrintWriterDemo {
  5. public static void main(String[] args) throws IOException {
  6. //创建打印流对象
  7. PrintWriter pw = new PrintWriter("b.txt");
  8. //写出数据
  9. pw.write("hello");
  10. pw.write("world");
  11. pw.write("java");
  12. //释放资源
  13. pw.close();
  14. }
  15. }

利用打印流实现自动换行与自动更新

  1. import java.io.FileNotFoundException;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. public class PrintWriterDemo2 {
  6. public static void main(String[] args) throws IOException {
  7. //method();
  8. //创建打印流对象
  9. //PrintWriter pw = new PrintWriter("d.txt");
  10. PrintWriter pw = new PrintWriter(new FileWriter("d.txt"),true);
  11. pw.println("hello");
  12. pw.println("world");
  13. pw.println("java");
  14. //释放资源
  15. //pw.close();
  16. }
  17. private static void method() throws FileNotFoundException {
  18. //创建打印流对象
  19. PrintWriter pw = new PrintWriter("c.txt");
  20. pw.print("hello");
  21. pw.println("world");
  22. pw.println("java");
  23. //释放资源
  24. pw.close();
  25. }
  26. }

利用打印流将根目录下的SystemInOutDemo.java复制到d:\SystemInOutDemo.java下

  1. import java.io.BufferedReader;
  2. import java.io.FileReader;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. public class PrintWriterDemo3 {
  7. public static void main(String[] args) throws IOException {
  8. //创建输入流对象
  9. BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
  10. //创建打印流对象
  11. PrintWriter pw = new PrintWriter(new FileWriter("d:\\SystemInOutDemo.java"),true);
  12. String line;//用于存储读取到的每行数据
  13. while((line = br.readLine()) != null) {
  14. pw.println(line);
  15. }
  16. //释放资源
  17. pw.close();
  18. br.close();
  19. }
  20. }

对象操作流

概述
用于从流中读取对象的
ObjectInputStream 称为 反序列化流,利用输入流从文件中读取对象
ObjectOutputStream 称为 序列化流,利用输出流向文件中写入对象
特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

利用序列化流读写对象

  1. import java.io.Serializable;
  2. public class Student implements Serializable {
  3. String name;
  4. int age;
  5. public Student(String name,int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. @Override
  10. public String toString() {
  11. return "Student [name=" + name + ", age=" + age +"]";
  12. }
  13. }
  14. import java.io.EOFException;
  15. import java.io.FileInputStream;
  16. import java.io.FileNotFoundException;
  17. import java.io.FileOutputStream;
  18. import java.io.IOException;
  19. import java.io.ObjectInputStream;
  20. import java.io.ObjectOutputStream;
  21. public class ObjectOutputStreamDemo {
  22. public static void main(String[] args) throws IOException, ClassNotFoundException {
  23. //method();
  24. //创建对象输入流的对象
  25. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
  26. try {
  27. while(true) {
  28. Object obj = ois.readObject();
  29. System.out.println(obj);
  30. }
  31. } catch(EOFException e) {
  32. System.out.println("读到了文件的末尾");
  33. }
  34. //释放资源
  35. ois.close();
  36. }
  37. private static void method() throws IOException, FileNotFoundException {
  38. //创建对象输出流的对象
  39. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
  40. //创建学生对象
  41. Student s = new Student("zhangsan",18);
  42. Student s2 = new Student("lisi",19);
  43. //写出学生对象
  44. oos.writeObject(s);
  45. oos.writeObject(s2);
  46. //释放资源
  47. oos.close();
  48. }
  49. }

解决对象输入流读取对象出现异常的问题

  1. import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;
  7. import java.util.ArrayList;
  8. public class ObjectOutputStreamDemo3 {
  9. public static void main(String[] args) throws IOException, ClassNotFoundException {
  10. //method();
  11. //创建对象输入流的对象
  12. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.txt"));
  13. //读取数据
  14. Object obj = ois.readObject();
  15. //向下转型,获取具体的子类对象
  16. ArrayList<Student> list = (ArrayList<Student>) obj;
  17. for (Student student : list) {
  18. System.out.println(student);
  19. }
  20. //释放资源
  21. ois.close();
  22. }
  23. private static void method() throws IOException, FileNotFoundException {
  24. //创建对象输出流的对象
  25. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));
  26. //创建集合对象
  27. ArrayList<Student> list = new ArrayList<Student>();
  28. //添加学生对象
  29. list.add(new Student("wangwu",30));
  30. list.add(new Student("zhaoliu",28));
  31. //写出集合对象
  32. oos.writeObject(list);
  33. //释放资源
  34. oos.close();
  35. }
  36. }

解决读写对象版本不一致问题

  1. import java.io.Serializable;
  2. public class Student implements Serializable {
  3. private static final long serialVersionUID = 6361890890437825953L;
  4. String name;
  5. int age;
  6. String gender;
  7. public Student(String name,int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. @Override
  12. public String toString() {
  13. return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
  14. }
  15. }
  16. import java.io.FileInputStream;
  17. import java.io.FileNotFoundException;
  18. import java.io.FileOutputStream;
  19. import java.io.IOException;
  20. import java.io.ObjectInputStream;
  21. import java.io.ObjectOutputStream;
  22. public class ObjectOutputStreamDemo4 {
  23. public static void main(String[] args) throws IOException, ClassNotFoundException {
  24. //method();
  25. method2();
  26. }
  27. //读取学生对象
  28. private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {
  29. //创建对象输入流的对象
  30. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c.txt"));
  31. //读取对象
  32. Object obj = ois.readObject();
  33. System.out.println(obj);
  34. //释放资源
  35. ois.close();
  36. }
  37. //写出学生对象
  38. private static void method() throws IOException, FileNotFoundException {
  39. //创建对象输出流的对象
  40. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c.txt"));
  41. //创建的学生对象
  42. Student s = new Student("qianqi",28);
  43. //写出学生对象
  44. oos.writeObject(s);
  45. //释放资源
  46. oos.close();
  47. }
  48. }

Properties集合

Properties介绍

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

  1. 特点:
  2. 1Hashtable的子类,map集合中的方法都可以用。
  3. 2、该集合没有泛型。键值都是字符串。
  4. 3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
  5. 4、有和流技术相结合的方法。

这里写图片描述

利用Properties存储键值对

  1. import java.util.Map;
  2. import java.util.Properties;
  3. import java.util.Set;
  4. public class PropertiesDemo2 {
  5. public static void main(String[] args) {
  6. //创建属性列表对象
  7. Properties prop = new Properties();
  8. //添加映射关系
  9. prop.put("CZBK001", "zhangsan");
  10. prop.put("CZBK002", "lisi");
  11. prop.put("CZBK003", "wangwu");
  12. //遍历属性列表
  13. //获取所有的key,通过key获取value
  14. Set<Object> keys = prop.keySet();
  15. for (Object key : keys) {
  16. Object value = prop.get(key);
  17. System.out.println(key + "=" + value);
  18. }
  19. System.out.println("------------------");
  20. //获取所有的结婚证对象
  21. Set<Map.Entry<Object,Object>> entrys = prop.entrySet();
  22. for (Map.Entry<Object, Object> entry : entrys) {
  23. Object key = entry.getKey();
  24. Object value = entry.getValue();
  25. System.out.println(key + "=" + value);
  26. }
  27. }
  28. }

Properties与流结合使用

  1. import java.io.FileNotFoundException;
  2. import java.io.FileReader;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.util.Properties;
  7. public class PropertiesDemo2 {
  8. public static void main(String[] args) throws IOException{
  9. //method();
  10. //method2();
  11. //创建属性列表对象
  12. Properties prop = new Properties();
  13. //添加映射关系
  14. prop.setProperty("CZBK001", "zhangsan");
  15. prop.setProperty("CZBK002", "lisi");
  16. prop.setProperty("CZBK003", "wangwu");
  17. //创建输出流对象
  18. FileWriter fw = new FileWriter("e.txt");
  19. //void store(Writer writer, String comments)
  20. prop.store(fw, "hello world");
  21. //释放资源
  22. fw.close();
  23. }
  24. private static void method2() throws FileNotFoundException, IOException {
  25. //创建属性列表对象
  26. Properties prop = new Properties();
  27. //创建一个输入流对象
  28. FileReader fr = new FileReader("d.txt");
  29. //void load(Reader reader)
  30. prop.load(fr);
  31. //释放资源
  32. fr.close();
  33. System.out.println(prop);
  34. }
  35. private static void method() throws FileNotFoundException {
  36. //创建属性列表对象
  37. Properties prop = new Properties();
  38. //添加映射关系
  39. prop.setProperty("CZBK001", "zhangsan");
  40. prop.setProperty("CZBK002", "lisi");
  41. prop.setProperty("CZBK003", "wangwu");
  42. //创建打印流对象
  43. PrintWriter out = new PrintWriter("d.txt");
  44. //void list(PrintWriter out)
  45. prop.list(out);
  46. //释放资源
  47. out.close();
  48. }
  49. 编码表
  50. ---
  51. **编码表的概述**
  52. 编码表:把计算机底层的二进制数据转换成我们能看到的字符
  53. ASCII
  54. GB2312 --- GBK
  55. Unicode 所有的字符都占2个字节
  56. UTF-8 长度可变的码表
  57. ANSI:本地编码表 gbk
  58. Java中的字符串默认使用的ANSIgbk
  59. 乱码:编码保持前后一致即可解决
  60. **Java中字符串的编码**
  61. *常用方法*
  62. 构造方法(字节数组转字符串):
  63. String():初始化一个新创建的 String 对象,使其表示一个空字符序列
  64. String(byte[] bytes) 使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
  65. String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String
  66. 成员方法(字符串转字节数组)
  67. getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
  68. getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组

发表评论

表情:
评论列表 (有 0 条评论,309人围观)

还没有评论,来说两句吧...

相关阅读