软件构造Lab5 Java 多种I/O策略 Strategy模式

实现了哪些I/O方式来读写文件,具体如何实现的。

Input

首先为了strategy设计模式的方便实现和对input时间的准确收集,我选择了一次性读完整个文件,然后将文件存在一个string中(list中同理),然后通过分割字符串实现类似按行读文件的操作。

其中将文件存到字符串的操作如下:

StringBuffer buffer = new StringBuffer();

buffer.append(s.trim()+"\n");

String fileStr = buffer.toString();

 

1.BufferedReader

字符串缓冲读取类。java的IO包使用包装器模式设计的,也就是说用FileReader包装了File,又用BufferedReader包装了FileReader,才可以用BufferedReader。

扫描二维码关注公众号,回复: 6753639 查看本文章

2.InputStream

字节输入流。

具体步骤如下:

使用File类找到一个文件;通过子类实例化父类对象;进行读操作,所有的内容都读到字符数组之中;读取内容;关闭输出流。

 

3.Scanner

Scanner经常被我们用于读取控制台的输入,但是我们只需要将他构造函数中的System.in替换成一个File文件,他就可以变成一个读取文件的Scanner了,Scanner的按行读取方法是nextLine()我们在使用它的时候可以在前面判断它时候hasNextLine()。

 

Output:

1.BufferedWriter

首先创建读取字符数据流对象关联所要复制的文件,创建缓冲区对象关联流对象,最后从缓冲区中将字符创建并写入到要目的文件中。

简单说BufferedWriter为我们提供了写字符串的方法,直接write()里面放个字符串就可以了。

最后需要  writer.flush();

                     writer.close();

2.OutputStream

创建字节输出流对象了做了几件事情:

调用系统功能去创建文件;创建outputStream对象;把outputStream对象指向这个文件

 

3.FileChannel

开启FileChannel:无法直接打开FileChannel通过OutputStream获取FileChannel。

使用FileChannel.write()方法向FileChannel写数据,该方法的参数是一个Buffer。按字节写入。用完FileChannel后需将其关闭。

以下是AtomStructureFileChannel示例:

另外,在写实验中提供的大文件时,经常会出现缓冲区溢出的情况,因此我们需要对缓冲区剩余容量进行估计。写文件之前我给设置ByteBuffer缓冲区大小为0x300000(也就是3M),然后在后面向文件中写的时候。增加如下判断:

if(buf.remaining() < 1024) {

                buf.flip();

                fc.write(buf);

                buf.clear();

              }

 

如何用strategy设计模式实现在多种I/O策略之间的切换。

 

因为我程序中Input和Output策略是分开使用的,故这部分也区分Input和Output来说明。

Input:

因为对于输入,我的每个策略都返回文件的字符串即可,因此可以借此来提高程序的可复用性,具体的策略只需要3个类,分别代表了三种读文件的方式。

抽象策略对象(Strategy)它可由接口或抽象类来实现。

具体策略对象(ConcreteStrategy)它封装了读文件的不同实现策略,所有策略都需要implements ReadStrategy接口,每一个都根据自己这个方法的特点对方法进行了重写,其中具体的读文件方式已说明。

 

环境对象(Context)分别在三个应用场景中实现了对抽象策略中定义的接口的引用。我们在使用它的时候,直接声明一个应用场景类,通过用户的不同输入来给Context传入不同的读策略即可,这样我们就能够只使用一个变量而获得多种行为模式了。

 

Output

因为三个不同应用场景要实现三种不同的写文件的方式,并且此时没有很好提高复用性的方法,因此具体策略我用9个类来实现。

抽象策略对象(Strategy)它可由接口或抽象类来实现。

 

具体策略对象(ConcreteStrategy)它封装了写文件的不同实现策略,所有策略都需要implements WriteStrategy接口,每一个都根据自己这个方法的特点对方法进行了重写,其中具体的读文件方式已说明。

 

环境对象(Context)分别在三个应用场景中实现了对抽象策略中定义的接口的引用。同理,我们在使用它的时候,直接声明一个应用场景类,通过用户的不同输入来给Context传入不同的写策略即可,这样我们就能够只使用一个变量而获得多种行为模式了。

方法:public void write(WriteStrategy writeStrategy)

猜你喜欢

转载自blog.csdn.net/weixin_43821874/article/details/90675184
今日推荐