IO(JAVA/python版)

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 {

-----关于图片的复制,因为是图片,需要用字节流。
            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();
        }
---对象序列化及对象反序列化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;
 }
}
--接下来创建测试类,利用单元测试进行测试
package cn.IOdemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
public class ObjectIOdemo {
 

 @Test
//对象序列化
 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
//对象反序列化
 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)

#复制非空文件到指定文件中:
import shutil
old="D:/demo/a"
n=old[len(old)-1:]
new="D:/demo/b/"
new=new+n
shutil.copytree(old,new)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值