字符流、异常处理try catch

字符流

Reader是字符输入流的父类

Writer是字符输出流的父类

字符流是以字符(char)为单位读写数据的。一次处理一个unicode

字符流的底层仍然是基本的字节流。

Reader

Reader的常用方法

  1. int read():读取一个字符,返回的int值“低16”位有效
  2. int read(char[] chs):从该流中读取一个字符数组的length个字符并存入该数组,返回值为实际读取到的字符量

Writer

Writer的常用方法

  1. void write(int c):写出一个字符,写出给定int值“低16”位表示的字符
  2. void write(char[] chs):将给定字符数组中所有字符写出
  3. void write(String str):将给定的字符串写出
  4. void write(char[] chs ,int offset,int len):将给定的字符数组中从offset处开始连续的len个字符写出
/*** 字符流 java.io.Reader和java.io.Writer* java将流按照读写单位划分为字节流与字符流* 字节流的超类是:java.io.InputStream和OutputStream* 而字符流的超类是:java.io.Reader和java.io.Writer* 他们的区别是读写单位不同,自字节流最小读写单位为一个字节,而字符流最小* 的读写单位为一个char(一个字符)** 转换流:java.io.InputStreamReader和java.io.OutputStreamWriter* 转换流是常用字符流实现类,他们是一对高级流,实际开发中我们不会直接使用他们,* 但是他们在流连接中是非常重要的一环。** 因为其他高级字符流都有一个共同特点,在流连接中只能连接其它的字符流* 而真实读写设备的低级流通常都是字节流,这会导致这些高级字节流不能直接* 连接字节流。而转换流就在其中起到"转换器"的作用,它可以连接字节流,* 并且它又是字符流,其他的字符流可以连接它。而它就负责将字符转换为字节。*/
public class OSWDemo {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("osw.txt");OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");osw.write("夜空中最亮的星,能否听清,");osw.write("那仰望的人,心底的孤独和叹息。");System.out.println("写出完毕");osw.close();}
}
/*** 使用转换流读取文本数据*/
public class ISRDemo {public static void main(String[] args) throws IOException {//将osw.txt文件中的字符读取回来FileInputStream fis = new FileInputStream("osw.txt");InputStreamReader isr = new InputStreamReader(fis,"UTF-8");int d;/*int read()字符流的read()方法是读取一个字符,返回的是一个"char"但实际是用int型返回,因此该int值对应的2进制是"低16位"有效。如果int返回值为-1则表示文件末尾。*/while((d=isr.read())!=-1){System.out.println((char)d);}isr.close();}
}
/*** 缓冲字符输出流* java.io.BufferedWriter* 内部有缓冲区,可以块写文本数据来加快写出数据速度** java.io.PrintWriter* 具有自动行刷新的缓冲字符输出流,内部总是连接BufferWriter作为其缓冲功能*/
public class PWDemo {public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {//向pw.txt文件中写入字符串/*PW提供了直接对文件做操作的构造方法PrintWrite(String path)PrintWrite(File file)*/PrintWriter pw = new PrintWriter("pw.txt","UTF-8");pw.println("雨下整夜,我的爱溢出就像雨水。");pw.println("院子落叶,跟我的思念厚厚一叠。");System.out.println("写出完毕");pw.close();}
}
/*** 使用流连接形式创建PW完成文本数据的写出操作*/
public class PWDemo2 {public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {//想pw2.txt中写入文本数据//低级流,用于将字节写入文件FileOutputStream fos = new FileOutputStream("pw2.xtx");/*高级流,转换流1:负责衔接字符流与字节流2:负责将写出的字符按照指定的字符集转换为字节*/OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");//高级流,缓冲字符输出流。负责块写文本书加速BufferedWriter bw = new BufferedWriter(osw);//高级流,PW。负责按行写字符串,并可以自动行刷新。PrintWriter pw = new PrintWriter(bw);pw.println("台上人走过不见旧颜色");pw.println("台下人听着心碎离别歌");System.out.println("写出完毕");pw.close();}
}
/*** 简易记事本功能* 程序启动后要求输入文件名,然后对文件进行写操作。* 之后用户输入的每一行字符串都要按行写入文件中。* 当用户单独输入exit时程序退出。** 要求:创建PrintWriter并且自行创建流连接完成。*/
public class Note {public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {Scanner scanner = new Scanner(System.in);System.out.println("请输入文件名");String filename = scanner.nextLine();FileOutputStream fos = new FileOutputStream(filename);OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");BufferedWriter bw = new BufferedWriter(osw);/*当创建PW时第一个参数为流,则可以再传入一个boolean型的参数如果这个值为true,则当前pw具有自动行刷新功能。即:每当我们调用println方法后会自动flush*/PrintWriter pw = new PrintWriter(bw,true);System.out.println("请输入内容,单独输入exit退出");while(true) {String line = scanner.nextLine();if("exit".equals(line)){break;}pw.println(line);}System.out.println("再见");pw.close();}
}
/*** 缓冲字符输入流* java.io.BufferedReader* 内部维护一个缓冲区可以块读写文本数据,并且可以按行读取字符串*/
public class BRDemo {public static void main(String[] args) throws IOException {//将当前源代码读取出来并输出到控制台FileInputStream fis = new FileInputStream("./src/main/java/io/BRDemo.java");InputStreamReader isr = new InputStreamReader(fis);BufferedReader br = new BufferedReader(isr);String line;/*BufferedReader提供的方法:String readLine()读取一行字符串,读取到换行符停止,并将换行符之前的内容以一个字符串形式返回(不含有最后的换行符)。如果此行为空行,即:只有换行符,则返回值为空字符串。如果此方法返回值为null,说明流读取到了末尾。*/while((line = br.readLine())!=null){System.out.println(line);}br.close();}
}

异常处理

java异常结构中定义有Throwable类,Exception和Error是其派生的子类。其中Execption表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常;而Error表示java运行时环境出现的错误,例如:JVM内存资源耗尽等。

try catch

/*** 异常处理机制中的try-catch*/
public class TryCatchDemo {public static void main(String[] args) {System.out.println("程序开始了");try {
//            String str = null;
//            String str = "";String str = "abc";/*如果str为null时,当虚拟机执行到下面的代码会发现这里存在空指针现象,于是虚拟机会实例化一个空指针异常的实例,并将其抛出。抛出后会检查报错的这句话是否被异常处理机制控制,如果没有则会将该异常抛出到当前方法外面,由调用该方法的代码去解决(这里相当于抛出到main方法外面)。*/System.out.println(str.length());System.out.println(str.charAt(0));System.out.println(Integer.parseInt(str));//try语句块中报错代码以下内容都不会被执行!System.out.println("7777777777");//catch用来捕获try中出现的指定异常并予以解决}catch(NullPointerException e){System.out.println("出现空指针!");//catch可以定义多个,当try中不同异常有不同处理方式时可以分别捕获}catch(StringIndexOutOfBoundsException e){System.out.println("字符串下标越界了!");/*catch超类异常的意义:当try中某几类异常希望使用相同处理办法时,可以catch这些异常的超类。在最后一个catch处捕获Exception也可以避免因为一个未处理的异常导致程序中断。当多个catch的异常之间存在继承关系时,子类型异常要在上面先行捕获,超类异常在下。否则编译不通过。*/}catch (Exception e){System.out.println("反正就是出了个错");}System.out.println("程序结束了");}
}

finally

/*** finally块* finally块是异常处理机制的最后一块。可以直接跟在try语句块之后或者最后一个catch之后。* finally块可以保证只要程序执行到try语句块中,无论try语句块是否抛出异常,finally块都必然执行。* 通常我们会释放资源一类的操作放在finally中确保运行。例如IO操作后的关闭。*/
public class FinallyDemo {public static void main(String[] args) {System.out.println("程序开始了");try {String str = "abc";System.out.println(str.length());//要执行玩完finally,方法才会真正的returnreturn;//结束方法}catch(Exception e){System.out.println("出错了");}finally {System.out.println("finally中的代码执行了");}System.out.println("程序结束了");}
}
/*** 在IO操作中使用异常处理机制*/
public class FinallyDemo2 {public static void main(String[] args) {FileOutputStream fos = null;try{fos = new FileOutputStream("fos.dat");fos.write(1);}catch (IOException e){e.printStackTrace();//处理异常}finally {try {if(fos!=null){fos.close();}} catch (IOException e) {e.printStackTrace();}}}
}
/*** JDF7之后,java推出了一个新的特性:自动关闭。*/
public class AutocloseableDemo {public static void main(String[] args) {//try后面的()中初始化的类必须实现Autocloseable接口try(/*编译器便以后会将try()里初始化的类在finally中调用close编译后的代码相当于是FinallyDemo2的样子*/FileOutputStream fos = new FileOutputStream("fos.dat");){fos.write(1);}catch(IOException e){e.printStackTrace();}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部