JAVA.I/O

JAVA.IOJAVA

以下预习内容均来自《JAVA2实用教程》

	java.io包(I/O流库)提供大量的流类,所有输入流都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类,而所有输出流都是抽象类OutputStream(字节输出类)或抽象类Writer(字符输出类)的子类。

程序在运行期间,可能需要从外部的存储媒介或其他程序中读入所需要的数据,这就需要使用输入流。输入流的指向称为它的源,程序通过输入流读取源中的数据。另一方面,程序在处理数据后,可能需要将处理的结果写入到永久的存储媒介中或传送给其他的应用程序,这就需要使用输出流。输出流的指向称为它的目的地,程序通过输出流把数据传送到目的地。虽然I/O流经常与磁盘文件存取有关,但是源和目的地也可以是键盘、内存或显示器窗口。

在这里插入图片描述
在这里插入图片描述

File类

程序可能经常需要获取磁盘上文件的有关信息或在磁盘上创建新的文件等,这就需要学习使用File类。需要注意的是,File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度或文件读写权限等,不涉及对文件的读写操作。
创建一个File对象的构造方法有3个:

  • File(String filename);
  • File(String directoryPath ,String filename);
  • File(File dir,String filename);
    其中,filename是文件名字,directoryPath是文件的路径,dir为一个目录。使用File(String filename)创建文件,该文件被认为与当前应用程序在同一目录中。

1.文件的属性
经常使用File类的下列方法获取文件本身的一些信息。

  • public String getName()获取文件的名字。
  • public boolean canRead() 判断文件是否是可读的。
  • public boolean canWrite()判断文件是否可被写入。
  • public boolean exists()判断文件是否存在。
  • public long length()获取文件的长度(单位是字节)。
  • public String getAbsolutePath()获取文件的绝对路径。
  • public String getParent()获取文件的父目录。
  • public boolean isFile()判断文件是否是一一个普通文件,而不是目录。
  • public boolean isDirectory()判断文件是否是一个目录。
  • public boolean isHidden() 判断文件是否是隐藏文件。
  • public long lastModifed()获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的亳秒数)。

2.目录

File对象调用方法public boolean mkdir()创建一个目录,如果创建成功返回true,否则返回false (如果该目录已经存在将返回false)。
如果File对象是一个目录,那么该对象调用下述方法列出该目录下的文件和子目录。

  • public String[] list()用字符串形式返回目录下的全部文件。
  • public File [] listFiles()用File对象形式返回目录下的全部文件。
    有时需要列出目录下指定类型的文件,比如.java、 .txt 等扩展名的文件。可以使用File类的下述两个方法,列出指定类型的文件:
  • public String[] list(FilenameFilter obj) 该方法用字符串形式返回目录下的指定类型的所有文件。
  • . public File [] listFiles(FilenameFilter obj)该方法用File对象形式返回目录下的指定类型的所有文件。
    上述两个方法的参数FilenameFilter是一一个接口,该接口有一一个方法:
public boolean accept (File dir,String name);

File对象dirFile 调用list方法时,需向该方法传递一个实FilenameFilter接口的对象,list方法执行时,参数obj不断回调接口方法accept(File dir,Sring name),该方法中的参数dir为调用list的当前目录dirFile,参数name被实例化为dirFile目录中的一个文件名,当接口方法返回true时,list 方法就将名字为name的文件存放到返回的数组中。

3.文件的创建 与删除

当使用File类创建一一个文件对象后,例如:

File file = new File ("C:\\myletter", "letter.txt") ;

如果C:\myletter目录中没有名字为letter.txt文件,文件对象file 调用方法

public boolean createNewFile() ;

可以在C:myletter目录中建立一个 名字为letter.txt的文件。文件对象调用方法public boolean delete()可以删除当前文件,例如:

file.delete() ;

4.运行可执行文件

当要执行一个本地机器上的可执行文件时,可以使用java.lang包中的Runtime类。首先使用Runtime类声明一个对象,例如:

Runtime ec;

