IO流用来处理设备之间的数据传输。 java提供了丰富的io的操作,这些类位于java.io包中。
下面两张图图展示了java io 类的集成关系以及各个类所负责的媒介。
-
Java程序中,对于数据的输入/输出操作以"流(stream)" 的方式进行。
-
java.io包下提供了各种"流"类和接口,用以获取不同种类的数据,并通过标准的 方法输入或输出数据。
流的分类
-
按操作 数据单位不同分为: 字节流(8 bit),字符流(16 bit)
-
按数据流的 流向不同分为: 输入流,输出流
-
按流的 角色的不同分为: 节点流,处理流
在对java IO有了初步了解后,针对我所上的一节课软件构造的实验,我写了两个封装类,Myread和Mywriter类,其中各实现了三种不同的读写文件操作,用户可以通过提供的接口选择一种读取方式,随后的操作均会以此方式进行读取。
例如Myread类,用户选择读取方式后,Myread类会采用此读文件方式将所选择的文件读取并存入到line中,同时,提供了readline()方法,允许用户按行读取数据。代码示例如下:
Myread br = new Myread();
br.ReadbyFile(filepath)
String line = br.readline();
while(line!=null)
{
System.out.println(line);
line = br.readline();
}
在Myread类中,我实现了File,Scanner以及Buffer读文件操作。具体实现代码如下(line保存文本的每一行数据):
1.public void ReadbyFile(String filepath) throws IOException
{
Path path = Paths.get(filepath);
line = Files.readAllLines(path);
}
2.public void ReadByScanner(String filepath) throws IOException
{
Scanner scanner = new Scanner(new File(filepath));
while (scanner.hasNext()) {
line.add(scanner.nextLine());
}
}
3.public void ReadByBuffer(String filepath) throws IOException
{
BufferedReader buffer = new BufferedReader(new FileReader(filepath));
String temp = null;
while((temp=buffer.readLine())!=null) line.add(temp);
}
Mywriter类中,我实现了File、Printwriter以及Buffer写文件操纵,该类对外提供了按行写入文件的操纵。其中不同写入文件操纵的实现代码如下:
1.public void WritebyFile(String line,String filename) throws IOException
{
List<String> temp = new ArrayList<String>();
temp.add(line);
Path path = Paths.get(filename);
Files.write(path, temp,StandardOpenOption.APPEND);
}
2.public void WritebyPrintWriter(String line,String filepath) throws IOException
{
if(out == null) out=new PrintWriter(filepath,"UTF-8");
out.write(line);
out.flush();
}
3.public void WritebyBuffer(String line,String filepath) throws IOException
{
if(buffer == null)
{
buffer = new BufferedWriter(new FileWriter(filepath));
}
buffer.write(line);
buffer.flush();
}
上述实现中,我将读取文件的类先以null声明在Mywriter中,一旦选择读取文件方式后,该类就确定了。
下面,我针对这几种读写策略进行了测试,测试结果见下图。
从图中可以看出,File写文件时间明显高于其他几个策略,原因是每次写入文件中,File对文件进行一系列操作,而这些操作很大部分都是重复的,因此在进行大文件读取时会耗费很多时间在这里,但是若将所有文本信息作为一条line写入文件中则不会出现这样的问题。
不同的读写策略适合不同的应用场景,根据具体的应用场景选择合适的读写策略是一个优秀的程序员所应具有的才能。在将来的学习过程中,我还会继续尝试新的IO策略,加强自己对于IO的掌握。
引用参考博客:https://blog.csdn.net/suifeng3051/article/details/48344587