DataOutputStream ,
DataInputStream
ObjectInputStream,
ObjectOutputStream
)
输入输出流:
在程序的角度 读取文件 输入流
写数据到文件中 输出流
IO流按照方向: 输入流
/ 输出流
输入流
InputStream 抽象类 -》子类
FileInputStream, Reader 抽象类
输出流
按照操作的字节数: 字节流 字符流
字节流
InputStream 抽象类 -》子类
FileInputStream, 输入字节流 单个字节读取
字符流 :按照一个字符来操作的2个字节
Reader 抽象类
子类 InputStreamReader ->子类 FileReader
Writer 抽象类
子类 OutputStreamReader ->子类 FileWriter
eg:实现文件的拷贝
public static void main(String[] args) throws IOException {
File file = new File("E:\\培训\\java\\index.jsp");
File file2 = new File("E:\\培训\\java\\copy\\copy5.jsp");
FileReader reader=null;
FileWriter writer =null;
try {
reader =new FileReader(file);
writer=new FileWriter(file2);
int a=reader.read();
char array[]=new char [(int)file.length()];
reader.read(array);
writer.write(array);
writer.flush();//
必须写,不然只是拷贝到文件的缓冲区,并无真实内容
} catch (Exception e) {
e.printStackTrace();
}finally{
if (writer!=null) {
writer.close();
}
if (reader!=null) {
reader.close();
}
}
包装流:
1.DataOutputStream /
DataInputStream
1. 与机器底层无关的输入,输出 包装流
可以适当方式将基本 Java 数据类型写入输出流中
eg:向文件中写入数据
public static void main(String[] args) throws IOException {
File file = new File("E:\\培训\\java\\tt.txt");
try {
FileOutputStream out = new FileOutputStream(file);
DataOutputStream dOut = new DataOutputStream(out);
dOut.writeInt(20);
dOut.writeDouble(3.14);
dOut.writeChar('x');
dOut.writeUTF("好好学习");
dOut.flush();
dOut.close();
FileInputStream in = new FileInputStream(file);
DataInputStream din = new DataInputStream(in);
int a = din.readInt();
double d = din.readDouble();
char c = din.readChar();
String s = din.readUTF();
//必须按照写入的数据类型顺序来读才不会出现乱码
System.out.println(a);
System.out.println(d);
System.out.println(c);
System.out.println(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
2.序列化与反序列化
读写对象的 序列化 反序列化
ObjectInputStream 反序列化
ObjectOutputStream 序列化
序列化 ->就是把对象写入到文件中去保存
反序列化->就是把文件中的对象读取到内存中去
java.io.Serializable 接口 可序化接口
一个对象要实现 序列化与反序列化这个对象的类就必须实现Serializable 接口
序列化只能对类的成员属性,不能对类的static成员进行
eg:将person对象写入到文件中,然后从文件中读取对象到内存中去
public static void main(String[] args) {
try {
Person p = new Person(1, "张三丰", "男");
ObjectOutputStream objOut = new ObjectOutputStream(
new FileOutputStream(new File("E:\\培训\\java\\object.txt")));
objOut.writeObject(p);
objOut.flush();
objOut.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
ObjectInputStream inObj = new ObjectInputStream(
new FileInputStream(new File("E:\\培训\\java\\object.txt")));
Person person = (Person) inObj.readObject();
System.out.println(person);
System.out.println(person.num);//
} catch (Exception e) {
e.printStackTrace();
}
缓冲流:
BufferedReader
可以实现文件一行行的读写内容
eg:实现拷贝文件的功能
package com.zt;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferReaderDemo {
public static void main(String[] args) throws IOException {
File file1 =new File("E:\\培训\\java\\index.jsp");
File file2 =new File("E:\\培训\\java\\index7.jsp");
FileReader reader;
FileWriter writer;
try {
reader = new FileReader(file1);
writer = new FileWriter(file2);
BufferedReader breader =new BufferedReader(reader);
BufferedWriter bwriter=new BufferedWriter(writer);
String str =breader.readLine();
while (str!=null) {
bwriter.write(str);
bwriter.newLine();
str=breader.readLine();
}
bwriter.flush();
bwriter.close();
breader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
eg:实现控制台复制输出功能,可以代替Scanner工具类实现同样的接收控制台输入数据的功能
public static void main(String[] args) {
BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
try {
String string="";
while (!"exit".equals(string)) {
string=in.readLine();
System.out.println(string);
}
} catch (Exception e) {
e.printStackTrace();
}
}
创建对象的方法;
1:new
2:反序列化 类就必须实现serializable接口
通过ObjectInputStrem 的readObject
eg:
public class SerializableUtil {
//序列化方法
public static boolean Serializable(Object obj,String path) {
File file=new File(path);
FileOutputStream out =null;
ObjectOutputStream objOut=null;
boolean result =true;
try {
out =new FileOutputStream(file);
objOut=new ObjectOutputStream(out);
objOut.writeObject(obj);
objOut.flush();
objOut.close();
} catch (Exception e) {
result=false;
e.printStackTrace();
}finally{
try {
if (out!=null) {
out.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
//反序列化方法
public static Object reverSerializable(String path ) {
Object obj =null;
File file =new File(path);
FileInputStream in =null;
ObjectInputStream ojbin=null;
try {
in =new FileInputStream(file);
ojbin=new ObjectInputStream(in);
obj=ojbin.readObject();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if (in!=null) {
in.close();
}
if (ojbin!=null) {
ojbin.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return obj;
}
public static void main(String[] args) {
//序列化
Person p = new Person(1, "张三丰", "男"); //注:person类必须实现Serializable接口
boolean f =Serializable(p,"E:\\培训\\java\\object2.txt");
System.out.println(f);
//反序列化
Person p2 = (Person) reverSerializable("E:\\培训\\java\\object2.txt");
System.err.println(p2);
}
}
3:克隆 类就必须实现Cloneable接口
通过类对象的clone()方法进行克隆
eg:
public class Person implements Cloneable{...}//必须实现Cloneable接口
public static void main(String[] args) {
Person p = new Person(1, "张三丰", "男");
Person p2=(Person) p.clone();
System.out.println(p2);
}
4:反射
Class.forName(“类路径”).newIntance();
必须确保类里面有默认的构造器
eg:
package com.zt;
public class Pig {...}
public static void main(String[] args) {
try {
Pig p =(Pig) Class.forName("com.zt.Pig").newInstance();
p.name="呆呆";
p.sex="公";
System.out.println(p);
} catch (Exception e) {
e.printStackTrace();
}
}
流的使用步骤:
1:创建流
2:使用流
3:关闭流
eg:实现文件的输出
package com.zt;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) {
File file =new File("E:\\培训\\java\\index.jsp");
try {
FileInputStream in =new FileInputStream(file);
try {
//第一种方式 会出现中文乱码问题
/* int n = in.read();
while (n!=-1) {
char c= (char) n;
System.out.print(c);
n = in.read();
}*/
//第二种方式
byte[] bs =new byte[(int) file.length()];
in.read(bs);
String str =new String(bs);
System.out.println(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
eg:实现文件的拷贝
package com.zt;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileCopyDemo3 {
public static boolean copy(File file, File file2) {
boolean f = true;
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(file);
byte[] bs = new byte[(int) file.length()];
in.read(bs);
out = new FileOutputStream(file2);
out.write(bs);
} catch (Exception e) {
f = false;
e.printStackTrace();
} finally {
try {
// 先关闭out输入流
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return f;
}
public static void main(String[] args) {
File file = new File("E:\\培训\\java\\index.jsp");
File file2 = new File("E:\\培训\\java\\copy\\copy4.jsp");
copy(file, file2);
}
}