Java IO流学习总结
流的概念和作用
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
IO流的分类
- 字节流:FileInputStream,FileOutputStream
- 字符流:FileReader,FileWriter
- 二进制流:DataInputStream,DataOutputStream
- 对象序列化/对象反序列化:ObjectInputStream,ObjectOutputStream
-----华丽的分割线 接下来我们看一下java版的IOdemo
-----------java版-----------
--字节流,字符流Demo
import java.io.*;
public class IODemo {
public static void main(String[]args) throws Exception {
public class IODemo {
public static void main(String[]args) throws Exception {
-----关于图片的复制,因为是图片,需要用字节流。
FileInputStream in = new FileInputStream("C:/IoDemo/a/捕获.PNG");//建立输入流
FileOutputStream out = new FileOutputStream("C:/IoDemo/b/捕获copy.PNG");//建立输出流
byte [] buffer = new byte[1024];//建立缓存区,1024为传输的数据大小。建立缓存区,不需要特别大,适合就好。
int len =0;
while (true){
len = in.read(buffer); //len为记录输入流池塘中的数据是否传输完毕
if (len == -1){ //当传输完成时,len==-1,break终止数据传输
break;
}
out.write(buffer,0,len);//写入读取的数据,省的复制后文件损坏。如果没有第2、3个参数,copy后的文件大小》原文件,会造成文件损坏无法打开。
out.flush();//刷新
}
out.close();//释放资源遵循着先开后闭的原则!
FileInputStream in = new FileInputStream("C:/IoDemo/a/捕获.PNG");//建立输入流
FileOutputStream out = new FileOutputStream("C:/IoDemo/b/捕获copy.PNG");//建立输出流
byte [] buffer = new byte[1024];//建立缓存区,1024为传输的数据大小。建立缓存区,不需要特别大,适合就好。
int len =0;
while (true){
len = in.read(buffer); //len为记录输入流池塘中的数据是否传输完毕
if (len == -1){ //当传输完成时,len==-1,break终止数据传输
break;
}
out.write(buffer,0,len);//写入读取的数据,省的复制后文件损坏。如果没有第2、3个参数,copy后的文件大小》原文件,会造成文件损坏无法打开。
out.flush();//刷新
}
out.close();//释放资源遵循着先开后闭的原则!
in.close();
System.out.println("ok....");
BufferedReader in1 = new BufferedReader(new InputStreamReader(new FileInputStream("C:/IoDemo/a/aa.txt"),"gbk"));//使用了装饰GBK编码
PrintWriter out1 = new PrintWriter(new OutputStreamWriter(new FileOutputStream("C:/IoDemo/b/bb.txt"),"utf-8"));//这里如果不使用UTF编码装饰则会乱码
String str = null;
while (true){
str = in1.readLine();
if (str == null){
break;
}
System.out.println(str);
out1.write(str);
out1.flush();
}
in1.close();
out1.close();
}
System.out.println("ok....");
BufferedReader in1 = new BufferedReader(new InputStreamReader(new FileInputStream("C:/IoDemo/a/aa.txt"),"gbk"));//使用了装饰GBK编码
PrintWriter out1 = new PrintWriter(new OutputStreamWriter(new FileOutputStream("C:/IoDemo/b/bb.txt"),"utf-8"));//这里如果不使用UTF编码装饰则会乱码
String str = null;
while (true){
str = in1.readLine();
if (str == null){
break;
}
System.out.println(str);
out1.write(str);
out1.flush();
}
in1.close();
out1.close();
}
---对象序列化及对象反序列化demo
--首先创建实体类Users并将其实现Serializable 接口
package cn.IOdemo;
import java.io.Serializable;
public class Users implements Serializable {
private Integer uAge;
private String uName;
public Integer getuAge() {
return uAge;
}
public void setuAge(Integer uAge) {
this.uAge = uAge;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
private Integer uAge;
private String uName;
public Integer getuAge() {
return uAge;
}
public void setuAge(Integer uAge) {
this.uAge = uAge;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
}
--接下来创建测试类,利用单元测试进行测试
package cn.IOdemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
public class ObjectIOdemo {
@Test
@Test
//对象序列化
public void tObjectWrite(){
try {
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream(
new File("C:/IO/Object.txt")));
public void tObjectWrite(){
try {
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream(
new File("C:/IO/Object.txt")));
Users u = new Users();
u.setuAge(18);
u.setuName("zs");
oos.writeObject(u);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
u.setuAge(18);
u.setuName("zs");
oos.writeObject(u);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
//对象反序列化
public void tObjectRead(){
try {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(
new File("C:/IO/Object.txt")));
Users u =(Users)ois.readObject();
System.out.println(u.getuName()+"\t"+u.getuAge());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-------华丽的分割线 出来吧,python版的Iodemo
public void tObjectRead(){
try {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(
new File("C:/IO/Object.txt")));
Users u =(Users)ois.readObject();
System.out.println(u.getuName()+"\t"+u.getuAge());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-------华丽的分割线 出来吧,python版的Iodemo
ww=open("C:/IoDemo/a/aa.txt")
xx=open("C:/IoDemo/b/aaPython.txt","w")
for line in ww:
xx.write(line)
print("txt复制成功!")
二进制读写
#使用默认缓存区
ww=open("C:/IoDemo/a/捕获.PNG","rb")
xx=open("C:/IoDemo/b/捕获python.PNG","wb")
for line in ww:
xx.write(line)
print("png复制成功!")
#自定义缓存区
CC=open("C:/IoDemo/a/捕获.PNG","rb")
CV=open("C:/IoDemo/b/捕获python_自定义缓存区.PNG","wb")
CC.seek(0,2)#跳转到结尾
CCcount=CC.tell()
CC.seek(0,0)#跳转到开头
n=0 #记录数据传输的次数
ofSize=0#累计传输数据的大小
while True:
if ofSize >CCcount: #如果累计传输数据的大小,终止传输
break
CCsize= CC.read(10240)#缓存区大小为10k
CV.write(CCsize)
ofSize +=10240
n +=1
print(n)
#对象读写(对象序列化,对象反序列)
class person:
def __init__(self,name=None,age=None):
self.name=name
self.age=age
def __str__(self):
return "我叫{0},今年{1}".format(self.name,self.age)
import pickle
p = person("张三",19)
op=open("C:/IoDemo/b/person.dat","wb")
pickle.dump(p,op) #将person对象写入
print(p)
op.close() #如果没有op.close(),则会报错:EOFError: Ran out of input
p1 = pickle.load(open("C:/IoDemo/b/person.dat","rb"))
print(p1)
#复制非空文件到指定文件中:
xx=open("C:/IoDemo/b/aaPython.txt","w")
for line in ww:
xx.write(line)
print("txt复制成功!")
二进制读写
#使用默认缓存区
ww=open("C:/IoDemo/a/捕获.PNG","rb")
xx=open("C:/IoDemo/b/捕获python.PNG","wb")
for line in ww:
xx.write(line)
print("png复制成功!")
#自定义缓存区
CC=open("C:/IoDemo/a/捕获.PNG","rb")
CV=open("C:/IoDemo/b/捕获python_自定义缓存区.PNG","wb")
CC.seek(0,2)#跳转到结尾
CCcount=CC.tell()
CC.seek(0,0)#跳转到开头
n=0 #记录数据传输的次数
ofSize=0#累计传输数据的大小
while True:
if ofSize >CCcount: #如果累计传输数据的大小,终止传输
break
CCsize= CC.read(10240)#缓存区大小为10k
CV.write(CCsize)
ofSize +=10240
n +=1
print(n)
#对象读写(对象序列化,对象反序列)
class person:
def __init__(self,name=None,age=None):
self.name=name
self.age=age
def __str__(self):
return "我叫{0},今年{1}".format(self.name,self.age)
import pickle
p = person("张三",19)
op=open("C:/IoDemo/b/person.dat","wb")
pickle.dump(p,op) #将person对象写入
print(p)
op.close() #如果没有op.close(),则会报错:EOFError: Ran out of input
p1 = pickle.load(open("C:/IoDemo/b/person.dat","rb"))
print(p1)
#复制非空文件到指定文件中:
import shutil
old="D:/demo/a"
n=old[len(old)-1:]
n=old[len(old)-1:]
new="D:/demo/b/"
new=new+n
shutil.copytree(old,new)