为什么要使用I/O技术
在变量、数组和对象中存储的数据是暂时存在的,程序结束后它们就会丢失。为了能够永久的保存程序创建的数据,需要将其保存在磁盘文件中,这样以后就可以在其他程序中使用它们。
为了对文件进行操作,Java本身提供了一个API,就是java.io.File类,使用这个类来访问文件属性
而在jdk1.7之后又提供了一个功能更强大的API:java.nio.file.Files
File类并不用来进行文件的读/写操作,它用来描述文件对象的属性,既可以表示文件,也可以表示目录。使用它提供的方法,我们可以得到所指对象的描述信息,包括名称、存在否、读/写权限、路径等等。
(注意:在windows环境中使用路径是不能用\分隔符,这个符号已经被转义了,应使用\\或/例如D:\\java\\b.txt或D:/java/b.txt)
创建文件并输出文件属性
public class FileTest { public static void main(String[] args) { String path = new String(new Scanner(System.in).nextLine());//获取控制台输入的文件名路径 File file = new File(path);//用获得的路径实例一个File对象 if (!file.exists()) {//判断文件是否存在 System.out.println("文件不存在,正在创建文件"); try { file.createNewFile();//新建一个文件 System.out.println("文件创建成功"); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); System.out.println("文件创建失败"); } }else{ System.err.println(file.getName());//输出文件的名字 System.out.println(new Date(file.lastModified()));//输出文件最后的修改时间 System.out.println(file.getAbsolutePath());//输出文件的绝对路径 } } }显示某个目录下的文件、目录信息
public class DirTest { public static void main(String[] args) { File dir = new File(System.getProperty("user.dir"));//获取用户目录 System.out.println("当前目录是:"+dir.getAbsolutePath()); File FileOrDirlist[] = dir.listFiles(); for (int i = 0,j = FileOrDirlist.length; i < j; i++) { if(FileOrDirlist[i].isDirectory()){ System.out.println("子目录:"+FileOrDirlist[i].getName()); }else{ System.out.println("文件:"+FileOrDirlist[i].getName()+",大小:"+FileOrDirlist[i].length() + "字节"); } } } }FIles(jdk1.7后)暂不多说,具体看API说明。
I/O流:
File类可以创建文件,但并不能访问、操作文件的内容,这个时候用到I/O流。
输入输出是对内存而言,而不是对文件。(输入到内存,输出到文件)
按流传输基本单位,分为两种
①字节流:基本单位是字节(8位)
抽象类:InputStream负责输入流
OutputStream负责输出流
子类命名格式:XxxxInputStream或XxxxOutputStream(FileInputStream/FileOutputStream)
②字符流 (Unicode): 基本单位是 16 位 Unicode 字符抽象类:Reader 负责输入流
Writer负责输出流
子类命名格式:XxxxReader或XxxxWriter(InputStreamReader/OutputStreamWriter)
(
运用BufferedReader和BufferedWriter也可以读写文本文件,且性能较高,因其带有缓冲区
用法:
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//用BufferedReader获取输入,System.in是位流,要将其转换成字符流
BufferedWriter bufWriter =
new
BufferedWriter(
new
FileWriter(path
));
(未完待续)