java

来源:互联网 发布:仿优酷网站源码php 编辑:程序博客网 时间:2024/06/06 01:29

java 的I/O操作,全称为Input/OutPut,即输入输出操作。我们在开发的过程中,对很多的数据都需要通过I/O操作进行输入或者输出。因此,掌握I/O操作,于开发工作而言是最不可或缺的。同时,关于这个知识点,里面包含了太多的实现类,不能一一介绍完毕。所以选取几个比较常用的进行讲解。其他的可以通过观看文档,结合这章内容进行分析和理解。话不多讲,就进入我们的第一个知识点:

File类

在整个I/O包中,唯一与文件本身有关的类就是File类,我们可以用它来进行创建或者删除文件等操作。通过它,我们可以通过代码来创建或者删除一个文件/文件夹。下面看例子:

public class Test1 {    public static void main(String[] args){    //设置创建文件的路径,这里为我电脑中的桌面,文件名为test.txt        String pathName = "C:\\Users\\dml\\Desktop\\test.txt";        //实例化文件操作        File  file = new File(pathName);        try {        //创建出一个新的文件            file.createNewFile();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

运行这段代码,控制台没有任何输出,但是在桌面上会出现一个test.txt文件,如图:
这里写图片描述
至于其他操作,这里不多做实例。贴上相应的方法:

  文件或目录的属性canRead() canWrite() canExecute()                 是否可读可写可执行isHidden()      是否隐藏文件exists()        表示的路径是否存在getAbsolutePath()   获得文件的完整路径getName()       获得文件名getParent()     获得父目录lastModified()      最后修改时间,毫秒值length()        文件字节量,对目录无效isDirectory()       是否文件夹isFile()        是否文件getTotalSpace()     空间总大小getFreeSpace()      可用空间     文件或目录操作createNewFile()     创建文件delete()        删除文件或“空目录”mkdir()         创建单层目录mkdirs()        创建多层目录renameTo()      改名、移动             【注意】 创建删除重命名方法返回 boolean,表示操作是否成功File.createTempFile(前缀,  后缀)    在系统临时目录创建临时文件

RandomAccessFile类

我们发现,上面的File类中,我们只是创建出一个文件。但是怎么操作文件内容呢,这里就可以使用RandomAccessFile类。继续看示例:

public class Test1 {    public static void main(String[] args) throws IOException{        String pathName = "C:\\Users\\dml\\Desktop\\test.txt";        File  file = new File(pathName);        //要输出的内容        String outPutTest = "hello I/O";        //“rw”,为读写操作,意味可以通过randomAccessFile进行读或写操作        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");        //将hello I/O操作这些内容输出至test.txt文件中        randomAccessFile.writeBytes(outPutTest);    }}

在保证桌面上存在test.txt文件的基础上,我们执行以下代码。然后打开test.txt文件,会发现hello I/O已经保存进去啦。接下来再看怎么从这个文件中将hello I/O输入到程序中,修改代码如下:

public class Test1 {    public static void main(String[] args) throws IOException{        String pathName = "C:\\Users\\dml\\Desktop\\test.txt";        File  file = new File(pathName);        //“rw”,为读写操作,意味可以通过randomAccessFile进行读或写操作        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");        //创建一个byte[]数组存储输入的信息        byte[] inputTest = new byte[9];        //循环从文件中读取字节,保存到byte[]数组中        for (int i = 0; i < inputTest.length; i++) {            inputTest[i] = randomAccessFile.readByte();        }        //将bute[]数组转化为String类型        String inputInfo = new String(inputTest);        //控制台打印        System.out.println(inputInfo);    }}

运行程序,结果如下:
这里写图片描述

关于RandomAccessFile类的其他相关方法如下:

write(int b)  int整数4个字节值中,只输出末尾的一个字节值  [1][2][3][4] --> [4]write(byte[] buf)  输出数组中全部字节值write(byte[] buf, int from, int length)  输出数组中从 from 开始的 length 个read()  读取一个字节值,再补三个 0 字节,转成int类型  [4] --> [1][2][3][4]  读取结束,再读取,返回 -1read(byte[] buf)  根据数组容量,读取一批字节值放入数组, 并返回这一批的字节数量  读取结束,再读取,返回 -1seek(int position)  定位下标到指定位置getFilePointer()  获得当前下标所在的位置writeInt(int i)       输出int的4个字节值writeDouble(double d) 输出double的8个字节值...writeUTF(String s)    先输出两个字节表示字符串的字节长度,    再输出字符串的这些字节值readInt()       读4个字节,转成 intreadDouble()    读8个字节,转成 double...readUTF()  先读两个字节值来确定字符串的字节长度,再读取这些字节值,转成 String  *)读取结束,再读取,出现 EOFException      EOF - End Of File

流Stream

我们在前面已经见识过怎么操作文件。但是我们也发现,用RandomAccessFile来输出数据显得很是复杂。为了解决这一问题,有人提出的概念,把数据的读写抽象成在管道中流动,就像自来水一般。于是诞生了输入流和输出流两大类Stream,其中,又根据流的特性不同,分为字节流和字符流。下面集中介绍几个重要的流

InputStream/OutputStream

InputStream和OutputStream是字节符的抽象父类,如果要使用这两个类,则必须要先通过子类来实例化对象。如果是要操作一个文件,则可以使用FileInputStram/FileOutputStream来实例化。InputStream/OutputStream的相关方法如下:

OutputStream------------------------------  write(int b)  write(byte[] buf)  write(byte[] buf,int from, int length)  flush() 刷出缓存数据InputStream------------------------------  read()  read(byte[] buf)  available() 剩余的可读取字节数量

实例说明(以向文件中写入字符串为例)

public class Test1 {    public static void main(String[] args) throws IOException{        String pathName = "C:\\Users\\dml\\Desktop\\test.txt";        File  file = new File(pathName);        //利用多态性实例化outputStream,参数2位append,意指是否允许追加内容        //当设置为true时,每执行一次,都会向文件中写入一次内容        //否则只会覆盖上一次的输出        OutputStream outputStream = new FileOutputStream(file,true);        //要输出的内容        String outPutInfo = "test";        //将要输出的内容转化为字节        byte[] outputInfoByte = outPutInfo.getBytes();        //向外输出        outputStream.write(outputInfoByte);        //关闭流,谨记!必须关闭        outputStream.close();    }}

连续执行三次,出现

testtesttest

Reader/Writer

Reader/Writer是字符流的抽象父类,以字符为单位读写数据,要使用它,同样需要用子类去实例化该类。相关方法如下:

