java以对象流的方式存入文件_Java语言的学习与实践8 (输入输出流,文件的读写,对象的存取,图片文件复制)...

1.收获

渐渐地发现后面学习的东西不是很考脑袋,知识点也是比较好理解的,但是我自己发现了一个比较难受的事,就是学了后面的忘了前面的,可能是由于自己没有及时巩固和复习,导致前面的知识的遗忘,还是要把前面的的东西捡起来不能忘掉,前面的知识是非常重要的。所以还是要用一些时间去巩固知识,以加强对知识的熟悉程度。人们说一个人的改变在一天,一周,半个月是看不出来的,而在一个月后,就能够看见,一个月说长也长,说不长也不长,现在已经过去半个月了,期待着半个月后的自己。但是需要的是坚持和努力,加油!!

2.技术

(1)输入输出流的定义与应用

(2)文件的读写(java)

(3)将对象的存入和取出文件

(4)图片文件复制

3.技术的实际应用

(1)输入输出流的定义与应用

什么是输入输出流:首先我们需要了解一下什么是流

流:统一管理数据的写入和读取

而流分为输入流和输出流

开发者只需要将内存里面的数据写到流里面

流的方向:参考的是自己的内存空间

输入流:将外部数据写到内存中或者从流里面读取数据

输出流:从内存空间将数据写到外部设备(磁盘/硬盘/光盘)

输出流:OutputStream 字节流 Writer 字符流

输入流:InputSream 字节流 Reader 字符流

I O流对象 不属于内存对象 需要自己关闭

OutputStream和InputStream都是抽象类 不能直接使用

FileOutputStream/FileInputStream 文件的读取

ObjectOutputStream/ObjectInputStream 对象的读取

FileWriter/FileReader

流的应用:

首先我们需要创建一个文件来保存我们读取到的文件

//创建文件 完整的路径

String path="D:/android/Javaday1/java/src/main/java/day8";

File file=new File(path.concat("/1.txt"));

//判断是否存在

if(file.exists()==false){

//不存在就创建

file.createNewFile();

}

(2)文件的读写(java)

向文件写入字节流

//1.创建文件输出流对象

FileOutputStream fos=new FileOutputStream(file);

//2.使用write方法写入

byte[] text={'1','2','3','4'};

fos.write(text);

//3.操作完毕需要关闭Stream对象

fos.close();

向文件写入字符流

FileWriter fw=new FileWriter(file);

char[] name={'安','卓','开','发'};

fw.write(name);

fw.close();

读取文件内容

FileInputStream fis=new FileInputStream(file);

byte[] name=new byte[12];

int count=fis.read(name);

fis.close();

System.out.println(count+" "+new String(name));

FileReader fr=new FileReader(file);

char[] book=new char[4];

count=fr.read(book);

fr.close();

System.out.println(count+" "+new String(book));

最后效果:

41f4522cd09b?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

(3)将对象的存入和取出文件

首先我们需要创建一个类

public class Person{

public String name;

public int age;

}

然后再创建一个类的具体对象

Person xw=new Person();

xw.name="小王";

xw.age=20;

现在我们将这个对象写入文件,但是还是要创建一个文件

//创建文件 完整的路径

String path="D:/android/Javaday1/java/src/main/java/day8";

File file=new File(path.concat("/1.txt"));

//判断是否存在

if(file.exists()==false){

//不存在就创建

file.createNewFile();

}

然后我们将这个对象写入文件

//在文件里面写入一个对象

OutputStream os=new FileOutputStream(file);

ObjectOutputStream oos=new ObjectOutputStream(os);

oos.writeObject(xw);

oos.close();

但是我们会碰到一个问题

41f4522cd09b?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

没有序列化

我们需要实现序列化

向文件里面存一个对象

序列化 serializable

保存的对象必须实现Serializable接口

如果对象内部还有属性是其他内的对象 那麽这个类也必须实现Serializable接口

public class Person implements Serializable{

public String name;

public int age;

}

从文件里面读取一个对象

InputStream is=new FileInputStream(file);

ObjectInputStream ois=new ObjectInputStream(is);

Person xw=(Person)ois.readObject();

System.out.println(xw.name+" "+xw.age);

ois.close();

最后效果

41f4522cd09b?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

(4)图片文件复制

首先我们需要保存文件的路径

// 将一个文件保存到另外一个位置

//1.原文件的路径

String sourcePath="C:\\Users\\ASUS\\Desktop\\1.jpg";

//2.目标文件的路径

String desPath="D:\\android\\Javaday1\\java\\src\\main\\java\\day8\\1.jpg";

因为图片比较大,一般使用字节流传递

//3.图片 字节

FileInputStream fileInputStream=new FileInputStream(sourcePath);

FileOutputStream fileOutputStream=new FileOutputStream(desPath);

byte[] in=new byte[1024];

int count=0;

while((count=fileInputStream.read())!=-1){

fileOutputStream.write(in,0,count);

}

文件生成

41f4522cd09b?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

打开文件后的效果

41f4522cd09b?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

现在我们来测量这个文件复制的效率

在这段代码前加上

long start=System.currentTimeMillis();

在这段代码后面加上

long end=System.currentTimeMillis();

System.out.println(end-start);

结果(毫秒)

41f4522cd09b?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

现在我们用另外一种方式来进行复制

// 将一个文件保存到另外一个位置

long start=System.currentTimeMillis();

//1.原文件的路径

String sourcePath="C:\\Users\\ASUS\\Desktop\\1.jpg";

//2.目标文件的路径

String desPath="D:\\android\\Javaday1\\java\\src\\main\\java\\day8\\1.jpg";

//3.图片 字节

FileInputStream fileInputStream=new FileInputStream(sourcePath);

FileOutputStream fileOutputStream=new FileOutputStream(desPath);

InputStream inputStream=new FileInputStream(sourcePath);

BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);

OutputStream outputStream=new FileOutputStream(desPath);

BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(outputStream);

byte[] in=new byte[1024];

int count=0;

while((count=bufferedInputStream.read(in))!=-1){

bufferedOutputStream.write(in,0,count);

}

bufferedInputStream.close();

bufferedOutputStream.close();

long end=System.currentTimeMillis();

System.out.println(end-start);

结果

41f4522cd09b?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

这种方式的效率比刚刚上面的那种高多了,因为我们用到了 BufferedOutputStream bufferedInputStream两个类,这两个类是先把字节流先缓存在他们那里,然后在许多字节读取,而上面的方式是直接在缓存区一个一个字节读取,所以效率提高了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值