Java IO流

File类:

  • File:是文件和目录路径名的抽象表示。文件和目录是可以通过File封装成对象的。 

 构造方法:

>>>File(String pathname):通过将给定的路径名字符转换为抽象路径名来创建新的File 实例;

File(String parent,String chile):通过父路径名字符串和子路径字符串创建新的File实例;

File(File parent,String child):从父抽象路径名和子路径名字符串创建新的File实例。

 File f1=new File("E:\\develop\\java.txt");

 File f2=new File("E:\\develop","java.txt");

;;;;

 File f3=new File("E:\\develop");

File f4=new File(f3,"java.txt");

  • File类创建功能:

 >>>public boolean creatrNewFile()   :当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件。如果文件不存在,就创建文件,返回true;

                                    如果文件存在,就不创建,返回false;

.

>>>public boolean mkdir()    :创建由此抽象路径名命名的目录;

如果目录不存在,就创建目录,返回true;

 如果目录存在,就不创建目录,返回false;

>>>public boolean mkdirs()    :创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。//可以创建多级目录。

如果目录不存在,就创建目录,返回true;

 如果目录存在,就不创建目录,返回false;

1:在E:\\develop目录下创建一个文件java.txt

File f1=new File("E:\\develop\\java.txt"); //创建对象

System.out.println(f1.creatNewFile());       //输出true,创建成功!

2:在E:\\develop目录下创建一个目录javaSE:

File f2=new File("E:\\develop\\javaSE");

System.out.println(f2.mkdir());   //输出true,E:\\develop下多了个目录javaSE;

3:在E:\\develop目录下创建一个多级目录javaSE\\HTML

File f3=new File("E:\\develop\\javaWEB\\HTML");

System.out.println(f3.mkdirs());          //输出true       创建一个多级目录

4:在E:\\develop目录下创建一个文件javase.txt   //创建文件用创建文件的方式

File f4=new File("E:\\develop\\javase.txt");

//System.out.println(f4.mkdir());      //只是创建了目录

System.out.println(f4.creatNewFile());     //输出true

  • 访问文件和目录:

1-访问文件名相关方法:

 String getName():返回File对象所对应的路径名

String getPath()     :返回File对象的绝对路径

File getAbsoluteFile() :返回此File对象的绝对路径

String getAbsolutePath()     :返回File对象所对应的绝对路径

String getParent() :返回此File 对象所对应的的目录(最后一级子目录)的父目录名

boolean renameTo(File newName) :重命名此File对象所对应的文件或目录,如果重命名成功,则返回true,否则返回false。

2-文件检测相关的方法:

boolean exists() :判断File对象所对应的文件或目录是否存在。

boolean canWrite()  :判断File对象所对应的文件或目录是否可写;

boolean canRaed()   :判断File 对象所对应的文件或目录是否可读;

boolean isFile()      :判断File 对象所对应的是否是文件而不是目录;

boolean isDirectory()  :判断File 对象所对应的是否是目录而不是文件;

boolean isAbsolute()   :判断File 对象所对应的文件或目录是否是绝对路径。

3-获取常规文件信息:

long lastModified()     :返回文件的最后修改时间;

long length()               :返回文件内容的长度。

Java IO 流:

  • 1-输入流和输出流:

 输入流:只能从中读取数据,而不能向其写入数据;

输入流:只能向其写入数据,而不能从中读取数据。

2-字节流和字符流:

字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符·;

字节流主要由InputStream和OutputStream作为基类;

字符流主要由Reader和Writer作为基类。

3-节点流和处理流:

节点流:可以从\向有关特定的IO设备(如磁盘、网络)读\写数据的流。节点流也被称为低级流。

处理流:用于对一个已经存在的流进行连接或封装,通过封装后的流来实现数据的读\写功能。处理流也被称为高级流。

处理流功能体现:

>>>性能的提高:主要以增加缓冲的方式来提高输入\输出的效率。

>>>操作的便捷:处理流可能提供了一系列便捷的方法来一次输入\输出大批量的内容,而不是输入\输出一个或多个“水滴”,对于字节流,每个“水滴”是字节;对于字符流,该水滴是字符。

字节流和字符流:

>>>InputStream和Reader: 

  •  InputStream里包含3个方法:

>>>int read()  :从输入流中读取单个字节,返回所读取的字节数据(字节数据可直接转换为int类型)。

>>>int read(byte[] b)   :从输入流中读取最多b.length个字节的数据,并将其存储在数组b中,返回实际读取的字节数。

>>>int read(byte[] b,int off,int len)    :从输入流中最多读取len个字节的数据,并将其存储在数组b中;放入数组b中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字节数。

  • Reader里包含3个方法: 

 >>>int read ()   :从输入流中读取单个字符,返回所读取的字符数据(字符数据可直接转换为int类型)。

>>>int read(char[] cbuf)    :从输入流中读取最多b.length个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数。

>>>int read(char[] cbuf,int off,int len)    :输入流中最多读取len个字符的数据,并将其存储在字符数组cbuf中;放入数组cbuf中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字符数。

 程序如何判断取水取到最后呢?直到 read(char[] cbuf) 或read(char[] cbuf,int off,int len)   方法返回-1,即表明到了输入流的结束点。(-1可以作为循环结束的标志)。

  •  InputStream和Read都是抽象类,无法创建实例,但是它们分别有一个用于读取文件的输入流:FileInputStream和FileRead,它们都是节点流------会直接和指定文件关联。如下:

