黑马程序员——JAVA学习笔记——IO

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

JAVA IO

JAVA IO操作主要指的是使用JAVA进行输入、输出操作,JAVA中的所有操作类都存放在JAVA.io包中,在使用时必须导入该包。

  在java.io包中重点为5个类和一个接口。5个类指的是:File、OutputStream、InputStream、Writer、Reader;一个接口指的是:Serializable

 

1、操作文件的类: File

在整个io 包中,唯一与文件本身有关的的类就是File.使用File类可以进行创建或删除文件等操作;

      File类的构造方法:

  public File(String pathname)   ---->实例化File类时,必须设置好路径

 

File 类中的常用方法:

   ||-表示路径的分隔符,如Windows为:“;”—>public static final String pathSeparator ;

   ||-表示路径的分隔符,如Windows为:“\”------>public static final String separator

   ||-创建新文件:public boolean createNewFile() throws IOException

   ||-删除文件:public boolean delete()

   ||-判断文件是否存在:public boolean exists()

   ||-判断给定的路径是否是一个路径:public boolean isDirectory()

   ||-返回文件的大小:Public long length()

   ||-列出指定目录的全部内容,只列出名称:public String[] list()

   ||-列出指定目录的全部内容,会列出路径:Public File[] listFiles()

   ||-创建一个目录:public boolean mkdir()

   ||-为已有的文件重命名:public boolean renameTo(File dest)

练习所列举的方法: 

列出指定目录的全部内容;

import java.io.File ;

import java.io.IOException ;

public class Test{

public static void main(String args[]){

        File my = new File("d:" + File.separator) ;  // 操作路径

        print(my) ;

}

public static void print(File file){  // 递归调用

        if(file!=null){  // 判断对象是否为空

               if(file.isDirectory()){     // 如果是目录

                      File f[] = file.listFiles() ;       // 列出全部的文件

                      if(f!=null){     // 判断此目录能否列出

                             for(int i=0;i<f.length;i++){

                                    print(f[i]) ;      // 因为给的路径有可能是目录,所以,继续判断

                             }

                      }

               }else{

                      System.out.println(file) ;       // 输出路径

               }

        }

}

};

1.1使用RandomAccessFile类对文件读取:

  RandomAccessFile主要对文件内容进行读取,其读取规则属于随机读取类,它可以随机的读取一个文件中指定位置的数据。

RandomAccessFile类中的常用方法:

   ||-接收File类的对象,指定操作路径,但是在设置时需要设置模型,r为只读;w为只写;rw为读写--------->public RandomAccessFile(File file,String mode) throws FileNotFoundException

   ||-关闭操作:public void close() throws IOException

   ||-将内容读取到一个Byte数组中:public int read(Byte[] b)throws IOException

   ||-从文件中读取整形数据:public final int readInt()throws IOException

注意:在使用mode是如果是用的“rw”操作则会自动创建新文件

代码样板测试:

1、 写入文件:

import java.io.File ;

import java.io.RandomAccessFile ;

public class RandomAccessFileDemo01{

// 所有的异常直接抛出,程序中不再进行处理

public static void main(String args[]) throws Exception{

        File f = new File("d:" + File.separator + "test.txt") ;   // 指定要操作的文件

        RandomAccessFile rdf = null ;           // 声明RandomAccessFile类的对象

        rdf = new RandomAccessFile(f,"rw") ;// 读写模式,如果文件不存在,会自动创建

        String name = null ;

        int age = 0 ;

        name = "zhangsan" ;                   // 字符串长度为8

        age = 30 ;                                  // 数字的长度为4

        rdf.writeBytes(name) ;        // 将姓名写入文件之中

        rdf.writeInt(age) ;                // 将年龄写入文件之中

        name = "lisi    " ;               // 字符串长度为8

        age = 31 ;                                  // 数字的长度为4

        rdf.writeBytes(name) ;        // 将姓名写入文件之中

        rdf.writeInt(age) ;                // 将年龄写入文件之中

        name = "wangwu  " ;                 // 字符串长度为8

        age = 32 ;                                  // 数字的长度为4

        rdf.writeBytes(name) ;        // 将姓名写入文件之中

        rdf.writeInt(age) ;                // 将年龄写入文件之中

        rdf.close() ;                         // 关闭

}

};

