文件的操作java_Java文件操作及相关

一直对java文件操作不是很熟悉,因为觉得里面涉及到的类也特别的多,自己平时也没怎么仔细的看,等到要用的时候却发现真的是不会啊,现在刚好碰到了一本比较好的java书,上面对这个有很好的讲解。现在就将这个整理一下,方便以后自己查阅。

1.Scanner------取得输入

在命令行模式下要输入程序至程序中,可以使用标准输入串对象System.in。但是实际上很少用到它,因为System.in对象所提供的read()方法是从输入串中取得一个字节的数据,并返回该自己的整数值,但通常我们取得的输入会是一个字符串或者是一组数字。

在Java SE 6中,可以使用java.util.Scanner类取得用户的输入,其用法为:

Scanner scanner=new Scanner(System.in);

System.out.println("请输入一个数字:");

System.out.println("您输入的数字为:"+scanner.nextInt());//同样的方式,可以使用nextFloat()、nextBoolean()方法来取得用户的输入

2.BufferedReader------取得输入

Scanner取得输入的依据是空格符,按下空格键、Tab键或者Enter键,Scanner就会返回下一个输入,所以有时候并不适用。如果想要取得包括空格符的输入,比较简单的方法就是使用java.io.BufferedReader类来取得输入。

BufferedReader在构建的时候接受一个java.io.Reader对象,在读取标准输入时可以使用java.io.InputStreamReader。可以使用以下方法来为标准输入串建立缓冲区对象:

BufferedReader bufReader=new BufferedReader(new InputStreamReader(System.in));//new InputStreamReader(System.in)表示接受一个System.in对象来构建一个InputStreamReader对象。

BufferedReader的readLine()方法会返回用户在按下Enter键之前的所有字符的输入,不包括最后按下的Enter返回字符。

注意:使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常。

3.File类

File实例除了用作一个文件或者目录的抽象的表示之外,它还提供了不少相关操作;可以用它来对文件系统做一些查询与设置的动作。注意:不管是文件还是目录,在Java中都是以File的实例来表示。

File类主要是文件的抽象代表,若要作文件输入/输出,必须配合其他相关类来使用。

4.RandomAccessFile类

文件存取通常是循序的,每在文件中存取一次,文件的读取位置就会相对与目前的位置前进一次,然后有时必须指定文件的某个区段进行读取或写入的动作,也就是进行随机存取,这是可以使用RandomAccessFile,使用它的seek()方法来指定文件存取的位置,指定的单位为字节。

为了移动存取位置时的方便,通常在随机存取文件中会固定每一个数据的长度。

5.位流-----InputStream和OutputStream

InputStream是所有表示位输入流的类之父类,是一个抽象类,表示从装置(通常是键盘或者是用户定义的输入装置)来源地读取数据的抽象表示。

OutputStream是所有表示位输出流的类之父类,是一个抽象类,用于将数据写入目的地的抽象表示。

6.FileInputStream和FileOutputStream

FileInputStream与从指定的文件中读取数据至目的地有关。FileOutputStream与从来源地写入数据到指定的文件中有关。当建立一个FileInputStream和FileOutputStream的实例时,必须指定文件的位置及文件名称。,实例被建立时文件的流就会开启,而不是用流时,必须关系文件流。

FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回或者使用read()方法时读入至一个byte数组,byte数组的元素个数有多少个,就读入多少个字节。

FileOutputStream默认会以新建文件的方式来开启流,如果指定的文件名称已经存在,则原文件会被覆盖。如果想以附加的模式来写入文件,则可以在构建FileOutputStream实例时指定为附加模式:

FileOutputStream fos=new FileOutputStream(args[0],true);

7.BufferedInputStream和BufferedOutputStream

以文件存取为例,硬盘存取的速度远低于内存中的数据存取速度,为了减少对硬盘的存取,通常从文件中一次读入一定长度的数据,而写入时也是一次写入一定长度的数据。

java.io.BufferedInputStream与java.io.BufferedOutputStream可以为InputStream和OutputStream类的对象增加缓冲区功能。构建BufferedInputStream实例时,需要给定一个InputStream类型的实例。实现BufferedInputStream时,实际上最后是实现InputStream实例。同样的,在构建BufferedOutputStream时,需要给定一个OutputStream实例,实现BufferedOutputStream时,实际上最后是事先OutputStream实例。

BufferedInputStream的数据成员buf是一个位数组,默认为2048字节。当读取数据来源时,BufferedInputStream会尽量将buf填满。当使用read()方法时,实际上先是读取buf中的数据,而不是直接对数据来源作读取。当buf中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,从指定的装置中提取数据。

BufferedOutputStream的数据成员buf是一位数组,默认为512字节。当使用write()方法写入数据时,实际上会先将数据写至buf中,当buf已满时,才会实现给定的OutputStream对象的write()方法,将buf数据写至目的地,而不是每次都对目的地作写入的操作。

为了确保缓冲区中的数据一定被写出至目的地,建议最后执行flush()将缓冲区的数据全部写出目的流中。

BufferedInputStream和BufferedOutputStream并没有改变InputStream和OutputStream的行为,读入或写出时的动作还是InputStream和OutputStream负责。BufferedInputStream和BufferedOutputStream只是在操作对应的方法之前,动态地为他们加上一些额外的功能(像缓冲区功能)。

在其他流对象上也可以使用BufferedInputStream和BufferedOutputStream功能,不仅仅是文件存取流。

8.DataInputStream和DataOutputStream

java.io.DataInputStream和java.io.DataOutputStream可提供一些对java基本数据类型写入的方法,像读写int、double和boolean等的方法。

DataInputStream和DataOutputStream并没有改变InputStream和OutputStream的行为,读入或写出时的动作还是InputStream和OutputStream负责。DataInputStream和DataOutputStream只是在实现对应的方法时,动态的为他们加上类型判断的功能。而不用费心的判断读入字符串或者读入int类型合适该停止。

9.ObjectInputStream和ObjectOutputStream

在java程序执行的过程中,很多数据都是以对象的方式存在于内存中,有时会希望直接将内存中整个对象存储至文件,而不是只存储对象中的某些基本类型成员信息,而在下一次程序运行时,希望可以从文件中读出数据并还原为对象。这时可以使用java.io.ObjectInputStream和java.io.ObjectOutputStream来进行这项工作。

如果要直接存储对象,定义该对象的类必须实现java.io.Serializable接口。

ObjectInputStream和ObjectOutputStream为InputStream、OutputStream的实例加上了可以让用户写入对象和读出对象的功能。在写入对象时,要使用writeObject()方法。读出对象时,要使用readObject()方法。被读出的对象都是以Object的类型返回。所以必须将之转换为对象原来的类型,才能正确的实现被读回的对象。

10.SequenceInputStream

若要将一个文件分割为数个文件,再将之组合还原成一个文件,最基本的作法是使用整个FileInputStream来打开分割后的文件,然后一个一个文件的读取,并使用同一个FileOutputStream实例写到同一个文件中。必须要自行判断每一个分割文件的读取是否完毕,如果完毕就读取下一个文件。而如果使用java.io.SequenceInputStream就不用这么麻烦了。SequenceInputStream可以看作是整个InputStream对象的组合。当一个InputStream对象的内容读取完毕后,他就会取出下一个InputStream对象,直到所有的InputStream对象都读取完毕为止。

还有很多类似的InputStream和OutStream,将在以后的日志中写出。

还有字符流:Reader和Writer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值