黑马程序员 —— 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文件所在路径才可以运行。
十三 拷贝文本文件
复制的原理:其实就是将一个文件的数据存储到另一个文件中
步骤:
- 在D盘创建一个文件,用于存储C盘文件中的数据
- 定义读取流和C盘文件关联
- 通过不断的读写完成数据存储
- 关闭资源
示例代码:
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培训、期待与您交流! ----------
- 黑马程序员 —— Java高级视频_IO输入与输出(第十八天)2
- 黑马程序员 —— Java高级视频_IO输入与输出(第十八天)1
- 黑马程序员 —— Java高级视频_IO输入与输出(第十九天)2
- 黑马程序员 —— Java高级视频_IO输入与输出(第十九天)1
- 黑马程序员 —— Java高级视频_IO输入与输出(第二十天)
- 黑马程序员 —— Java高级视频_IO输入与输出(第二十一天)
- 黑马程序员--java高级视频_io输入与输出
- JAVA高级视频_IO输入与输出
- Java高级视频_IO输入与输出(一)
- Java高级视频_IO输入与输出(二)
- Java高级视频_IO输入与输出(三)
- 学习笔记11—JAVA高级视频02_IO输入与输出
- JAVA高级视频02_IO输入与输出日记2(02-04到05)
- 黑马程序员_IO输入与输出(2)
- JAVA高级视频02_IO输入与输出日记1(02-01到02—03)
- JAVA高级视频_IO输入与输出01 学习笔记
- JAVA高级视频_IO输入与输出04 学习笔记
- JAVA高级视频_IO输入与输出_收获一
- JSON解析工具-org.json 解读
- 黑马程序员—Java基础加强学习笔记之泛型
- new 和 delete
- 《编写高质量代码——Web前端开发修炼之道》读后随笔
- JavaScript开发规范要求
- 黑马程序员 —— Java高级视频_IO输入与输出(第十八天)2
- 【算法基础】冒泡、选择、插入排序(三种基本排序)
- Intent的几种用法
- string reorder
- Android 页面布局属性全
- Linux下查看文件和文件夹大小的df和du命令
- redis启动和关闭
- 物化视图在物流系统中的应用
- C# 10点半扑克牌游戏程式码