代码运行之后会在d盘下创建一个test.txt文件,并且写入了内容“zhangsan    30  lisi   31   wangwu   32 ”

 

2、 读取文件内容:

import java.io.File ;

import java.io.RandomAccessFile ;

public class Test{

// 所有的异常直接抛出,程序中不再进行处理

public static void main(String args[]) throws Exception{

        File f = new File("d:" + File.separator + "test.txt") ;   // 指定要操作的文件

        RandomAccessFile rdf = null ;           // 声明RandomAccessFile类的对象

        rdf = new RandomAccessFile(f,"r") ;// 以只读的方式打开文件

        String name = null ;

        int age = 0 ;

        byte b[] = new byte[8] ;       // 开辟byte数组

        // 读取第二个人的信息,意味着要空出第一个人的信息

        rdf.skipBytes(12) ;        // 跳过第一个人的信息

        for(int i=0;i<b.length;i++){

               b[i] = rdf.readByte() ;   // 读取一个字节

        }

        name = new String(b) ; // 将读取出来的byte数组变为字符串

        age = rdf.readInt() ;      // 读取数字

        System.out.println("第二个人的信息 --> 姓名:" + name + ";年龄:" + age) ;

        // 读取第一个人的信息

        rdf.seek(0) ;   // 指针回到文件的开头

        for(int i=0;i<b.length;i++){

               b[i] = rdf.readByte() ;   // 读取一个字节

        }

        name = new String(b) ; // 将读取出来的byte数组变为字符串

        age = rdf.readInt() ;      // 读取数字

        System.out.println("第一个人的信息 --> 姓名:" + name + ";年龄:" + age) ;

        rdf.skipBytes(12) ; // 空出第二个人的信息

        for(int i=0;i<b.length;i++){

               b[i] = rdf.readByte() ;   // 读取一个字节

        }

        name = new String(b) ; // 将读取出来的byte数组变为字符串

        age = rdf.readInt() ;      // 读取数字

        System.out.println("第三个人的信息 --> 姓名:" + name + ";年龄:" + age) ;

        rdf.close() ;                         // 关闭

}

};

2、字节流与字符流基本操作:

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流、

  而在java.io包中流的操作主要有字节流、字符流两大类,在字节流中使用OutputStream 进行数据输出,InputStream进行数据输入;在字符流中使用Writer类完成,输入主要是使用Reader类完成

不过大体步骤是一样:

l         使用一个File类打开一个文件

l         通过字节流或字符流的子类指定输出的位置

l         进行读/写操作

l         关闭输入/输出

 

2.1字节输出流:OutputStream

定义格式;  public abstract class OutputStream extends Object implements Closeable,Flushable

常用的方法:

   ||-关闭输出流:public void close() throws IOException

   ||-刷新缓存区:public void flush() throws IOException

   ||-将一个byte数组写入数据流:public void write(byte[] b) throws IOException

   ||-将一个指定范围的byte数组写入流:public void write(byte[] b,int off,int len) throws IOException

   ||-将一个字节流数据写入数据流:public abstract void write(int b) throws IOException

因为OutputStream类是一个抽象类,如果要使用此类,则必须使用其子类实例化对象;如:使用FileOutputStream类操作一个文件。

实例操作一:向文件中写入字符串

import java.io.File ;

import java.io.OutputStream ;

import java.io.FileOutputStream ;

public class Test{

       public static void main(String args[]) throws Exception{   // 异常抛出,不处理

              // 第1步、使用File类找到一个文件

              File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象

              // 第2步、通过子类实例化父类对象

              OutputStream input = null ;   // 准备好一个输入的对象

              input = new FileOutputStream(f)  ;    // 通过对象多态性,进行实例化

              // 第3步、进行读操作

              String str="hello world!!!";

              byte b[] = str.getBytes() ;            // 所有的内容都读到此数组之中

              input.write(b) ;             // 读取内容

              // 第4步、关闭输出流

              input.close() ;                                    // 关闭输出流

              System.out.println("内容为:" + new String(b)) ;     // 把byte数组变为字符串输出

       }

};