然后使用该类的getRuntime()静态方法创建这个对象:

ec = Runtime . getRuntime () ;

ec可以调用exec(String command)方法打开本地机器上的可执行文件或执行一-个操作。

文件字节输入流

使用输入流通常包括4个基本步骤:

  • 设定输入流的源;
  • 创建指向源的输入流;
  • 让输入流读取源中的数据;
  • 关闭输入流;
    本节通过学习文件字节输入流熟悉上述4个基本步骤。
    如果对文件读取需求比较简单,那么可以使用FileinputStream类(文件字节输入流),该类是InputStream类的子类(以字节为单位读取文件),该类的实例方法都是从InputStream类继承来的。

➊构造方法

可以使用FileInputStream类的下列构造方法创建指向文件的输入流。

FileInputStream(String name) ;

FileInputStream(File file);

第一个构造方法使用给定的文件名name创建FileInputStream 流,第二个构造方法使用File对象创建FileInputStream流。参数name和file指定的文件称为输入流的源。
FileInputStream输入流打开一个到达文件的通道(源就是这个文件,输入流指向这个文件)。当创建输入流时,可能会出现错误(也被称为异常)。例如,输入流指向的文件可能不存在。当出现I/O错误,Java 生成一个出错信号, 它使用IOException (IO异常)对象来表这个出错信号。程序必须在try-catch语句中的try块部分创建输入流,在calch (捕获)块部分检测并处理这个异常。例如,为了读取一个名为hello.txt的文件,建立一个文件输入流in。

try {

FileInputStream

n=new FileInputstream("hello.txt");//创建指向文件hello.xt的输入流
}
catch(IOException e) {
System.out.printIn("File read error:"+e );
}

File f=new File("hello.txt"); //指定输入流的源
try {

FileInputStream in = new FileInputStream(f); //创建指向源的输入流catch (IOException e) {
	System. out .println("File read erfor:"+e );
}

❷使用输入流读取字节

输入流的目的是提供读取源中数据的通道,程序可以通过这个通道读取源中的数据。文件字节流可以调用从父类继承的read方法顺序地读取文件,只要不半闭流,每次调用read方法就顺序地读取文件中的其余内容,直到文件的末尾或文件字输入流被关闭。
字节输入流的read方法以字节为单位读取源中的数据。

  • int read() 输入流调用该方法从源中读取单个字节的数据,该方法返回字节值(0~255之间的一个整数),如果未读出字节就返回-1。

  • int read(byte b[])输入流调用该方法从源中试图读取b.length 个字节到字节数组b中,返回实际读取的字节数目。如果到达文件的末尾,则返回-1。

  • int read(byte b[], int off, int len) 输入流调用该方法从源中试图读取len个字节到字节数组b中,并返回实际读取的字节数目。如果到达文件的末尾,则返回-1,参数off指定从字节数组的某个位置开始存放读取的数据。

      注: FilelnputSteam流顺序地读取文件,只要不关闭流,每次调用read方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。
    

❸关闭流
输入流都提供了关闭方法close(),尽管程序结束时会自动关闭所有打开的流,但是当程序使用完流后,显式地关闭任何打开的流仍是一个良好的习惯。如果没有关闭那些被打开的流,那么就可能不允许另一个程序操作这些流所用的资源。

文件字节输出流

使用输出流通常包括4个基本步骤:

  • 给出输出流的目的地;

  • 创建指向目的地的输出流;

  • 让输出流把数据写入到目的地;

  • 关闭输出流。

本节通过学习文件字节输出流熟悉上述4个基本步骤。

如果对文件写入需求比较简单,那么可以使用FileOutputStream 类(文件字节输出流),它是OutpuSream 类的子类(以字节为单位向文件写入内容),该类的实例方法都是从OutputStream类继承来的。
➊构造方法
可以使用FileOutputSteam类的下列具有刷新功能的构造方法创建指向文件的输出流。

FileOutputStream(String name) ;

FileOutputStream(File file);

