------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、IO
概述
操作数据的工具
IO流,即数据流,数据像水流一样通过IO工具进行传输。
程序 <IO> 硬盘
IO流用来处理设备之间的数据传输。
Java对数据的操作是通过流的方式。
Java用于操作流的对象都在IO包中。
分类:
流按操作数据分为两种:字节流与字符流。
注意:其实计算机里的所有数据都是以字节的形式体现的,计算机可以直接识别字节。但是作为人类的程序员更擅长 操作字符,所以后期产生了字符流 。
流按流向分为:输入流(input)(读取),输出流(output)(写出)。相对路径与绝对路径
绝对路径:从盘符开始指定的物理路径。是真正文件在硬盘上的位置。
相对路径:相对于某个指定位置的路径。
如c:/a/b/c.txt文件。
相对于c:的路径为a/b/c.txt
c.txt相对于c:/a/b的路径为直接的c .txt
代码中Windows中路径分隔可使用/或者\\。二、字节流
概述:操作对象为字节的IO流
字节输入流:InputStream
直接操作文件的子类:FileInputStream
public abstract int read() throws IOException
public int read(byte[] b) throws IOException
public int read(byte[] b, int off, int len) throws IOException
public void close() throws IOException字节输出流:与字节流相向
高效字节流:将原有IO流进行包装,使其效率更高
高效字节输出流:BufferedOutputStream
高效字节输入流:BufferedInputStream文件的复制:结合使用输入输出流,完成数据的读取再写出。
三、字符流
字节输出流:Writer
直接操作文件的子类为FileWriter
public void write(int c) throws IOException
public void write(char[] cbuf) throws IOException
public abstract void write(char[] cbuf, int off, int len) throws IOException
public void write(String str) throws IOException
public void write(String str, int off, int len) throws IOException(1)FileWriter写入数据
操作步骤:
A:创建字符输出流对象
B:调用对象的write()方法
C:释放资源
代码体现:
FileWriter fw = new FileWriter("fw.txt");
fw.write("hello,IO");
//fw.flush();
fw.close();
几个小问题?
A:创建字符输出流对象做了那几件事情?
B:为什么要flush()?
C:为什么要close()?
D:flush()和close()的区别?
E:怎么实现换行?
F:怎么实现追加写入?
G:文件不存在,会创建一个。文件如果存在,到底是重新创建,还是把内容给清空?
(2)FileReader读取数据
操作步骤:
A:创建字符输入流对象
B:调用对象的read()方法
C:释放资源
代码体现:
FileReader fr = new FileReader("fw.txt");
//方式1
//一次读取一个字符
int ch = 0;
while((ch=fr.read())!=-1) {
System.out.print((char)ch);
}
//方式2
//一次读取一个字符数组
char[] chs = new char[1024];
int len = 0;
while((len=fr.read(chs))!=-1) {
System.out.print(String.valueOf(chs,0,len));
}
fr.close();
(3)复制文本文件
数据源:
看用那种类型的流,读取数据。
目的地:
看用那种类型的流,写出数据。
案例:
把当前项目路径下的Demo.txt复制到d盘目录下的Copy.txt中。
代码体现:
方式1:
FileReader fr = new FileReader("Demo.txt");
FileWriter fw = new FileWriter("d:\\Copy.txt");
int ch = 0;
while((ch=fr.read())!=-1) {
fw.write(ch);
}
fw.close();
fr.close();
方式2:
FileReader fr = new FileReader("Demo.txt");
FileWriter fw = new FileWriter("d:\\Copy.txt");
char[] chs = new char[1024];
int len = 0;
while((len=fr.read(chs))!=-1) {
fw.write(chs,0,len);
}
fw.close();
fr.close();
字节输入流:Reader
直接操作文件的子类为FileReader
public int read() throws IOException
public int read(char[] cbuf) throws IOException
public abstract int read(char[] cbuf, int off, int len) throws IOException高效字符流:将原有IO流进行包装,使其效率更高。
高效字节输出流:BufferedWriter
特殊方法:
public void newLine() throws IOException
高效字节输入流:BufferedReader
特殊方法:
public String readLine() throws IOException
四、其他流
(1)转换流
OutputStreamWriter:字符流通向字节流的桥梁。
OutputStreamWriter是Writer的子类,是FileWriter的父类,是字符流的一种。
InputStreamReader:字节流通向字符流的桥梁。
InputStreamReader是Reader的子类,是FileReader的父类,是字符流的一种。
转换流构造方法中,均有字节流与编码表两个参数。
字符 = 字节 + 编码表System.in:用于控制台录入,属于字节输入流
System.out:用于控制台输出,属于字节输出流
(2)数据输入输出流
数据输入输出流针对于基本数据类型。
DataInputStream:数据输入流
DataOutputStream:数据输出流
注意:在数据输入输出流的操作过程中,必须按照写入顺序读取,否则由于读取规则的不同,会造成乱码。(3)内存操作流
ByteArrayInputStream:从数组中读取字节
ByteArrayOutputStream:将字节写入到数组中
CharArrayReader:从数组中读去字符
CharArrayWriter:将字符写到数组中
StringWriter:将字符写到字符串中
StringReader:从字符串中读取数据
注意:有些IO操作流流关闭无效,不会产生IO异常。如ByteArray操作流与String操作流(4)打印流
1、概述:
专门用于数据打印的IO流。
2、特点:
A:打印流可以输出任意类型数据。
B:如果启用了自动刷新,在调用println()方法的时候,可以自动刷新并换行。
C:可以直接操作文件。
哪些流对象可以直接操作文件呢?
看其构造方法,同时有File和String构造参数的。
3、PrintStream :字节打印流
4、PrintWriter :字符打印流
可以作为普通的输出流。
public void print(char c)
public PrintWriter printf(String format, Object... args)
public void println()
printf与println方法支持自动刷新5、案例
通过打印流改进文本文件的复制。
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);
String line = null;
while((line=br.readLine())!=null) {
pw.println(line);
}
pw.close();
br.close();
printf(String fomat,Object... o);
(5)随机访问流
1、概述:
对文件进行随机访问:RandomAccessFile。
2、特点:
同时支持读与写。
需要指定模式。使用“rw”模式。3、特殊方法:
public long getFilePointer() throws IOException
注意writerUTF的指针字节个数。
public void seek(long pos) throws IOException(6)对象序列化流
1、概述:
将对象作为数据进行操作。就是把对象按照流一样的操作。方便网络传输。
2、序列化流:ObjectOutputStream
public final void writeObject(Object obj) throws IOException
3、反序列化流:ObjectInputStream
public final Object readObject() throws IOException, ClassNotFoundException
注意:被序列化的对象必须可序列化,即实现序列化接口作为可序列化的标记。
4、Serializable:序列化接口
无方法,仅作为可序列化标记使用
写出与读入时,序列化ID必须相同5、什么是序列化?如何实现序列化?什么是反序列化?
6、实现序列化接口的类是可以被序列化流操作的。
在这里面可以给定一个序列化id值。这样做简单的操作对写过的数据没有影响。(7)与IO流相关的类:Properties
1、概述:
该类是Hashtable的子类。内置了IO流的操作。用于存储属性键值对,通常作为配置文件来使用。
2、特点
键值对均为字符串
可以直接操作IO流
3、特有功能:
A:添加
Object setProperty(String key, String value)
B:获取
String getProperty(String key)
String getProperty(String key, String defaultValue)
Set<String> stringPropertyNames() 相当于以前的keySet()
4、和IO流结合的功能:
A:list 把集合中的数据写到文本文件。只能使用打印流。
B:load 把文本文件中的数据加载到集合。
C:store 把集合中的数据写到文本文件。
五、码表
编码表:将字符与数字对应的码表。
常见码表
ASCII:美国标准信息交换码。
ISO8859-1:拉丁码表。欧洲码表。
GB2312:中国的中文编码表。
GBK:中国的中文编码表升级,融合了更多的中文文字符号。
BIG-5码 :通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。
Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode
UTF-8:最多用三个字节来表示一个字符。Java基础班编码表设置:
项目编码
文件编码
数据操作编码
编码表使用。
原则:编码与解码码表统一即可。
字符串的使用
字符转成字节数组时,指定码表。
字节数组转成字符串时,指定码表。
IO转换流使用
创建转换流对象时,使用编码。
与字符串共同使用时,保证编码统一。
Java初级笔记_IO流_2
最新推荐文章于 2015-07-11 02:11:46 发布