黑马程序员——JAVA-IO

来源:互联网 发布:中国海关贸易数据库 编辑:程序博客网 时间:2024/05/22 03:44

----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------

异常
(1)程序出现的不正常的情况。
(2)异常的体系
Throwable
|--Error 严重问题,我们不处理。
|--Exception
|--RuntimeException运行期异常,我们需要修正代码
|--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过
(3)异常的处理:
A:JVM的默认处理
把异常的名称,原因,位置等信息输出在控制台,但是呢程序不能继续执行了。
B:自己处理
a:try...catch...finally
自己编写处理代码,后面的程序可以继续执行
b:throws
把自己处理不了的,在方法上声明,告诉调用者,这里有问题
(4)finally关键字
A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了
B:异常处理的变形
try...catch...finally
try...catch...
try...catch...catch...
try...catch...catch...fianlly
try...finally
(5)自定义异常
继承自Exception或者RuntimeException,只需要提供无参构造和一个带参构造即可
(
6
)异常的注意实现
A:父的方法有异常抛出,子的重写方法在抛出异常的时候必须要小于等于父的异常 
B:父的方法没有异常抛出,子的重写方法不能有异常抛出
C:父的方法抛出多个异常,子的重写方法必须比父少或者小
File
(1)IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件
(2)构造方法
A:File file = new File("e:\\demo\\a.txt");
B:File file = new File("e:\\demo","a.txt");
C:File file = new File("e:\\demo");
  File file2 = new File(file,"a.txt");
(3)File类的功能
A:创建功能
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
B:删除功能
public boolean delete()
C:重命名功能
public boolean renameTo(File dest)
D:判断功能
public boolean isDirectory():判断是否是目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏

E:获取功能
public String getAbsolutePath():获取绝对路径
public String getPath():获取相对路径
public String getName():获取名称
public long length():获取长度。字节数
public long lastModified():获取最后一次的修改时间,毫秒值
F:高级获取功能
public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

IO流
    IO流用来处理设备之间的数据传输。Java对数据的操作是通过流的方式。Java用于操作流的对象都在IO包中。
    输入流和输出流相对于内存设备而言。

    将外设中的数据读取到内存中:输入。
    将内存的数写入到外设中:输出。

    流按操作数据分为两种:字节流与字符流。

    字符流的由来:
    其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字。再对这个文字进行操作。简单说:字节流+编码表。


 IO流常用基类-字符流

    字节流的抽象基类:InputStream,OutputStream。

    字符流的抽象基类:Reader,Writer。

    P.S.
    由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
    如:InputStream的子类FileInputStream。
    如:Reader的子类FileReader。


    需求:将一些文字存储到硬盘一个文件中。
    记住:如果要操作文字数据,建议优先考虑字符流。
    而且要将数据从内存写到硬盘上,要使用字符流中的输出流:Writer。
    硬盘的数据基本体现是文件,希望找到一个可以操作文件的Writer:FileWriter。


示例1:
  1. import java.io.FileWriter;
  2. import java.io.IOException;

  3. public class FileWriterDemo{
  4.        public static void main(String[] args) throws IOException{
  5.              //创建一个可以往文件中写入字符数据的字符输出流对象
  6.              //既然是往一个文件中写入文字数据,那么在创建对象时,就必须明确该文件(用于存储数据的目的地)
  7.              //如果文件不存在,则会自动创建
  8.              //如果文件存在,则会被覆盖
  9.             FileWriter fw = new FileWriter("demo.txt" );
  10.             
  11.              //调用Writer对象中的write(string)方法,写入数据
  12.              //其实数据写入到临时存储缓冲区中
  13.             fw.write( "abcde");
  14.             
  15.              //进行刷新,将数据直接写入到目的地中
  16.             fw.flush();

  17.              //关闭流,关闭资源,在关闭前会先调用flush刷新缓冲中的数据到目的地。
  18.             fw.close();
  19.       }
  20. }
运行结果:



  P.S.
    1. close方法只能用一次。
    2. 流关闭以后不能,不能再调用write方法,否则会报如下异常错误:

如果构造函数中加入true,可以实现对文件进行续写。
示例2:
  1. import java.io.FileWriter;
  2. import java.io.IOException;

  3. public class FileWriterDemo{
  4.        public static void main(String[] args) throws IOException{
  5.             FileWriter fw = new FileWriter("demo.txt" ,true);

  6.             fw.write( "xixi");
  7.             fw.close();
  8.       }
  9. }
 运行结果:



IO流的异常处理方式:为防止代码异常导致流无法关闭,因此在finally中对流进行关闭。

