JAVA2实用教程(第5版)第十章

第十章 输入 输出流

10.1File类

 

1.File类的对象主要用来获取文件本身的一些信息,不涉及对文件的读写操作。

 

2.构造方法:·File(String filename);//用此创建的文件被认为与当前程序在同一目录中

 

                       ·File(String directoryPath,String filename);

 

                       ·File(File dir,String filename);

 

(filename是文件名,dierctoryPath是文件的路径,dir为一个目录)

 

3.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 lastModified() ---最后修改时间

 

4.目录

 

创建目录:File对象调用方法public boolean mkdir(),创建成功返回true,否则返回false(如果该目录已经存在将返回false)

 

列出目录中的文件:·public String[] list() 字符串形式、全部

 

                                    ·public File [] listFiles() File对象形式、全部

 

                                    ·public String[] list(FilenameFilter obj) 字符串形式、指定类型

 

                                    ·public File [] listFiles(FilenameFilter obj) File对象形式、指定类型

 

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

 

5.文件的创建与删除

 

·使用File类创建一个文件对象 eg:File file = new File("C:\\myletter","letter.txt");

 

·如果C:\myletter目录中没有letter.txt文件,文件对象file会调用方法 public boolean createNewFile(); 创建出这个文件。

 

·文件对象调用方法 public boolean delete(); 可以删除当前文件。

 

6.java.lang包中的Runtime类声明一个对象,然后用该类的getRuntime()静态方法创建这个对象。

 

eg:Runtime ec;

 

         ec=Runtime.getRuntime();

 

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

 

10.2文字字节输入流

 

1.使用输入流的4个基本步骤

 

a.设定输入流的源;

 

b.创建指向源的输入流;

 

c.让输入流读取源中的数据;

 

d.关闭输入流;

 

2.FileInputStream类(文件字节输入流)是InputStream类的子类。

 

3.创建指向文件的输入流: FileInputStream(String name) FileInputStream(File file) name和file指定的文件称为输入流的源。

 

在try-catch语句中的try部分创建输入流,在catch(捕获)部分检测并处理异常。

 

try{

 

FileInputStream in = new FileInputStream("hello.txt");

 

}

 

catch (IOException e){

 

System.out.println("File read error:"+e );

 

}

 

 

File f = new File("hello.txt");

 

try{

 

FileInputStream in = new FileInputStream(f);

 

}

 

catch(IOException e){

 

System.out.println("File read error:"+e);

 

}

 

4.字节输入流的read方法以字节为单位读取源中的数据。(只要不关闭流,每次调用read方法就顺序地读取其余的内容,直到源的末尾或流被关闭。)

 

in read()读取单个字节,返回字节值(0~255之间的一个整数),未读出就返回-1。

 

in read(byte b[])读取b.length个字节到字节数组b,返回实际读取字节数,到达文件末尾返回-1。

 

int read(byte b[],int off,int len)读取len个字节到字节数组b,返回实际读取字节数,到达文件末尾返回-1,参数off指定从字节数组的某个位子开始存放读取的数据。

 

5.关闭流:关闭方法close()。

 

10.3文件字节输出流

 

1.使用输出流的4个基本步骤

 

a.给出输出流的目的地

 

b.创建指向目的地的输出流

 

c.让输出流把数据写入到目的地

 

d.关闭输出流

 

2.FileOutputStream类(文件字节输出流)是OutputStream类的子类。

 

3.创建指向文件的输出流:FileOutputStream(String name) FileOutputStream(File file) name和file指定的文件称为输出流的目的地。

 

如果输出流指向的文件不存在,Java就会创建该文件,如果已存在,输出流将刷新该文件。

 

在try-catch语句中的try部分创建输出流,在catch(捕获)部分检测并处理异常。

 

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

 

参数append取值true,输出流不会刷新所指向文件,write的方法将从文件的末尾开始写入数据;append取false,刷新。

 

4.使用输入流写字节

 

void write(int n)单个字节

 

void write(byte b[])一个字节数组

 

void write(byte b[],int off,int len)从字节数组的off处开始取len个字节

 

void close()关闭

 

10.4文件字符输入、输出流

 

FileReader、FileWriter字符流

 

构造方法分别是:

 

FileReader(String filename);FileReader(File filename);

 

FileWriter(String filename);FileWriter(File filename);

 

FileWriter(String filename,boolean append);Fil,Wrirer(String filename,boolean append);

 

10.5缓冲流

 

(1)BufferedReader和BufferedWriter类创建的对象称作缓冲输入、输出流。二者的源和目的地必须是字符输入流和字符输出流。 

 

构造方法:

 

–BufferedReader(Reader in);

 

–BufferedWriter (Writer out);

 

(2)BufferedReader和BufferedWriter类读写文件的方法:

 

–readLine() 读取文本行

 

–write(String s,int off,int len) 把字符串s写到文件中

 

–newLine(); 向文件写入一个回行符

 

10.6随机流

 

(1)使用RandomAccessFile类来创建一个随机访问文件流。RandomAccessFile类创建的流的指向既可以作为源也可以作为目的地。    

 

构造方法:

 

–RandomAccessFile(String name,String mode) ;

 

–RandomAccessFile(File file,String mode) ;

 

