------
android培训
、
java培训
,期待与您交流 ------
黑马程序员 java之IO
IO流:用于处理设备上数据。
流:可以理解数据的流动,就是一个数据流。
流的分类:
1:输入流和输出流。
2:根据处理的数据不同,分为字节流和字符流。
字节流:处理字节数据的流对象,计算机中最小数据单元是字节,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。
字符流:基于字节流,是字节流的便捷类,是为了方便于文字的解析,将字节流和编码表封装成对象。
流的体系,该体系一共有四个基类,而且都是抽象类。
字节流:InputStream OutputStream
字符流:Reader Writer
先从字符流着手,学习流的基本操作。
API中提供的Reader,Writer基类的操作流的常用方法:
int read() 读取单个字符。作为整数读取的字符,范围在0到65535之间(0x00-0xffff),如果已到达流的末尾,则返回-1
int read(char[] cbuf) 将字符读入数组。返回读取到缓冲区的字符数,如果已到达流的末尾,则返回-1
int read(CharBuffer target) 试图将字符读入指定的字符缓冲区。
abstract void flush() 刷新该流的缓冲。
abstract void close() 关闭此流,但要先刷新它。
void write(char[] cbuf) 写入字符数组。
void write(int c) 写入单个字符。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分。
可以看出,流的基本操作就是读和写。
案例展示,复制一个文本文件。该例子中涉及到了流的读取和写入,分别用用单个字符的读取和带有自定义数组缓冲区的读写实现
package IO;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
cpFile_1();
cpFile_2();
}
//单个字符的读取写入
private static void cpFile_1() throws IOException {
FileReader fr = new FileReader("C:\\a.txt");//明确源
FileWriter fw = new FileWriter("C:\\b.txt");//明确目的
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
fw.flush();//写入流要记得刷新
}
fw.close();
fr.close();
}
//字符数组的读取写入
public static void cpFile_2() {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("C:\\a.txt");
fw = new FileWriter("C:b.txt");
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf)) != -1) {//将数据读入缓冲区,返回读取个数
fw.write(buf,0,len);//这里是将缓冲区数据写入内存了
fw.flush();
}
} catch (IOException e) {
throw new RuntimeException("读写失败");
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
为了操作数据的高效,Reader类Writer类下都分别提供了一个子类,BufferedReader和BufferedWriter。
BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
BufferedReader提供了一个特有的非常便捷的读取方式:
String readLine() 读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。
BufferedWriter提供了一个跨平台的行分隔符:
void newLine() 写入一个行分隔符。
上例用缓冲区技术实现:
@Test
public void cpFile_3(){
BufferedReader bfr=null;
BufferedWriter bfw=null;
try {
bfr=new BufferedReader((new FileReader("C:\\a.txt")));
bfw=new BufferedWriter(new FileWriter("C:\\b.txt"));
String line=null;
while ((line=bfr.readLine())!=null) {//一次读取一行,不带有桁终止符,读到末尾返回空
bfw.write(line);
bfw.newLine();//该换行其实在内存中完成
bfw.flush();
}
} catch (IOException e) {
throw new RuntimeException("读写失败");
}
finally{
if(bfr!=null){
try {
bfr.close();
} catch (IOException e) {
throw new RuntimeException("读取关闭失败");
}
}
if(bfw!=null){
try {
bfw.close();
} catch (IOException e) {
throw new RuntimeException("写入关闭失败");
}
}
}
}
这是一种设计模式:装饰设计模式。
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
总结一下字符流的体系:
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
|---BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
|---LineNumberReader:跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),
它们可分别用于设置和获取当前行号。
|---InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
|---FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
|---CharArrayReader:
|---StringReader:
Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。
|---BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
|---OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节。
它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
|---FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
|---PrintWriter:
|---CharArrayWriter:
|---StringWriter:
接着说下字节流:
InputStream:是表示字节输入流的所有类的超类。
|--- FileInputStream:从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流
|--- FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
|--- BufferedInputStream:该类实现缓冲的输入流。
|--- Stream:
|--- ObjectInputStream:
|--- PipedInputStream:
OutputStream:此抽象类是表示输出字节流的所有类的超类。
|--- FileOutputStream:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
|--- FilterOutputStream:此类是过滤输出流的所有类的超类。
|--- BufferedOutputStream:该类实现缓冲的输出流。
|--- PrintStream:
|--- DataOutputStream:
|--- ObjectOutputStream:
|--- PipedOutputStream:
字节流虽然也有其装饰类,但却没有一次性读取一行的方法,始终不方便,而在转换流中有该方法,因此,我们可以用转换流来达到目的。
转换流特有功能:转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。
如果需要制定码表,必须用转换流。
------ android培训 、 java培训 ,期待与您交流 ------
黑马程序员 java之IO
IO流:用于处理设备上数据。
流:可以理解数据的流动,就是一个数据流。
流的分类:
1:输入流和输出流。
2:根据处理的数据不同,分为字节流和字符流。
字节流:处理字节数据的流对象,计算机中最小数据单元是字节,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。
字符流:基于字节流,是字节流的便捷类,是为了方便于文字的解析,将字节流和编码表封装成对象。
流的体系,该体系一共有四个基类,而且都是抽象类。
字节流:InputStream OutputStream
字符流:Reader Writer
先从字符流着手,学习流的基本操作。
API中提供的Reader,Writer基类的操作流的常用方法:
int read() 读取单个字符。作为整数读取的字符,范围在0到65535之间(0x00-0xffff),如果已到达流的末尾,则返回-1
int read(char[] cbuf) 将字符读入数组。返回读取到缓冲区的字符数,如果已到达流的末尾,则返回-1
int read(CharBuffer target) 试图将字符读入指定的字符缓冲区。
abstract void flush() 刷新该流的缓冲。
abstract void close() 关闭此流,但要先刷新它。
void write(char[] cbuf) 写入字符数组。
void write(int c) 写入单个字符。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分。
可以看出,流的基本操作就是读和写。
案例展示,复制一个文本文件。该例子中涉及到了流的读取和写入,分别用用单个字符的读取和带有自定义数组缓冲区的读写实现
package IO;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
cpFile_1();
cpFile_2();
}
//单个字符的读取写入
private static void cpFile_1() throws IOException {
FileReader fr = new FileReader("C:\\a.txt");//明确源
FileWriter fw = new FileWriter("C:\\b.txt");//明确目的
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
fw.flush();//写入流要记得刷新
}
fw.close();
fr.close();
}
//字符数组的读取写入
public static void cpFile_2() {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("C:\\a.txt");
fw = new FileWriter("C:b.txt");
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf)) != -1) {//将数据读入缓冲区,返回读取个数
fw.write(buf,0,len);//这里是将缓冲区数据写入内存了
fw.flush();
}
} catch (IOException e) {
throw new RuntimeException("读写失败");
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
为了操作数据的高效,Reader类Writer类下都分别提供了一个子类,BufferedReader和BufferedWriter。
BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
BufferedReader提供了一个特有的非常便捷的读取方式:
String readLine() 读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。
BufferedWriter提供了一个跨平台的行分隔符:
void newLine() 写入一个行分隔符。
上例用缓冲区技术实现:
@Test
public void cpFile_3(){
BufferedReader bfr=null;
BufferedWriter bfw=null;
try {
bfr=new BufferedReader((new FileReader("C:\\a.txt")));
bfw=new BufferedWriter(new FileWriter("C:\\b.txt"));
String line=null;
while ((line=bfr.readLine())!=null) {//一次读取一行,不带有桁终止符,读到末尾返回空
bfw.write(line);
bfw.newLine();//该换行其实在内存中完成
bfw.flush();
}
} catch (IOException e) {
throw new RuntimeException("读写失败");
}
finally{
if(bfr!=null){
try {
bfr.close();
} catch (IOException e) {
throw new RuntimeException("读取关闭失败");
}
}
if(bfw!=null){
try {
bfw.close();
} catch (IOException e) {
throw new RuntimeException("写入关闭失败");
}
}
}
}
这是一种设计模式:装饰设计模式。
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
总结一下字符流的体系:
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
|---BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
|---LineNumberReader:跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),
它们可分别用于设置和获取当前行号。
|---InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
|---FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
|---CharArrayReader:
|---StringReader:
Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。
|---BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
|---OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节。
它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
|---FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
|---PrintWriter:
|---CharArrayWriter:
|---StringWriter:
接着说下字节流:
InputStream:是表示字节输入流的所有类的超类。
|--- FileInputStream:从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流
|--- FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
|--- BufferedInputStream:该类实现缓冲的输入流。
|--- Stream:
|--- ObjectInputStream:
|--- PipedInputStream:
OutputStream:此抽象类是表示输出字节流的所有类的超类。
|--- FileOutputStream:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
|--- FilterOutputStream:此类是过滤输出流的所有类的超类。
|--- BufferedOutputStream:该类实现缓冲的输出流。
|--- PrintStream:
|--- DataOutputStream:
|--- ObjectOutputStream:
|--- PipedOutputStream:
字节流虽然也有其装饰类,但却没有一次性读取一行的方法,始终不方便,而在转换流中有该方法,因此,我们可以用转换流来达到目的。
转换流特有功能:转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。
如果需要制定码表,必须用转换流。
------ android培训 、 java培训 ,期待与您交流 ------