1 package com.sun.io; 2 3 import java.io.BufferedOutputStream; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.ObjectInputStream; 10 import java.io.ObjectOutputStream; 11 import java.io.SequenceInputStream; 12 import java.io.Serializable; 13 import java.util.Enumeration; 14 import java.util.Vector; 15 16 import org.junit.Test; 17 18 public class IODemo { 19 @Test 20 public void createFile() throws IOException { 21 // File f = new File("D:/eadp1.txt"); 和下面的效果相同 22 File f = new File("D:\eadp1.txt"); 23 // 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。API 24 // 该目录下没有此文件则创建,创建成功返回true,如果存在返回false;如果目录是不存在的话那会抛出IO异常 25 System.out.println(f.createNewFile()); 26 System.out.println("该分区大小" + f.getTotalSpace() / (1024 * 1024 * 1024) + "G"); // 返回由此抽象路径名表示的文件或目录的名称。 27 f.mkdirs(); // 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 28 // f.delete(); // 删除此抽象路径名表示的文件或目录 29 System.out.println("文件名 " + f.getName()); // 返回由此抽象路径名表示的文件或目录的名称。 30 System.out.println("文件父目录字符串 " + f.getParent());// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 31 } 32 33 @Test 34 public void fileInputStream() throws IOException { 35 int count = 0; 36 InputStream streamReader = new FileInputStream(new File("D:\eadp1.txt")); 37 byte[] b = new byte[(int) new File("D:\eadp1.txt").length()]; 38 System.out.println("---长度是: " + b.length + " 字节"); 39 while (streamReader.read() != -1) { // 读取文件字节,并递增指针到下一个字节 40 count++; 41 } 42 System.out.println("---长度是: " + count + " 字节"); 43 streamReader.close(); 44 } 45 46 @Test 47 public void copyFile() throws IOException { 48 // TODO自动生成的方法存根 49 byte[] buffer = new byte[512]; // 一次取出的字节数大小,缓冲区大小 50 int numberRead = 0; 51 FileInputStream input = null; 52 FileOutputStream out = null; 53 input = new FileInputStream("D:\eadp1.txt"); 54 out = new FileOutputStream("D:\eadp.txt"); // 如果文件不存在会自动创建 55 56 while ((numberRead = input.read(buffer)) != -1) { // numberRead的目的在于防止最后一次读取的字节小于buffer长度, 57 out.write(buffer, 0, numberRead); // 否则会自动被填充0 58 } 59 System.out.println("成功"); 60 input.close(); 61 out.close(); 62 } 63 64 /** 65 * 可以看我另一篇博客java序列化 把数据存到数据库中 66 * 67 * @throws IOException 68 * @throws ClassNotFoundException 69 */ 70 @Test 71 public void copyObject() throws IOException, ClassNotFoundException { 72 73 ObjectOutputStream objectwriter = new ObjectOutputStream(new FileOutputStream("D:\student.txt")); 74 objectwriter.writeObject(new Student("gg", 22)); 75 objectwriter.writeObject(new Student("tt", 18)); 76 objectwriter.writeObject(new Student("rr", 17)); 77 ObjectInputStream objectreader = new ObjectInputStream(new FileInputStream("D:\student.txt")); 78 for (int i = 0; i < 3; i++) { 79 System.out.println(objectreader.readObject()); 80 } 81 objectreader.close(); 82 objectwriter.close(); 83 } 84 85 /** 86 * 合并流 87 * 88 * @throws IOException 89 */ 90 @Test 91 private void doSequence() throws IOException { 92 // 创建一个合并流的对象 93 SequenceInputStream sis = null; 94 // 创建输出流。 95 BufferedOutputStream bos = null; 96 // 构建流集合。 97 Vector<InputStream> vector = new Vector<InputStream>(); 98 vector.addElement(new FileInputStream("D: ext1.txt")); 99 vector.addElement(new FileInputStream("D: ext2.txt")); 100 vector.addElement(new FileInputStream("D: ext3.txt")); 101 Enumeration<InputStream> e = vector.elements(); 102 sis = new SequenceInputStream(e); 103 bos = new BufferedOutputStream(new FileOutputStream("D: ext4.txt")); 104 // 读写数据 105 byte[] buf = new byte[1024]; 106 int len = 0; 107 while ((len = sis.read(buf)) != -1) { 108 bos.write(buf, 0, len); 109 bos.flush(); 110 } 111 } 112 } 113 114 class Student implements Serializable { 115 private static final long serialVersionUID = 1L; 116 private String name; 117 private int age; 118 119 public Student(String name, int age) { 120 super(); 121 this.name = name; 122 this.age = age; 123 } 124 125 @Override 126 public String toString() { 127 return "Student [name=" + name + ", age=" + age + "]"; 128 } 129 }
这里有个问题,对象的序列化是方便了我们去操作多个类(对象存在字段中),但是如果是数据迁移的话这些二进制数据就完全失去了作用,那是否考虑存为json
呢,其实这种方法也不好,解析json也是个复杂的过程,最好的方式还是对象!当然这也因需求而异