java io 实例_Java IO(示例代码)

本文详细介绍了Java中的File类,包括如何创建、删除文件及创建文件夹,并展示了列出目录内容的方法。同时,文章还探讨了RandomAccessFile类,用于随机读取文件,包括写入和读取数据的示例。最后,简要提到了字节流的核心类InputStream。
摘要由CSDN通过智能技术生成

一、File类

File类是java.io包中唯一对文件本身进行操作的类。它可以进行创建、删除文件等操作。

1. 创建文件

可以使用 createNewFille() 创建一个新文件。

注意:

Windows 中使用反斜杠表示目录的分隔符""。

Linux 中使用正斜杠表示目录的分隔符"/"。

最好的做法是使用 File.separator 静态常量,可以根据所在操作系统选取对应的分隔符。

2. 删除文件

可以使用 delete() 删除一个文件。

一般删除文件前,最好先使用 exists() 判断一下文件是否存在。

演示创建和删除文件操作

importjava.io.File;importjava.io.IOException;public classFileDemo01 {public static voidcreateFile(String filepath) {

File f= newFile(filepath);

System.out.println("[Create File] " +f.getPath().toString());try{

f.createNewFile();//创建文件,根据给定的路径创建

} catch(IOException e) {

e.printStackTrace();//输出异常信息

}

}public static voiddeleteFile(String filepath) {

File f= newFile(filepath);

System.out.println("[Delete File] " +f.getPath().toString());if(f.exists()){ //如果文件存在则删除

f.delete(); //创建文件,根据给定的路径创建

}

}public static voidmain(String args[]) {//注意三种分隔符方式

String path1 = "d:est1.txt"; //Windows中使用反斜杠表示目录的分隔符""

String path2 = "d:/test2.txt"; //Linux中使用正斜杠表示目录的分隔符"/"

String path3 = "d:" + File.separator + "test3.txt"; //最好的做法是使用File.separator,可以根据所在操作系统选取对应分隔符

createFile(path1);

createFile(path2);

createFile(path3);

deleteFile(path1);

}

};

3. 创建文件夹

可以使用 mkdir() 来创建文件夹,但是如果要创建的目录的父路径不存在,则无法创建成功。

如果要解决这个问题,可以使用 mkdirs(),当父路径不存在时,会连同上级目录都一并创建。

public classFileDemo02 {public static voidmain(String args[]) {

File f= new File("d:abcest"); //实例化File类的对象

f.mkdir(); //创建文件夹//f.mkdirs();//创建文件夹,如果父路径不存在,会一并创建

}

};

4. 列出指定目录全部文件

File中给出了两种列出文件夹内容的方法:

list(): 列出全部名称,返回一个字符串数组。

listFiles(): 列出完整的路径,返回一个File对象数组。

public classFileDemo03 {public static voidtestListFiles1(String path) {

File f= new File(path); //实例化File类的对象

String str[] = f.list(); //列出给定目录中的内容

System.out.println("[list]");for (int i = 0; i < str.length; i++) {

System.out.println(str[i]);

}

}public static voidtestListFiles2(String path) {

File f= new File(path); //实例化File类的对象

File files[] = f.listFiles(); //列出全部内容

System.out.println("[listFiles]");for (int i = 0; i < files.length; i++) {

System.out.println(files[i]);

}

}public static voidmain(String args[]) {

String path= "d:" +File.separator;

testListFiles1(path);

testListFiles2(path);

}

};

5. 删除目录

可以使用 delete() 来删除目录。

需要注意的是,如果这个目录不为空,直接用 delete() 删除会失败。

以下演示了一个删除指定目录,包括其所有子文件和子目录的范例:

importjava.io.File;public classDeleteDirectory {/*** 删除空目录,如果目录不为空,无法删除

*@paramdir*/

private static voiddeleteEmptyDir(String dir) {

File f= newFile(dir);boolean success =f.delete();if(success) {

System.out.println("Success to deleted " +dir);

}else{

System.out.println("Failed to delete " +dir);

}

}/*** 如果传入的是一个目录对象,遍历删除其所有子文件和子目录

*@paramdir

*@return

*/

private static booleandeleteDir(File dir) {if(dir.isDirectory()) {

File[] children= dir.listFiles();//递归删除目录中的子目录下

for (int i = 0; i < children.length; i++) {boolean success =deleteDir(children[i]);if (!success) {return false;

}

}

}//目录此时为空,可以删除

returndir.delete();

}public static voidmain(String[] args) {

String emptyDir= "d:empty";

String dir2= "d:est";

deleteEmptyDir(emptyDir);boolean success = deleteDir(newFile(dir2));if(success) {

System.out.println("Success to deleted " +dir2);

}else{

System.out.println("Failed to delete " +dir2);

}

}

}

二、RandomAccessFile类

RandomAccessFile类是随机读取类,它是一个完全独立的类。