示例3:
  1. import java.io.FileWriter;
  2. import java.io.IOException;

  3. public class IOExceptionDemo{
  4.        public static void main(String[] args){

  5.             FileWriter fw  = null;

  6.              try{
  7.                   fw = new FileWriter("demo.txt" );
  8.       
  9.                   fw.write( "abcde");
  10.             } catch(IOException e){
  11.                   System.out.println(e.toString());
  12.             } finally{
  13.                    try{
  14.                         fw.close();
  15.                   } catch(IOException e){
  16.                          throw new RuntimeException("关闭失败");
  17.                   }
  18.             }
  19.       }
  20. }
运行结果:



需求:读取一个文文件,将读取到的字符打印到控制台。(使用FileReader)
    第一种读取方式:使用read()方法读取文本文件数据

示例4:
  1. import java.io.FileReader;
  2. import java.io.IOException;

  3. public class FileReaderDemo{
  4.        public static void main(String[] args) throws IOException{

  5.             FileReader fr = new FileReader("demo.txt" );

  6.              //用Reader中的read方法读取字符
  7.              int ch = 0;

  8.              while((ch = fr.read()) != -1){
  9.                   System.out.println(( char)ch);
  10.             }

  11.             fr.close();
  12.       }
  13. }
运行结果:


第二种读取方式:使用read(char[])方法读取文本文件数据。

示例5:
  1. import java.io.FileReader;
  2. import java.io.IOException;

  3. public class FileReaderDemo{
  4.        public static void main(String[] args)throws IOException{
  5.             FileReader fr = new FileReader("demo.txt" );

  6.              //使用read(char[])读取文本文件数据
  7.              //先创建字符数组
  8.              char[] buf = new char[3];

  9.              int len = 0;

  10.              while((len = fr.read(buf)) != -1){
  11.                   System.out.println( new String(buf,0,len));
  12.             }

  13.             fr.close();
  14.       }
  15. }
运行结果:

 字符流的缓冲区
    缓冲区的出现提高了对数据的读写效率。

    对应类:
   BufferedWriter
   BufferedReader


    P.S.
    缓冲区要结合流才可以使用。

    作用:在流的基础上对流的功能进行了增强。


示例6:提高写入效率,使用缓冲区。
  1. import java.io.BufferedWriter;
  2. import java.io.FileWriter;
  3. import java.io.IOException;

  4. public class BufferedWriterDemo{
  5.        public static void main(String[] args) throws IOException{
  6.             FileWriter fw = new FileWriter("buf.txt" );

  7.              //为了提高写入的效率,使用了字符流的缓冲区
  8.              //创建了一个字符写入流的缓冲区对象,并且指定与要被缓冲的流对象相关联
  9.             BufferedWriter bufw = new BufferedWriter(fw);

  10.              for(int x = 1; x <= 4; x++){
  11.                    //使用缓冲区的写入方法将数据先写入到缓冲区中
  12.                   bufw.write( "abcdef" + x);
  13.                    //写入内容换行方法:newLine();
  14.                   bufw.newLine();
  15.                   bufw.flush();
  16.             }

  17.              //使用缓冲区的刷新方法将数据刷目的地中
  18.             bufw.flush();

  19.              //关闭缓冲区,其实关闭的就是被缓冲的流对象
  20.             fw.close();
  21.       }
  22. }
运行结果:



字符流缓冲区:

    写入换行使用BufferedWriter类中的newLine()方法。
    读取一行数据使用BufferedReader类中的readLine()方法。

    bufr.read():这个read方法是从缓冲区中读取字符数据,所以覆盖了父类中的read方法。
    bufr.readLine():另外开辟了一个缓冲区,存储的是原缓冲区一行的数据,不包含换行符。

示例7:
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;

  5. public class CopyTextBufTest{
  6.        public static void main(String[] args) throws Exception {
  7.             FileReader fr = new FileReader("buf.txt" );
  8.             BufferedReader bufr = new BufferedReader(fr);

  9.             FileWriter fw = new FileWriter("buf_copy.txt" );
  10.             BufferedWriter bufw = new BufferedWriter(fw);
  11.             
  12.             String line = null;

  13.              //方式一
  14.              while((line = bufr.readLine()) != null){
  15.                   bufw.write(line);
  16.                   bufw.newLine();
  17.                   bufw.flush();
  18.             }

  19.              //方式二
  20.              /*
  21.             int ch = 0;

  22.             while((ch = bufr.read()) != -1){
  23.                   bufw.write(ch);
  24.             }
  25.             */

  26.             bufr.close();
  27.             bufw.close();
  28.       }
  29. }
运行结果:


0 0
原创粉丝点击