1、输入输出流
基于字节流的stream:
DataOutputStream----DataInputStream
FileOutputStream-----FileInputStream:
基于字符流的stream(典型的以write和reader来标识的):
FileWriter---FileReader:
StringWriter---StringReader:
1.2
InputStream 和OutputStream的使用:
InputStream 和OutputStream,是字节流操作的两个顶级抽象类,一般情况下都是通过如FileOutputStream和FileInputStream,及其他实现类来进行操作
InputStream:
(1)从流中读取数据
int read() 读取一个字节,返回值为所读得字节
int read(byte b[]) 读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际独取的字节的数量。
int read(byte b[] ,int off,int len)读取len个字节,放置到以下标off开始字节数组b中,返回值为实际读取的字节的数量。
int available() 返回值为流中尚未读取的字节的数量。
long skip(long n);读指针跳过n个字节不读,返回值为实际跳过的字节数量
(2)关闭流
close() 流操作完毕后必须关闭
(3)使用输入流中的标记
void mark(int readlimit)纪录当前指针的所在位置.readlimit表示读指针读出的readlimit个字节后所标记的指针位置才实效。
void reset() 把读指针重新指向用mark方法所记录的位置
boolean markSupported() 当前的流是否支持读指针的记录功能。
OutputStream:
(1)输出数据
void write(int b)往流中写一个字节b
void write(byte b[])往流中写一个字节数组b
void write(byte b[],int off,int len)把字节数组b中从下标off开始,长度为len的字节写入流中
(2)
flush()刷空输出流,并输出所有被缓存的字节
由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。
(3)关闭流
close()流操作完毕后必须关闭。
/**
* 流寫入文件
*
@param
in
*
@param
file
*
@return
*
@throws
IOException
*/
public
static
File copyFile(InputStream
in,File
file)
throws
IOException{
int
reader
= 0;
byte[]
read
=
new
byte[4096];
OutputStream
out
=
new
FileOutputStream(
file);
while((reader
=
in.read(read,
0, 1024)) != -1){
out.write(
read, 0,
reader);
}
in.close();
out.close();
return
file;
}
1.3 Reader和Writer是所有字符流类的的抽象基类,用于简化对字符串的输入输出编程,即用于读写文本数据:
/**
* 字符串写入文件
---字符流
*
@param
str
*
@param
filepath
*
@throws
IOException
*/
public
static
void
writer(String
str,String
filepath)
throws
IOException{
File
file
=
getFile(filepath);
FileWriter
writer
=
new
FileWriter(
file);
writer.write(
str);
writer.flush();
writer.close();
}
/**
* 字符串读取
---字符流
*
@param
filepath
*
@return
*
@throws
IOException
*/
public
static
String reader(String
filepath)
throws
IOException{
File
file
=
getFile(filepath);
FileReader reader
=
new
FileReader
(file
);
StringBuffer
buffer
=
new
StringBuffer();
char[]
chars
=
new
char[100];
int
i
= 0;
while((
i
=
reader.read(
chars, 0, 100)) != -1){
buffer.append(
chars,0,
i);
}
return
buffer.toString();
}
1.4 字节流与字符流的区别
1、字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的。
2、字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用。
3、的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容。
2、字符串与流之间的简单转换:
这里推荐使用字节流,因为可以设置编码方式,如果要快速的进行读写,可以使用字符流。
/**
* 字符串写入文件
---字节流
*
@param
str
*
@param
filepath
*
@throws
IOException
*/
public
static
void
StrToFile(String
str,String
charset,String
filepath)
throws
IOException{
File
file
= StrToStream.
getFile(filepath);
//Set names=Charset.availableCharsets().keySet(); 获取所有的编码方式名称
byte[]
bs
=
str.getBytes(
charset);
//注意编码方式,解析时编码方式要对应,否则会有乱码
//byte[]
bs = str.getBytes(); //这里默认使用GBK编码
OutputStream
out
=
new
FileOutputStream(
file);
out.write(
bs);
out.flush();
out.close();
System.
out.println(
"done");
}
/**
* 字符串读取
---字节流
*
@param
filepath
*
@param
charset
*
@return
*
@throws
IOException
*/
public
static
String StreamToStr(String
filepath,String
charset)
throws
IOException{
File
file
= StrToStream.
getFile(filepath);
InputStream
strem
=
new
FileInputStream(
file);
StringBuffer
buffer
=
new
StringBuffer();
byte[]
bs
=
new
byte[2048];
int
i
= 0;
while((
i
=
strem.read(
bs, 0, 2048)) != -1){
buffer.append(
new
String(
bs,
charset));
//使用对应编码方式转换
}
return
buffer.toString();
}