public class FileInputStreamTest
{
    public static void mian(String[] args)
    {
        //创建节点输入流
        FileInputStream fis=new  FileInputStream(" FileInputStreamTest.java");
        //创建一个长为1024的“竹筒”
        byte[] bbuf=new byte[1024];
        //用于保存实际读取的字节数
        int hasRead=0;
        //使用循环来重复“取水”过程
        while((hasRead=fis.read(bbuf))>0)
        {
            //取出"竹筒"中的水滴(字节),将字节数组转换为字符串输入
            System.out.println(new String(bbuf,0,hasRead));
        }
        //关闭文件输入流,放在finally块里更安全
        fis.close();
    }
}

 使用fis.close()来关闭该文件的输入流,程序里打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所有应该显式关闭文件IO资源。

也可以通过自动关闭资源的try语句来关闭这些IO流。如下:

public class FileReaderTest 
{
    public static void mian(String[] args)
    {
        try(

         //创建节点输入流
        FileReader fr=new  FileReader(" FileReaderTest.java");
        //创建一个长为1024的“竹筒”
        char[] cbuf=new char[32];
        //用于保存实际读取的字节数
        int hasRead=0;
        //使用循环来重复“取水”过程
        while((hasRead=fr.read(cbuf))>0)
        {
            //取出"竹筒"中的水滴(字节),将字节数组转换为字符串输入
            System.out.println(new String(cbuf,0,hasRead));
        }
      catch(IOException ex)
        {
            ex.printStackTrace();
        }
    }
}

 >>>OutputStream和Writer:

  • 两个流都提供了如下3个方法:
  • >>>void write(int c)  :将指定的字节数组\字符数组中的数据输出到输出流中,其中c既可以代表字节又可以代表字符。
  • >>>void write(byte[]/char[] buf)    :将字节数组/字符数组中数据输出到指定输出流中。
  • >>>void write(byte[] char[] buf,int off,int len)  :将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到输出流中。 

>>>>因为字符流直接以字符作为操作单位,所以Writer可以用字符串来代替字符数组,即以String对象作为参数。Writer里还包含如下两个方法:

  •  >>>void write(String str)   :将str字符串里包含的字符输出到指定输出流中。
  • >>>void write(String str,int off,int len)   :将str字符串里从off位置开始,长度为len的字符输出到指定输出流中。如下程序使用FileInputStream 来执行输入,并使用FileOutputStream来执行输出,用以实现复制FileOutStreamText.java文件的功能。

public class FileOutputStreamTest
{
    public static void main(String[] args)
    {
        try(
                //创建字节输入流
                FileInputSream fis=new FileInputStream("FileOutputStreamText.java");
                //创建字节输出流
                FileOutputStream fos=new  FileOutputStream("newFile.txt");
            )
        {
            byte[] bbuf=new byte[32];
            int hasRead=0;
            //循环从输入流中取出数据
            while((hasRead=fis.read(bbuf))>0)
            {
                //每读取一次,即写入文件输出流,读了多少,就写多少
                fos.write(bbuf,0,hasRead);
            }
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
    }
}

运行是买你的程序,将看到系统当前路径下多了一个文件:newFile.txt,该文件的内容和FileOutputStreamTest.java文件的内容完全一样。 

注意:使用 Java 的 IO 流执行输出时,不要忘记关闭输出流,关闭输出流除了可以保证流的物理资源被回收之外,可能还可以将输出流缓冲区中的数据 flush 到物理节点里(因为在执行 close())方法之前,自动执行输出流的 flush()方法)。 Java 的很多输出流默认都提供了缓冲功能,要正常关闭所有的输出流即可保证程序正常。

>>>如果希望字节输出字符串内容,则可以使用Writer会有更好的效果:

public class FileWriterTest
{
    public static void main(String[] args)
    {
        try(
                FileWriter fw =new FileWriter("poem.txt")
            )
           {
                fw.write("锦瑟---李商隐\r\n");
                fw.write("锦瑟无端五十弦,一弦一柱思华年。\r\n");
                fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\r\n");
                fw.write("沧海月明中有泪,蓝田日暖玉生烟。\r\n");
                fw.write("此情可待成追忆,只是当时已惘然。\r\n");
            }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
    }
}

运行上面的程序,将会在当前目录下输出一个poem.txt文件,文件内容就是程序中输出的内容。

注意:Windows平台的换行符:\r\n  ;如果是UNIX\Linux\BSD等平台,则使用\n作为换行符。

输入\输出流体系:

  • 处理流的用法:使用处理流来包装节点流,程序通过处理流来执行输入\输出功能,让节点流与底层的I/O设备、文件交互。
  • 使用PrintStream处理流来包装OutputStream,使用处理流后的输出流在输出时更加方便。 
public class PrintStreamTest
{
    public static void main(String[] args)
    {
        try(
                FileOutputStream fos=new FileOutputStream("test.txt");
                PrintStream ps=new PrintStream(fos)
            )
            {
                //使用PrintStream执行输出
                ps.println("普通字符串");
                //直接使用PrintStream输出对象
                ps.println(new PrintStreamTest());
            }
            catch(IOException ioe)
                  {
                    ioe.printStackTrace();
                  }
    }
}

 由于PrintStream类的输出功能非常强大,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。

  •  转换流:

两个转换流用于实现将字节流转换成字符流,其中InputStreamReader将字节输入流转换成字符输入流,OutputStream将字节输出流转换成字符输出流。

将System.in包装成BufferReader, BufferReader流具有缓冲功能,它可以一次读取一行文本——以换行符作为标志;如果没有读到换行符,则程序阻塞,直到读到换行符为止。由于BufferReader具有一个readLine()方法,可以非常方便地一次读入一行内容,所以经常把读取文本内容的输入流包装成BufferReader,用来方便地读取输入流的文本内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

captain_dong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值