需求:创建一个文本文件,以UTF-8高效写入,并高效读取。
1 package com.day506.IO; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 import java.io.InputStreamReader; 10 import java.io.OutputStreamWriter; 11 12 //创建一个文本文件,以UTF-8高效写入一首诗,并高效读取。 13 public class IO1 { 14 public static void main(String[] args) throws IOException { 15 16 File file = new File("e:\\Test\\a.txt"); 17 if (!file.exists()) { 18 boolean r; 19 try { 20 r = file.createNewFile(); 21 if (r) { 22 System.out.println("创建文件成功"); 23 } 24 } catch (Exception e) { 25 e.printStackTrace(); 26 } 27 } 28 String str = "雨打梨花深闭门"; 29 // 创建管道 30 FileOutputStream out = new FileOutputStream(file); 31 OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8"); 32 BufferedWriter bw = new BufferedWriter(writer); 33 // 写入管道 34 bw.write("\t" + str); 35 bw.newLine(); 36 bw.write("\t " + "唐寅(明)"); 37 bw.newLine(); 38 // bw.write("\r\n"); 39 bw.write("雨打梨花深闭门,忘了青春,误了青春。"); 40 bw.newLine(); 41 // bw.write("\r\n"); 42 bw.write("赏心乐事共谁论?花下销魂,月下销魂。"); 43 bw.write("\r\n"); 44 // bw.newLine(); 45 bw.write("愁聚眉峰尽日颦,千点啼痕,万点啼痕。"); 46 bw.write("\r\n"); 47 // bw.newLine(); 48 bw.write("晓看天色暮看云,行也思君,坐也思君。"); 49 bw.newLine(); 50 // bw.write("\r\n"); 51 // 刷新缓冲区 52 bw.flush(); 53 // 关闭管道 54 out.close(); 55 writer.close(); 56 System.out.println("写入文件成功"); 57 // 高效读取 58 // 创建管道 59 60 FileInputStream in = new FileInputStream(file); 61 // 以"UTF-8"编码,就必须以"UTF-8"解码。 62 InputStreamReader reader = new InputStreamReader(in, "UTF-8"); 63 BufferedReader br = new BufferedReader(reader); 64 // 读取文件 65 String line; 66 while ((line = br.readLine()) != null) { 67 System.out.println(line); 68 } 69 // 关闭管道 70 in.close(); 71 reader.close(); 72 } 73 }
1.1标准输入输出流
1.1.1 标准输入流
源数据源是标准输入设备(键盘、鼠标、触摸屏)等输入设备。在java中用System.in 得到一个InputStream字节输入流。
标准输入流以字节流流入内存,如果在控制台中输入字符,字符以默认编码(win简体:gbk)编码成字节进入标准输入流。
需求:从控制台高效读取一行数据,并高效写入文本文件
1 package com.day506.IO; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileWriter; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.InputStreamReader; 10 11 public class IO2 { 12 public static void main(String[] args) throws IOException { 13 // 需求:从控制台高效读取一行数据,并写入文件。 14 15 InputStream in = System.in; 16 InputStreamReader reader = new InputStreamReader(in, "GBK"); 17 BufferedReader br = new BufferedReader(reader); 18 19 File file = new File("e:\\Test\\b.txt"); 20 //FileWriter=OutputStreamWriter+GBK 21 //FileOutputStream out=new FileOutputStream(file); 22 //OutputStreamWriter writer=new OutputStreamWriter(out,"GBK"); 23 FileWriter writer = new FileWriter(file); 24 BufferedWriter bw = new BufferedWriter(writer); 25 26 String end = "bye"; 27 while (true) { 28 String line = br.readLine(); 29 if (line.equals(end)) { 30 break; 31 } 32 33 bw.write(line); 34 // bw.newLine(); 35 } 36 37 bw.flush(); 38 39 bw.close(); 40 writer.close(); 41 42 } 43 }
1.1.2标准输出流
数据目的地是标准输出设备(显示器)等输出设备。在java中用System.out得到一个PrintStream 字节输出流(字节打印流)。提供了更强大的print println打印方法用于打印各种数据类型。
PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。
1 package com.day508.bzl; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileReader; 6 import java.io.IOException; 7 import java.io.PrintStream; 8 9 public class BZL { 10 public static void main(String[] args) throws IOException { 11 12 File file = new File("E:\\Test\\b.txt"); 13 14 FileReader reader = new FileReader(file); 15 BufferedReader br = new BufferedReader(reader); 16 17 PrintStream ps = System.out; 18 19 String line; 20 while( (line=br.readLine())!=null ) { 21 ps.println(line); 22 } 23 br.close(); 24 reader.close(); 25 } 26 }
1.2序列化
把内存中的对象永久保存到硬盘的过程称为对象序列化,也叫做持久化。
把硬盘持久化的内存恢复的内存的过程称为对象反序列化。
1.2.1 Serializable
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,并抛出异常。
Serializable接口没有方法或字段,仅用于标识可序列化的语义。
1.2.2对象序列化/反序列化对象
对象序列化:
ObjectOutputStream 继承于OutputStream,专门用于把对象序列化到本地。提供了writexxx, writeObject() 用于写入一个对象。
反序列化对象:
ObjectInputStream 继承于InputStream ,专门用于把本地持久化内容反序列化到内存,提供了readxxx,readObject()用于读取一个序列化内容并返回对象。
1 public static void main(String[] args) throws IOException { 2 3 Student stu = new Student("001", "大狗", 20, Gender.男); 4 5 /** 6 * 方案1:取stu所有的属性,通过特定的字符串(-),把各个属性值连接起来 7 * 001-大狗-20-男 8 */ 9 10 File file = new File("e:\\Ttest\\d.txt"); 11 FileOutputStream out = new FileOutputStream(file); //序列化对象 12 ObjectOutputStream oos = new ObjectOutputStream(out); 13 14 oos.writeObject(stu); 15 16 oos.close(); 17 out.close(); 18 FileInputStream in = new FileInputStream(file); //反序列化对象 19 ObjectInputStream ois = new ObjectInputStream(in); 20 21 Student student = (Student) ois.readObject(); 22 System.out.println(student.getId()); 23 System.out.println(student.getName()); 24 System.out.println(student.getAge()); 25 System.out.println(student.getGender()); 26 27 ois.close(); 28 in.close(); 29 }
1.2.3 transient
开发过程中,如果想忽略某些字段不让其序列化时,可以使用transient修饰。
1 public class Student implements Serializable { 2 3 private static final long serialVersionUID = 7222966748321328300L; 4 5 private String id; 6 private transient String name; 7 private transient int age; 8 private Gender gender;
1.3DateInputStream/DateOutputStream
DataOutputStream 继承OutputStream,专门用于把基本java数据类型写入输出流。提供了writeXXX 写入基本java数据类型。
DateInputStream继承于InputStream,允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
DataInputStream/DataOutputStream 特别适合读取/写入在网络传输过程中的数据流。
1 package com.day508.XLH; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 10 public class XLH { 11 12 public static void main(String[] args) throws IOException { 13 14 File file = new File("e:\\Test\\c.txt"); 15 FileOutputStream out = new FileOutputStream(file); //写入 16 DataOutputStream dos = new DataOutputStream(out); 17 18 dos.writeInt(10); 19 dos.writeUTF("hello中国"); 20 21 dos.close(); 22 out.close(); 23 24 System.out.println("写入完成"); 25 FileInputStream in = new FileInputStream(file); //读取 26 DataInputStream dis = new DataInputStream(in); 27 28 int a = dis.readInt(); 29 String str = dis.readUTF(); 30 31 System.out.println(a); 32 System.out.println(str); 33 dis.close(); 34 System.out.println("读取完成"); 35 } 36 }
注意:以什么顺序写入基本java数据类型,就以什么顺序读取基本java数据类型。
浙公网安备 33010602011771号