第一个构造方法使用给定的文件名name创建FileOutputSteam流,第二个构造方法使用File对象创建FileOutpuStream流。参数name和file 指定的文件称为输出流的目的地。
FileOutputStream 输出流开通一个到达 文件的通道(目的地就是这个文件,输出流指向这个文件)。 需要特别注意的是,如果输出流指向的文件不存在,Java 就会创建该文件,如果指向的文件是已存在的文件,输出流将刷新该文件(使得文件的长度为0)。
另外,与创建输入流相同,创建输出流时,可能会出现错误(被称为异常),例如,输出流试图要写入的文件可能不允许操作或有其他受限等原因。所以必须在ty-catch语句中的try块部分创建输出流,在catch (捕获)块部分检测并处理这个异常。例如,创建指向名为dstin.xt的输出流out.

try {
FileOutputstream out . new FileOutputstream ("destin.txt");
//创建指向文件destin.txt的输出流
	}
catch(IOException e){

System.out. printLn("File write erRor:"+e );

File f=new File("destin.txt");//指定输出流的目的地

try {
	FileOutputstream out = new FileOutnputStream(f); //创建指 向目的地的输出流
	}
catch (IOException e) {
	System. out.printin("Filewrite:"+e );
	}

可以使用FileOutputStream类的下列能选择是否具有刷新功能的构造方法创建指向文件的输出流。

FileOutputStream(String name, boolean append) ;
FileOutputStream(File file, boolean append) ;

当用构造方法创建指向一个文件的输出流时,如果参数append取值true,输出流不会刷新所指向的文件(假如文件已存在),输出流的write的方法将从文件的末尾开始向文件写入数据,参数append取值false,输出流将刷新所指向的文件( 假如文件已存在)。
❷使用输出流写字节
输出流的目的是提供通往目的地的通道,程序可以通过这个通道将程序中的数据写入到目的地。文件字节流可以调用从父类继承的write方法顺序地写文件。FileOutStream流顺序地向文件写入内容,即只要不关闭流,每次调用write 方法就顺宇地向文件写入内容,直到流被关闭。

字节输出流的write方法以字节为单位向目的地写数据。

●void write(int n)输出流调用该方法向目的地写入单个字节。

● void write(byte b[])输出流调用该方法向目的地写入一个字节数组。

●void write(byte b[],int off,int len) 给定字节数组中起始于偏移量off处取len个字节写到目的地。

●void close0关闭输出流。

注: FileOutputStream流顺序地写文件,只要不关闭流,每次调用write方法就顺序地向目的地写入内容,直到流被关闭。

❸关闭流

,需要注意的是,在操作系统把程序所写到输出流上的那些字节保存到磁盘上之前,有时被存放在内存缓冲区中,通过调用close0方法,可以保证操作系统把流缓冲区的内容写到它的目的地, 即关闭输出流可以把该流所用的缓冲区的内容冲洗掉(通常冲洗到磁盘文件上)。

文件字符输入输出流

文件字节输入、输出流的read和 write方法使用字节数组读写数据,即以字节为单位处理数据。因此,字节流不能很好地操作 Unicode字符,例如,一个汉字在文件中占用两个字节,如果使用字节流,读取不当会出现“乱码”现象。与FileInputStream、 FileOutputStream字节流相对应的是FileReader、 FileWriter字符流(文件字符输入、输出流),FileReader和 FileWriter分别是Reader和 Writer的子类,其构造方法分别是:

FileReader(String filename); FileReader(File filename);
FileWriter (String filename); FileWriter (File filename); FileWriter (String filename,boolean aopend): FileWriter File filename,boolean append);

字符输入流和输出流的read和 write方法使用字符数组读写数据,即以字符为基本单位处理数据。

注,对于Writer流Writer方法将数据首先写入到缓冲区,每当缓冲区溢出时缓冲区的内容被自动写入到目的地,如果关闭流。缓冲区的内容会立划被写入到目的地。流调用flush()方法可以立刻冲洗当前缓冲区,即将当前缓冲区的内容写入到目的地。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值