黑马程序员 —— Java高级视频_IO输入与输出(第十八天)2

来源:互联网 发布:淘宝店铺头像去哪改 编辑:程序博客网 时间:2024/05/16 06:12

------- android培训、java培训、期待与您交流! ----------

六    IO流(概述)


1、初步认识IO流

IO就是input和output的意思,下面是对IO流的初步认识:

  • IO流用来处理设备(内存 硬盘等等)之间的数据传输。

  • Java对数据的操作是通过流的方式。

  • Java用于操作流的对象都在IO包中。

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

  • 流按流向分为:输入流和输出流。


2、字符流和编码表

其实早期出现的,都是字节流,最终都是二进制。后来为了方便处理文本数据才出现字符流

通过例如ASCII码这样的编码表,方便了字母的输入输出

但因为有ASCII码表、中文GBK码表、国际标准Unicode码表、Unicode优化后的UTF-8码表等等各种各样的码表,

那么就可能产生“你按GBK码表存,我按UTF-8码表读”而导致乱码的问题。

因此,Java让字符流通过指定编码表,通过在内部糅合编码表来解决这种乱码问题。


*文字采用字符流。图片用二进制码,还是用字节流。

*unicode和UTF-8有区别,unicode表无论什么字符都用两个字节表示,UTF-8优化了存储。


3、IO流的常用基类

  • 字节流的抽象基类:InputStream(读)、OutputStream()
  • 字符流的抽象基类:Reader(读)、Writer()

注意:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀,例如InputStream的子类FileInputStream和Reader的子类FileReader


4、IO流体系图



七    FileWriter


学习字符流,找到父类Writer,查阅API文档得知:

  • void write(char[] cbuf) 写入字符数组。
  • abstract  void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
  • void write(int c) 写入单个字符。
  • void write(String str) 写入字符串。
  • void write(String str, int off, int len) 写入字符串的某一部分。

Writer类可以写入字符数组、单个字符、字符串或字符串某个部分等等。

既然IO流是用于操作数据的,数据的最常见体现是什么?→文件。


那么先以操作文件为主进行演示。需求:在硬盘上,创建一个文件并写入一些文字数据。

找到一个专门用于操作文件的Writer子类对象。FileWriter(后缀名是父类名,前缀名是该流对象的功能)。


示例代码:

import java.io.*;public class FileWriterDemo {public static void main(String[] args) throws IOException {// 创建一个FileWriter对象。该对象一被初始化就必须明确被操作的文件。// 而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将会被覆盖。// 其实该步骤就是在明确数据要存放的目的地。// 会抛异常,因为文件的路径不一定真的存在。FileWriter fw = new FileWriter("demo.txt");// 调用writer方法,将字符串写入到流中。fw.write("ABC");// 其实是写到流里面(在内存),而不是直接写到文件中。// 将数据刷到目的地中fw.flush();fw.write("DEF");fw.flush();fw.close();// close()的特点:关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。// close()和flush()的区别:flush刷新后,流可以继续用,close刷新后,会将流关闭。}}


八    IO异常的处理方式


直接上代码:

import java.io.*;public class FileWriterDemo{public static void main(String[] args) {FileWriter fw = null;try {fw = new FileWriter("demo.txt");// 调了windows底层创建文件的方法fw.write("abcdefg");} catch (IOException e) {System.out.println(e.toString());} finally {try {if (fw != null) {fw.close();}} catch (IOException e) {e.printStackTrace();}}}}

上面是一个标准的流对象创建过程,注意:

1.因为要保证方法执行后关闭系统资源,所以close()方法要放到finally当中。

2.然后,放到finally后,调用close的fw就不在作用范围内了,要放到外面 FileWriter fw = null;

3.因为FileWriter的各种操作都抛IO异常,所以 fw.close();那里也要加try……catch

4.最后为了保证健壮性,要加上   if(fw!=null){


九    文件的续写


使用FileWriter的另外一个构造方法,就可以实现文件的续写:

FileWriter(String fileName, boolean append)    根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据的续写。


示例代码:

import java.io.*;public class FileWriterDemo{public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("demo.txt", true);// 传递一个true参数,代表不覆盖已有文件。并在已有文件的末尾处进行数据续写。fw.write("\r\n");// windows系统下要换行,需要些\r\nfw.write("AAAAAAAAAA");fw.flush();}}

注意:

  • 是直接传true,不是字符串"true"。
  • 因为Windows系统不识别\n的换行,要\r\n才行。


十    文本文件读取方式一


通过查阅API文档可知,Reader类对象可以读单个字符、字符数组等等。

另外字符流肯定都有编码,不过一般是默认的而已。先了解一下最简单的read()方法:


示例代码:

import java.io.*;public class FileReaderDemo{public static void main(String[] args) throws IOException {// 创建一个文件读取流对象,和指定名称的文件相关联。// 要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException(IO异常的子类)。FileReader fr = new FileReader("demo.txt");// 调用读取流对象的read方法// read():一次读一个字符,而且会依次往下读int ch1 = fr.read();System.out.println((char) ch1);int ch2 = fr.read();System.out.println((char) ch2);// read():如果已到达流的末尾,则返回-1,这样就有了循环条件。int ch = 0;while ((ch = fr.read()) != -1) {System.out.print((char) ch);}fr.close();}}


当读取完毕,windows把结束标示返回,Java没有返回这个结束标示,而是返回-1,以表示读取的数据结束了。


十一    文本文件读取方式二


第二种方式,就是read(char[] cbuf)方法,通过字符数组进行读取。


示例代码1:

import java.io.*;public class FileReaderDemo{public static void main(String[] args) throws IOException {FileReader fr = new FileReader("demo.txt");char[] cbuf = new char[3];int num = fr.read(cbuf);System.out.println("读取的长度:" + num + ",读取的内容:" + new String(cbuf) + ".");fr.close();}}

示例代码2:


import java.io.*;public class FileReaderDemo {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("c:\\demo.txt");// 定义一个字符数组。用于存储读到字符。// 该read(char[])返回的是读到的字符个数。char[] buf = new char[1024];int num = 0;while ((num = fr.read(buf)) != -1) {System.out.println(new String(buf, 0, num));}}}


*数组长度一般是定为1024的整数倍


十二    文本文件读取练习


练习:读取一个java文件,并打印


//读取一个.java文件,并打印在控制台上。import java.io.*;public class FileReaderDemo{public static void main(String[] args) throws IOException {FileReader fr = new FileReader("D:\\MyEclipse\\Workspaces\\LearnIO\\src\\LearnIO1\\FileReaderDemo.java");int num = 0;char[] buf = new char[1024];while ((num = fr.read(buf)) != -1) {System.out.println(new String(buf, 0, num));}fr.close();}}

当然,上面的程序把文件路径改为当前.java文件所在路径才可以运行。


十三    拷贝文本文件


复制的原理:其实就是将一个文件的数据存储到另一个文件中


步骤:

  1. 在D盘创建一个文件,用于存储C盘文件中的数据
  2. 定义读取流和C盘文件关联
  3. 通过不断的读写完成数据存储
  4. 关闭资源


示例代码:

import java.io.*;class Demo {public static void main(String args[]) throws Exception {copy_2();}public static void copy_1() throws Exception {// 创建目的地FileWriter fw = new FileWriter("Demo_copy.java");// 与已有文件关联FileReader fr = new FileReader("Demo.java");int ch = 0;while ((ch = fr.read()) != -1) {fw.write(ch);}fw.close();fr.close();}public static void copy_2() throws IOException {// 创建目的地FileWriter fw = null;// 与已有文件关联FileReader fr = null;try {fw = new FileWriter("Demo_copy.java");fr = new FileReader("Demo.java");char[] buf = new char[1024];int len = 0;while ((len = fr.read(buf)) != -1) {fw.write(buf, 0, len);}} catch (IOException e) {throw new RuntimeException("读写失败");} finally {if (fr != null)try {fr.close();} catch (IOException e) {}if (fw != null)try {fw.close();} catch (IOException e) {}}}}


拷贝文本文件的图例:


简单来说,就是通过 源文件读取 — IO流中转 — 目标文件写入 这样不断重复,达到拷贝的目的。


要理解IO流,最重要的还是多上机敲代码。


------- android培训、java培训、期待与您交流! ----------

0 0
原创粉丝点击