实例操作二:在之前的文本中追加内容

采用方法:public FileOutputStream(File file, boolean appeand) throws FileNotFoundException

此时在构造方法中,如果修改append 的值设置为true ,则表示在文件的末尾追加内容。

import java.io.File ;

import java.io.OutputStream ;

import java.io.FileOutputStream ;

public class Test{

       public static void main(String args[]) throws Exception{   // 异常抛出,不处理

              // 第1步、使用File类找到一个文件

              File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象

              // 第2步、通过子类实例化父类对象

              OutputStream out = null ;     // 准备好一个输出的对象

              out = new FileOutputStream(f,true)  ;       // 此处表示在文件末尾追加内容

              // 第3步、进行写操作

              String str = "Hello World!!!" ;             // 准备一个字符串

              byte b[] = str.getBytes() ;                   // 只能输出byte数组,所以将字符串变为byte数组

              for(int i=0;i<b.length;i++){           // 采用循环方式写入

                     out.write(b[i]) ;      // 每次只写入一个内容

              }

              // 第4步、关闭输出流

              out.close() ;                                       // 关闭输出流

       }

};

如果需要换行!可以使用”\r\n”,如:String str=”\r\n Hello World!!!”

2.2、字节输入流:InputStream

  定义方法:public abstract class InputStream extends Object implements Closeable,

  常用的方法:

    ||-取得输入文件的大小; public int  available() throws IOException

    ||-关闭输入流:Public void close() throws IOException

    ||-读取内容,以数字的方式读取:public abstract int  read() throws IOException

    ||-将内容读到byte数组中,同时返回读入的个数: public int read(byte[] b)throws IOException

   同样以FileInputStream类为其实例化对象;

实例操作一:从文件中读取内容;

import java.io.File ;

import java.io.InputStream ;

import java.io.FileInputStream ;

public class Test{

       public static void main(String args[]) throws Exception{   // 异常抛出,不处理

              // 第1步、使用File类找到一个文件

              File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象

              // 第2步、通过子类实例化父类对象

              InputStream input = null ;     // 准备好一个输入的对象

              input = new FileInputStream(f)  ;      // 通过对象多态性,进行实例化

              // 第3步、进行读操作

              byte b[] = new byte[1024] ;         // 所有的内容都读到此数组之中

              int len=input.read(b) ;           // 读取内容

              // 第4步、关闭输出流

              input.close() ;                                    // 关闭输出流

       System.out.println(“读入数据的长度:”+len)

              System.out.println("内容为:" + new String(b)) ;     // 把byte数组变为字符串输出

       }

};

实例操作二:开辟指定大小的byte数组

 使用File类中的length()方法获取一个文件的大小

import java.io.File ;

import java.io.InputStream ;

import java.io.FileInputStream ;

public class Test{

       public static void main(String args[]) throws Exception{   // 异常抛出,不处理

              // 第1步、使用File类找到一个文件

              File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象

              // 第2步、通过子类实例化父类对象

              InputStream input = null ;     // 准备好一个输入的对象

              input = new FileInputStream(f)  ;      // 通过对象多态性,进行实例化

              // 第3步、进行读操作

              byte b[] = new byte[(int)f.length()] ;          // 数组大小由文件决定

              int len = input.read(b) ;         // 读取内容

              // 第4步、关闭输出流

              input.close() ;                                    // 关闭输出流\

              System.out.println("读入数据的长度:" + len) ;

              System.out.println("内容为:" + new String(b)) ;     // 把byte数组变为字符串输出

       }

};

3、字符流

 在程序中一个字符等于两个字节,JAVA提供了Writer类和Reader类进行操作

3.1 字符输出流Writer

  定义格式;  public abstract class Writer extends Object implements Appendale ,Closeable.Flushable

常用的方法;

||-关闭输出流:public abstract void close() throws IOException

||-将字符串输入:public void write(String str) throws IOException

||-将字符数组输出:public void write(char[] cbuf) throws IOException

||-强制性清空缓存:public abstract void flush() throws IOException

实例操作一:向文件中写入数据

import java.io.File ;

import java.io.Writer ;

import java.io.FileWriter ;

public class Test{

       public static void main(String args[]) throws Exception{   // 异常抛出,不处理

              // 第1步、使用File类找到一个文件

              File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象

              // 第2步、通过子类实例化父类对象

              Writer out = null ;  // 准备好一个输出的对象

              out = new FileWriter(f)  ;    // 通过对象多态性,进行实例化

              // 第3步、进行写操作

              String str = "Hello World!!!" ;             // 准备一个字符串

              out.write(str) ;                                          // 将内容输出,保存文件

              // 第4步、关闭输出流

              out.close() ;                                       // 关闭输出流

       }

};

实例操作二;:使用FileWriter追加文件的内容

public FileWriter(File file,boolean append) throws IOException

 

import java.io.File ;

import java.io.Writer ;

import java.io.FileWriter ;

public class Test{

       public static void main(String args[]) throws Exception{   // 异常抛出,不处理

              // 第1步、使用File类找到一个文件

              File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象

              // 第2步、通过子类实例化父类对象

              Writer out = null ;  // 准备好一个输出的对象

              out = new FileWriter(f,true)  ;    // 通过对象多态性,进行实例化

              // 第3步、进行写操作

              String str = "\r\nCSDN\r\nHello World!!!" ;              // 准备一个字符串

              out.write(str) ;                                          // 将内容输出,保存文件

              // 第4步、关闭输出流

              out.close() ;                                       // 关闭输出流

       }

};

3.2、字符输入流Reader

定义;  public abstract class Reader extends Object  implements Readable,Closeable

可以使用FileReader子类为其实例化,

其中FileReader 的构造方法为:

public FileReader(File file) throws FileNotFoundException

常用的方法:

  ||-关闭输出流:public abstract void close() throws IOException

  ||-读取单个字符:public int read() throws IOException

  ||-将内容读到字符数组中,返回读入的长度:public int read(char[]  cbuf)throws IOException

实例操作一: 从文件中读取内容

import java.io.File ;

import java.io.Reader ;

import java.io.FileReader ;

public class Test{

       public static void main(String args[]) throws Exception{   // 异常抛出,不处理

              // 第1步、使用File类找到一个文件

              File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象

              // 第2步、通过子类实例化父类对象

              Reader input = null ;     // 准备好一个输入的对象

              input = new FileReader(f)  ;       // 通过对象多态性,进行实例化

              // 第3步、进行读操作

              char c[] = new char[1024] ;        // 所有的内容都读到此数组之中

              int len = input.read(c) ;         // 读取内容

              // 第4步、关闭输出流

              input.close() ;                                    // 关闭输出流

              System.out.println("内容为:" + new String(c,0,len)) ;    // 把字符数组变为字符串输出

       }

};

实例操作二:使用循环的方式读取内容

import java.io.File ;

import java.io.Reader ;

import java.io.FileReader ;

public class Test{

       public static void main(String args[]) throws Exception{   // 异常抛出,不处理

              // 第1步、使用File类找到一个文件

              File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象

              // 第2步、通过子类实例化父类对象

              Reader input = null ;     // 准备好一个输入的对象

              input = new FileReader(f)  ;       // 通过对象多态性,进行实例化

              // 第3步、进行读操作

              char c[] = new char[1024] ;        // 所有的内容都读到此数组之中

              int temp = 0 ;  // 接收每一个内容

              int len = 0 ;            // 读取内容

              while((temp=input.read())!=-1){

                     // 如果不是-1就表示还有内容,可以继续读取

                     c[len] = (char)temp ;

                     len++ ;

              }

              // 第4步、关闭输出流

              input.close() ;                                    // 关闭输出流

              System.out.println("内容为:" + new String(c,0,len)) ;    // 把字符数组变为字符串输出

       }

};

4、字节流和字符流的区别:

 字节流在操作时本身不会用到缓存区(内存),是文件本身直接操作,而字符流在操作时使用了缓存区,通过缓存区在操作文件,如下图;

 

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值