(2)相关方法:

 

–seek(long a) 定位RandomAccessFile流的读写位置

 

–getFilePointer() 获取流的当前读写位置 

 

–例子8(把几个int型整数写入到一个名字为tom.dat文件 )

 

–readLine()方法在读取含有非ASCII字符的文件时出现“乱码”现象的解决方法:

 

  1)读取 String str=in.readLine(); 

 

  2)用“iso-8859-1”重新编码 byte b[]=str.getBytes("iso-8859-1");

 

  3)使用当前机器的默认编码将字节数组转化为字符串

 

                String content=new String(b); 

 

10.7数组流

 

1)字节数组流

 

字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字节数组作为流的源和目标。

 

ByteArrayInputStream构造方法及常用方法

 

– ByteArrayInputStream(byte[] buf);

 

– ByteArrayInputStream(byte[] buf,int offset,int length);

 

– public int read();顺序地从源中读出一个字节

 

– public int read(byte[] b,int off,int len);顺序地从源中读出参数len指定的字节数

 

ByteArrayOutputStream流构造方法及常用方法

 

– ByteArrayOutputStream();

 

– ByteArrayOutputStream(int size);

 

– public void write(int b); 顺序地向缓冲区写入一个字节  

 

– public void write(byte[] b,int off,int len); 将参数b中指定的len个字节顺序地写入缓冲区

 

– public byte[] toByteArray(); 返回输出流写入到缓冲区的全部字节

 

(2)字符数组

 

– CharArrayReader和CharArrayWriter类是字符数组流,使用字符数组作为流的源和目标。例子10 向内存(输出流的缓冲区)写入字符串 。

 

10.8数据流

 

DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流。

 

构造方法:

 

– DataInputStream(InputStream in)创建的数据输入流指向一个由参数in指定的底层输入流

 

– DataOutputStream(OutnputStream out)创建的数据输出流指向一个由参数out指定的底层输出流

 

10.9对象流

 

ObjectInputStream和ObjectOutputStream类创建的对象称为对象输入流和对象输出流。

 

它的构造方法是:

 

– ObjectInputStream(InputStream in)

 

– ObjectOutputStream(OutputStream out)

 

相关方法:

 

– writeObject(Object obj) 将一个对象obj写入到一个文件

 

– readObject() 读取一个对象到程序中 

 

所谓序列化:一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。

 

10.10序列化与对象克隆

 

如果一个“复制品”实体的变化不会引起原对象实体发生变化,反之亦然。这样的复制品称为原对象的一个克隆对象或简称克隆。

 

一个对象调用clone()方法就可以获取该对象的克隆对象。

 

对象输入流通过对象的序列化信息来得到当前对象的一个克隆。

 

10.11使用Scanner解析文件

 

用Scanner类和正则表达式来解析文件。

 

(1)使用默认分隔标记解析文件

 

      创建Scanner对象,并指向要解析的文件,例如:

 

      File file = new File("hello.java");

 

      Scanner sc = new Scanner(file);

 

      sc将空白作为分隔标记

 

相关方法 next()依次返回file中的单词

 

              hasNext()判断file最后一个单词是否已被next()方法返回.

 

(2)使用正则表达式作为分隔标记解析文件 : 创建Scanner对象,指向要解析的文件,并使用useDelimiter方法指定正则表达式作为分隔标记,例如:

 

    File file = new File("hello.java");

 

    Scanner sc = new Scanner(file);

 

    sc.useDelimiter(正则表达式);

 

    sc将正则表达式作为分隔标记

 

    相关方法 next() 依次返回file中的单词

 

            hasNext() 判断file最后一个单词是否已被next()方法返回

 

10.12文件对话框

 

JFileChooser类创建。构造方法JFileChooser()创建初始不可见的有模式文件对话框。

 

文件对话框调用下述两个方法:showSaveDialog(Component a); 提供保存文件时的界面

 

                                                        showOpenDialog(Component a); 提供打开文件时的界面

 

(参数a指定出现对话框出现的位置,取null时出现在屏幕正中央,不空则在组件a的正前面居中显示。)

 

对话框消失时,上述方法返回下列常量之一:JFileChooser.APPROVE_OPTION

 

                                                                                JFileChooser.CANCEL_OPTION

 

10.13带进度条的输入流

 

使用Javax.swing包提供的输入流类ProgressMonitorInpuStream

 

构造方法如下:

 

ProgressMonitorInputStream(Component c,String s,InputStream);

 

进度条在参数c指定的组件的正前方显示,若参数取null,则在屏幕正前方显示。

 

10.14文件锁

 

FileLock、FileChannel类处理Java提供的文件锁功能。它们分别在java.nio和java.nio.channels包中。

 

输入、输出流读写文件时可以使用文件锁。 

 

RondomAccessFile创建的流在读写文件时使用文件锁的步骤如下:

 

       (1)先使用RondomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw,例如:

 

      RandomAccessFile input=new          

 

                  RandomAccessFile("Example.java","rw");

 

(2)input流调用方法getChannel()获得一个连接到地层文件的FileChannel对象(信道),例如

 

      FileChannel channel=input.getChannel();

 

(3)信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称作对文件加锁.

 

    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值