java io 总结
分类:
按流的方向:输入和输出流
按流的数据单位:字节流和字符流
按流的功能:节点流和处理流
注1:
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。
所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!
如果是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。
在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;字节流提供了处理任何类型的IO操作的功能,
但它不能直接处理Unicode字符,而字符流就可以。
注2:
节点流表示的是直接操作节点(例如文件,键盘)的流,例如FileInputStream.
过滤流表示的是对节点流进行了操作(加工)的类,即装饰类(Decorator模式),例如
InputStreamReader(将字节流转换成字符流,是上面两者的转换类),BufferedReader
io流的四大抽象类
字符流:Reader,Writer
字节流:InputStream(读数据),OutputStream(写数据)
以上的分类非常有助于对java io流的庞大系统进行清晰的理解。
下面继续介绍常用的操作类
文件访问
FileInputStream和FileOutputStream继承基类用于向文件中输入输出字节。
FileReader和FileWriter继承基类用于向文件中输入输出字符。
缓冲流
缓冲流要套接在相应的节点流之上,提高了读写的效率。此处理流的构造方法都得传相对应的基类类型,
供了缓冲功能的输出流,在写出完成之前要调用flush来保证数据的输出
BufferedReader:提供了readLine方法用于高校读取一行字符串
BufferedWriter:提供了newLine用于写入一个行分隔符也就是换行
BufferedInputStream 没多大用处
BufferedOutputStream 没多大用处
转换流
。。。。
以下是示例
节点流 (字节):
1)输入
//读取数据
public static void main(String[] args) throws Exception
{
//字节流
FileInputStream fis=new FileInputStream("D:\\MyName.java");
int c=-1;
while ((c=fis.read())!=-1)
{
char ch=(char)c;
System.out.print(ch);
}
fis.close();//关闭文件流
}
2.输出
//写入数据到文件中
public static void main(String[] args) throws Exception
{
boolean istrue=false;
File file=new File("D:\\MyName.java");
if(!file.exists())
{
file.createNewFile();
}
//替换原有的内容
// FileOutputStream fos=new FileOutputStream("D:\\MyName.java");
//追加内容到文件中去
FileOutputStream fos=new FileOutputStream("D:\\MyName.java",true);
int i='a';
while (i<'a'+26)
{
fos.write(i);
i++;
}
fos.flush();//刷新
fos.close();
}
节点流 (字符):
1)输入流
public static void main(String[] args) throws Exception
{
FileReader iStream = new FileReader(
"F:\\S2\\JavaOpp\\作业\\T2\\阶段练习\\s2jsp\\Board.java");
int i = -1;
while ((i = iStream.read()) != -1)
{
char ch = (char) i;
System.out.print(ch);
}
iStream.close();
}
2)输出
public static void main(String[] args) throws Exception
{
boolean istrue = false;
File file = new File("D:\\MyName.java");
if (!file.exists())
{
file.createNewFile();
}
FileWriter fWriter = new FileWriter("D:\\MyName.java", true);
// FileWriter fWriter = new FileWriter("F:\\S2\\JavaOpp\\作业\\T2\\阶段练习\\s2jsp\\YourName.java");
int i = 'a';
while (i < 'a' + 26)
{
fWriter.write(i);
i++;
}
fWriter.flush();
fWriter.close();
}
处理流
1.输入
public static void main(String[] args) throws Exception
{
BufferedReader bReader=new BufferedReader(new FileReader("D:\\MyName.java"));
String string="";
while((string=bReader.readLine())!= null)
{
System.out.println(string);
}
bReader.close();
}
2.输出
public File genNewFile(String fileName){
File file = new File(fileName);
try {
FileWriter fileWriter = new FileWriter(file);
BufferedWriter writer = new BufferedWriter(fileWriter);
//begin gen file
writer.write(".....");
writer.newLine();
writer.write("...");
//end gen file
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
另请参考
http://www.iteye.com/topic/313635