 Writer-------------------------------  write(int c)    int 4个字节中后面两个字节是 char 字符,    只输出末尾两个字节的字符数据  write(char[] buf)  write(char[] buf,int from,int length)  write(String s)Reader-------------------------------  read()    读取一个char字符,补两个 0 字节,    转成 int 类型    读取结束 ,再读取,返回 -1  read(char[] buf)    读取一批字符放入数组,    并返回这一批的字符数量    读取结束 ,再读取,返回 -1

示例如下(从文件中读取数据,和上面的字节流作为参照):

public class Test1 {    public static void main(String[] args) throws IOException{        String pathName = "C:\\Users\\dml\\Desktop\\test.txt";        File  file = new File(pathName);        //利用多态性实例化readerInfo        Reader readerInfo = new FileReader(file);        //设置一个接收输入信息的字符数组,容量为1024;        char[] readerInfochar = new char[1024];        //readerInfochar最终存储信息的字符长度        int len = 0;        //输入的信息,当=-1时,表示全部输入        int temp = 0;        while ((temp=readerInfo.read()) != -1) {            //将输入的信息重新转化会char            readerInfochar[len]=(char) temp;            len++;        }        //关闭流,谨记!!        readerInfo.close();        //将输入的内容转化成String        String input = new String(readerInfochar,0,len);        System.out.println(input);    }}

运行程序,结果如下:
这里写图片描述

高级流

我们发现。尽管我们用了流去简化了数据操作的步骤。但是它也不能提供一些特定的数据处理功能,比如读写固定字节格式的数据等。于是在流的基础上再进行封装,得出了高级流的改变,它可以在操作基本流的同时,进行一些特定的数据处理。下面以DataInputStream / DataOutputStream为例进行简单的介绍:

DataInputStream / DataOutputStream

DataInputStream / DataOutputStream用于读写固定字节格式的数据(int ,double,String,Char)。它们继承自FileInputStream/FileOutputStream。同时实现了DataInput和DataOutput接口。它们的常用方法如下:

 DataOutputStream    ------------------------------      writeInt(int i)      writeDouble(double d)      writechars(String s)      writeChar(int v)      writeUTF(String s)    DataInputStream    ------------------------------      readInt()      readDouble()      readFloat()      readChar()      readUTF()
public class Test1 {    public static void main(String[] args) throws IOException{        String pathName = "C:\\Users\\dml\\Desktop\\test.txt";        File  file = new File(pathName);        //实例化outputStream,构造方法需要内接一个基本流        DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(file));        //模拟的测试信息        String outInfo = "outputStream";        double  test = 99.8;        int num =3;        //输出信息        outputStream.writeChars(outInfo);        outputStream.writeChar('\n');        outputStream.writeDouble(test);        outputStream.writeChar('\n');        outputStream.writeInt(num);        outputStream.writeChar('\n');        //关闭流,谨记        outputStream.close();    }}

运行程序,再打开test.txt,就发现相关内容已经输出完毕了。注意的是,这里又可能会出现乱码问题,所以我们需要学习更多的知识:

InputStreamReader / OutputStreamWriter

InputStreamReader / OutputStreamWriter又叫做字符编码转化流,它的作用是将数据转化成特定的字符编码后再进行读写操作:
实例如下:

public class Test1 {    public static void main(String[] args) throws IOException{        String pathName = "C:\\Users\\dml\\Desktop\\test.txt";        File  file = new File(pathName);        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file),"utf-8");        String outString  = "以utf-8格式进行编码的文件";        outputStreamWriter.write(outString);        outputStreamWriter.close();    }}

不添加注释,可以根据上面的事例进行推敲理解。

总结:关于I/O流,要是细分,怕是花上10个章节也未必能讲完,因为它的实现类是在是太多了。所以,在这里不做详细的介绍,只是针对一些比较常见的进行讲解,并附带相应的实例帮助理解。对于其他的流,实际的使用方法也差不多,唯一不同的是用的途径有所不同。比如打印流,内存操作流,管道流,缓存流,合并流,压缩流等等等等,这些用法各异的流,不需要完全掌握,但也需要有一些小小的理解。这样的话才能在以后的开发中慢慢熟悉,不至于遇到一个新流的时候就捉襟见袖的。所以,关于剩下的流,建议去看一下官方文档,不要求深入,只需粗略了解一些即可。
下一章:java的异常处理,敬请期待。
如有疑问,欢迎在下方评论指出,共同探讨。

0 0
原创粉丝点击