java IO流

  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也是个复杂的过程,最好的方式还是对象!当然这也因需求而异

原文地址:https://www.cnblogs.com/sun-space/p/5665238.html