您的位置:首页 > 编程语言 > Java开发

Java初级笔记_IO流_2

2015-07-05 18:22 681 查看
------<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转换流使用

创建转换流对象时,使用编码。

与字符串共同使用时,保证编码统一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: