实验3: Java IO的应用
1. 所使用的工具软件及环境
环境:Windows 8.1;jdk 1.8;
工具:eclipse
2. 实验目的
在Eclipse下编辑、编译、运行、调试简单的Java程序 。
熟悉掌握java的输入输出机制,掌握流的概念与应用。
3. 实验内容
编写图形界面程序,接受用户输入的5个浮点数据和一个文件目录名,将这5个数据保存在该文件中,再从文件中读取出来并且进行从大到小排序,然后再一次追加保存在该文件中。
例如:
4. 源程序
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class window {
private JPanel SortWindow;
private JTextArea FloatArea;
private JTextArea FileArea;
private JButton SaveButton;
private JButton LookButton;
private JButton SortButton;
public static void main(String[] args) {
JFrame frame = new JFrame("window");
frame.setContentPane((new window()).SortWindow);
frame.setDefaultCloseOperation(3);
frame.pack();
frame.setVisible(true);
}
public window() {
this.$$$setupUI$$$();
this.SaveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String fiveFloat = window.this.FloatArea.getText();
String fileName = window.this.FileArea.getText();
System.out.println(fiveFloat);
System.out.println(fileName);
try {
File saveFile = new File("D:" + File.separator + "result" + File.separator + fileName + ".txt");
if (!saveFile.exists()) {
try {
saveFile.createNewFile();
} catch (IOException var7) {
var7.printStackTrace();
}
}
FileOutputStream fos = new FileOutputStream(saveFile);
PrintStream ps = new PrintStream(fos);
ps.printf(fiveFloat);
ps.close();
JOptionPane.showMessageDialog((Component)null, "成功!");
} catch (FileNotFoundException var8) {
var8.printStackTrace();
}
}
});
this.SortButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
String fileName = window.this.FileArea.getText();
File saveFile = new File("D:" + File.separator + "result" + File.separator + fileName + ".txt");
BufferedReader rd = new BufferedReader(new FileReader(saveFile));
String allFloat = "";
String lineFloat;
String sortFloat;
for(sortFloat = ""; (lineFloat = rd.readLine()) != null; allFloat = allFloat + lineFloat) {
}
rd.close();
String[] arr = allFloat.split(" ");
float[] f = new float[arr.length];
int i;
for(i = 0; i < arr.length; ++i) {
f[i] = Float.parseFloat(arr[i]);
}
Arrays.sort(f);
for(i = arr.length - 1; i >= 0; --i) {
String s = String.valueOf(f[i]);
sortFloat = sortFloat + s + " ";
}
System.out.println(sortFloat);
FileOutputStream fos = new FileOutputStream(saveFile, true);
PrintStream p1 = new PrintStream(fos);
p1.println();
p1.printf(sortFloat);
p1.close();
JOptionPane.showMessageDialog((Component)null, "好!");
} catch (FileNotFoundException var12) {
var12.printStackTrace();
} catch (IOException var13) {
var13.printStackTrace();
}
}
});
this.LookButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String fiveFloat = window.this.FloatArea.getText();
String fileName = window.this.FileArea.getText();
try {
Runtime.getRuntime().exec("explorer D:" + File.separator + "result" + File.separator + fileName + ".txt");
} catch (IOException var5) {
System.out.println("Failed to open D:" + File.separator + "result" + File.separator + fileName + ".txt");
System.out.println("(Possible reason ) this file is not exists!");
}
}
});
}
}
5. 实验结果
6. 体会
本次实验,我不仅创建图形化界面实现用户交互,巩固前面所学;而且学习了Java文件输入输出流机制,掌握了一些常见的文件处理方法。
实验的思路如下:
保存操作:先从用户界面接收输入的数据和文件名称,读取文件名称创建相应文件,并将数据输入到创建好的文件中进行保存。
排序并保存操作:先将文件中的数据读取出来放入数组中,利用数组的sort()方法对其从小到大排序,最后将数组逆序存入文件中,此时就完成了数据从大到小的排序存入。保存操作与上相同。在写字节或字符时,我先把写入的数据填充到内部缓冲区,然后一次性写入到目标数据源中,从而提高了I/O流的读取效率。
读取文件操作:利用RunTime.getRuntime().exec命令在windows下直接调用相关文件。
在实验中,我将分隔符用/表示,但已知无法找到文件;最后查阅资料发现在window中的分隔符是\,在Linux 中的分隔符是/,故为了避免在上传或者下载时找不到文件,常用File.separator来代替路径分隔符。
通过本次实验,我知道了Java中IO流操作的基本流程:先使用File类定位一个文件,然后通过字节流或字符流的子类进行流对象的实例化,再进行读/写操作,最后关闭字节或字符流。其关键在于选取不同的IO类实例化,以便完成不同的功能。
并且,对于输入输出流的异常处理机制我也有了更深的理解:FileInputStream类用来打开一个输入文件,若要打开的文件不存在,则会产生异常File Not Found Exception,必须捕获或生命抛出;FileOutputStream类用来打开一个输出文件,若要打开的文件不存在,则会创建一个新的文件,否则源文件的内容会被新写入的内容所覆盖;在进行文件的读/写操作时,也会产生非运行时异常IOException,也需要捕获或声明抛弃。