它适用于由大小已知的记录组成的文件,所以我们可以使用seek()将记录从一处转移到另一处,然后读取或者修改记录。

文件中记录的大小不一定都相同,只要能够确定哪些记录有多大以及它们在文件中的位置即可。

RandomAccessFile类可以实现对文件内容的读写操作,但是比较复杂。所以一般操作文件内容往往会使用字节流或字符流方式。

1. 写入数据

当用 rw 方式声明RandomAccessFile对象时,如果要写入的文件不存在,系统将自行创建。

r 为只读;w 为只写;rw 为读写。

为了保证可以进行随机读取,所有写入的名字都是8个字节,写入的数字都是固定的4个字节。

importjava.io.File;importjava.io.RandomAccessFile;public classRandomAccessFileDemo01 {//所有的异常直接抛出,程序中不再进行处理

public static void main(String args[]) throwsException {

File f= new File("d:" + File.separator + "test.txt"); //指定要操作的文件

RandomAccessFile rdf = null; //声明RandomAccessFile类的对象

rdf = new RandomAccessFile(f, "rw");//读写模式,如果文件不存在,会自动创建

String name = null;int age = 0;

name= "zhangsan"; //字符串长度为8

age = 30; //数字的长度为4

rdf.writeBytes(name); //将姓名写入文件之中

rdf.writeInt(age); //将年龄写入文件之中

name = "lisi "; //字符串长度为8

age = 31; //数字的长度为4

rdf.writeBytes(name); //将姓名写入文件之中

rdf.writeInt(age); //将年龄写入文件之中

name = "wangwu "; //字符串长度为8

age = 32; //数字的长度为4

rdf.writeBytes(name); //将姓名写入文件之中

rdf.writeInt(age); //将年龄写入文件之中

rdf.close(); //关闭

}

};

2. 读取数据

读取是直接使用 r 的模式即可,以只读的方式打开文件。

读取时所有的字符串只能按照byte数组方式读取出来,而且长度必须和写入时的固定大小相匹配。

importjava.io.File;importjava.io.RandomAccessFile;public classRandomAccessFileDemo02{//所有的异常直接抛出,程序中不再进行处理

public static void main(String args[]) throwsException{

File f= new File("d:" + File.separator + "test.txt") ; //指定要操作的文件

RandomAccessFile rdf = null ; //声明RandomAccessFile类的对象

rdf = new RandomAccessFile(f,"r") ;//以只读的方式打开文件

String name = null;int age = 0;byte b[] = new byte[8] ; //开辟byte数组//读取第二个人的信息,意味着要空出第一个人的信息

rdf.skipBytes(12) ; //跳过第一个人的信息

for(int i=0;i

b[i]= rdf.readByte() ; //读取一个字节

}

name= new String(b) ; //将读取出来的byte数组变为字符串

age = rdf.readInt() ; //读取数字

System.out.println("第二个人的信息 --> 姓名:" + name + ";年龄:" +age) ;//读取第一个人的信息

rdf.seek(0) ; //指针回到文件的开头

for(int i=0;i

b[i]= rdf.readByte() ; //读取一个字节

}

name= new String(b) ; //将读取出来的byte数组变为字符串

age = rdf.readInt() ; //读取数字

System.out.println("第一个人的信息 --> 姓名:" + name + ";年龄:" +age) ;

rdf.skipBytes(12) ; //空出第二个人的信息

for(int i=0;i

b[i]= rdf.readByte() ; //读取一个字节

}

name= new String(b) ; //将读取出来的byte数组变为字符串

age = rdf.readInt() ; //读取数字

System.out.println("第三个人的信息 --> 姓名:" + name + ";年龄:" +age) ;

rdf.close() ;//关闭

}

};

三、字节流

1. 概要

字节流有两个核心抽象类:InputStream 和 OutputStream。所有的字节流类都继承自这两个抽象类。

InputStream 负责输入,OutputStream 负责输出。

字节流主要操作byte类型数据。

以下为 JDK8 版本中字节流的族谱图:

20200523215413571942.png

由上图可以看出,InputStream 和 OutputStream对于数据源的操作往往是成对出现的。

2. InputStream

InputStream的作用是用来表示哪些从不同数据源产生输入的类。

InputStream类型表

功能

构造器

ByteArrayInputStream

允许将内存的缓冲区当做InputStream使用

缓冲区,字节将从中取出

StringBufferInputStream

将String转换成InputStream

字符串。底层实现实际使用StringBuffer

FileInputStream

从文件中读取信息

字符串,表示文件名、文件或FileDescriptor对象

PipedInputStream

产生用于写入相关PipedOutputStream的数据。实现“管道化”概念

PipedOutputStream

SequenceInputStream

将多个InputStream对象合并为一个InputStream

两个InputStream对象或一个容纳InputStream对象的容器Enumeration

FilterInputStream

抽象类,作为“装饰器”的接口。其中“装饰器”为其他InputStream类提供有用功能

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值