java基础-中级(四)【IO流与文件】

4、IO流与文件

IO流:在Java API中,可以从其中读取一个字节序列的对象称作输入流,向其中写入一个字节序列的对象叫做输出流。

抽象类InputStream和OutputStream构成了输入/输出(I/O)的字节基础类,Reader和Writer抽象类构成字符的输入输出流。

 文件:IO流对文件进行读取,但是文件本身的操作需要有自己的类,File和Path类就是文件操作的基本类。

4.1 IO流的划分

IO流基本划分如下图所示。

(1)InputStream类

InputStream类是字节输入流的基类,下面是该类的基本方法:

返回类型方法
intavailable()

返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。

voidclose()

关闭此输入流并释放与流相关联的任何系统资源。

voidmark(int readlimit)

标记此输入流中的当前位置。

booleanmarkSupported()

测试这个输入流是否支持 markreset方法。

abstract intread()

从输入流读取数据的下一个字节。

intread(byte[] b)

从输入流读取一些字节数,并将它们存储到缓冲区 b

intread(byte[] b, int off, int len)

从输入流读取最多 len字节的数据到一个字节数组。

voidreset()

将此流重新定位到上次在此输入流上调用 mark方法时的位置。

longskip(long n)

跳过并丢弃来自此输入流的 n字节数据。

例如,FileInputStream继承InputStream,该流用于从文件读取数据,它的对象可以用关键字 new 来创建。有多种构造方法可用来创建对象。

可以使用字符串类型的文件名来创建一个输入流对象来读取文件:

InputStream f = new FileInputStream("C:/java/hello");

(2)OutputStream类

这个抽象类是表示字节输出流的所有类的超类。 输出流接收输出字节并将其发送到某个接收器。

返回方法名
voidclose()

关闭此输出流并释放与此流相关联的任何系统资源。

voidflush()

刷新此输出流并强制任何缓冲的输出字节被写出。

voidwrite(byte[] b)

b.length字节从指定的字节数组写入此输出流。

voidwrite(byte[] b, int off, int len)

从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。

abstract voidwrite(int b)

将指定的字节写入此输出流。

(3)Writer类

用于写入字符流的抽象类。 子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。

返回类型方法名称
Writerappend(char c)

将指定的字符附加到此作者。

Writerappend(CharSequence csq)

将指定的字符序列附加到此作者。

Writerappend(CharSequence csq, int start, int end)

将指定字符序列的子序列附加到此作者。

abstract voidclose()

关闭流,先刷新。

abstract voidflush()

刷新流。

voidwrite(char[] cbuf)

写入一个字符数组。

abstract voidwrite(char[] cbuf, int off, int len)

写入字符数组的一部分。

 

参数:

cbuf - cbuf数组

off - 从中开始编写字符的偏移量

len - 要写入的 len

voidwrite(int c)

写一个字符

voidwrite(String str)

写一个字符串

voidwrite(String str, int off, int len)

写一个字符串的一部分。

(4)Reader类

用于读取字符流的抽象类。 子类必须实现的唯一方法是read(char [],int,int)和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。

返回类型方法名称
abstract voidclose()

关闭流并释放与之相关联的任何系统资源。

voidmark(int readAheadLimit)

标记流中的当前位置。

booleanmarkSupported()

告诉这个流是否支持mark()操作。

intread()

读一个字符

intread(char[] cbuf)

将字符读入数组。

abstract intread(char[] cbuf, int off, int len)

将字符读入数组的一部分。

intread(CharBuffer target)

尝试将字符读入指定的字符缓冲区。

booleanready()

告诉这个流是否准备好被读取。

voidreset()

重置流。

longskip(long n)

跳过字符

4.2 文件的操作类File

Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。

创建File对象的方式:

通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。

File(File parent, String child);

通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。

File(String pathname) 

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

File(String parent, String child) 

通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。

File(URI uri) 

创建File对象成功后,可以使用以下列表中的方法操作文件。

序号方法描述
1public String getName()
返回由此抽象路径名表示的文件或目录的名称。
2public String getParent()
 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null
3public File getParentFile()
返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 null
4public String getPath()
将此抽象路径名转换为一个路径名字符串。
5public boolean isAbsolute()
测试此抽象路径名是否为绝对路径名。
6public String getAbsolutePath()
返回抽象路径名的绝对路径名字符串。
7public boolean canRead()
测试应用程序是否可以读取此抽象路径名表示的文件。
8public boolean canWrite()
测试应用程序是否可以修改此抽象路径名表示的文件。
9public boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
10public boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
11public boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
12public long lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。
13public long length()
返回由此抽象路径名表示的文件的长度。
14public boolean createNewFile() throws IOException
当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。
15public boolean delete()
 删除此抽象路径名表示的文件或目录。
16public void deleteOnExit()
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
17public String[] list()
返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
18public String[] list(FilenameFilter filter)
返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。
19public File[] listFiles()
  返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。
20public File[] listFiles(FileFilter filter)
返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。
21public boolean mkdir()
创建此抽象路径名指定的目录。
22public boolean mkdirs()
创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
23public boolean renameTo(File dest)
 重新命名此抽象路径名表示的文件。
24public boolean setLastModified(long time)
设置由此抽象路径名所指定的文件或目录的最后一次修改时间。
25public boolean setReadOnly()
标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。
26public static File createTempFile(String prefix, String suffix, File directory) throws IOException
在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
27public static File createTempFile(String prefix, String suffix) throws IOException
在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
28public int compareTo(File pathname)
按字母顺序比较两个抽象路径名。
29public int compareTo(Object o)
按字母顺序比较抽象路径名与给定对象。
30public boolean equals(Object obj)
测试此抽象路径名与给定对象是否相等。
31public String toString()
 返回此抽象路径名的路径名字符串。

以下是File文件操作的实例:

import java.io.*;

public class FileTest {
    /**
     * 复制文件
     * @throws IOException
     */
    public static void fileOperation()throws IOException {
        String pathName="F:/Test";
        if(!new File(pathName).isDirectory()){
            new File(pathName).mkdirs();
        }
        File fileIn = new File(pathName,"test.txt");
        File fileOut = new File(pathName,"test1.txt");
        //文件不存在,创建
        if(!fileIn.exists()){
            fileIn.createNewFile();
        }
        if(!fileOut.exists()){
            fileOut.createNewFile();
        }
        FileInputStream fileInputStream =new FileInputStream(fileIn);
        FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
        //字节流转换成字符流---InputStreamReader
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
        String temp =null;
        while ((temp = bufferedReader.readLine()) != null) {
            bufferedWriter.write(temp+"\r\n");
        }
        bufferedReader.close();
        bufferedReader.close();
    }

    public static void main(String[] args) {
        try {
            fileOperation();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值