我对io流的一些总结,
I/O流
流的概念:程序与数据来源之间的桥梁
流的分类:
按数据方向分:输入流和输出流
输入流: InputStream/Reader
输出流: OutputStream/Writer
按数据类型分:字节流和字符流
字节流:InputStream/OutputStream
字符流:Reader/Writer
按流的功能分:节点流和处理流
节点流用操作数据的来源。
处理流用来封装节点流,从而给节点流增加一个功能,不能独立存在,在关闭流时如果使用了处理流,只需关闭最外层的流就可以了。
区分节点流和处理流的小方法:
看构造器,节点流参数为数据来源,而处理流参数为其他流。
选择流的思路:
先考虑是输入流还是输出流,
输入流: InputStream/Reader
输出流: OutputStream/Writer
再考虑是字节流还是字符流,是否是纯文本
字节流:InputStream/OutputStream
字符流:Reader/Writer
最后考虑是节点流还是处理流。具体对象设备
源:内存,硬盘,键盘
目的:内存,硬盘,控制台。
读取文件的方式:
read()方法,一次读一个字符,而且自动向下读
在read()方法中可以一次读一个数据,
FileReader filereader = new FileReader("dome.txt");
FileWriter filewriter = new FileWriter("dome_copy.txt");
int ch =0;
while ((ch= filereader.read())!=-1)
{
filewriter.write((char)ch);
}
filereader.close();
filewriter.close();
也可以定义一个字符数组缓冲区,一次读取一行数据
FileReader filereader = new FileReader("dome.txt");
FileWriter filewriter = new FileWriter("dome_copy.txt");
char [] buf=new char[1024];
int ch =0;
while ((ch= filereader.read(buf))!=-1)
{
filewriter.write(char(buf,0,ch));
}
filereader.close();
filewriter.close();
读写流缓冲区: BufferedReader/BufferedWriter
以上两个都是过滤流,需要用其他的节点流来作参数构造对象。
BufferedReader的方法:readLine():String ,当他的返回值是null时,就表示读取完毕了。要注意,再写入时要注意写换行符,否则会出现阻塞。
BufferedWriter的方法:newLine() ,这个方法会写出一个换行符。
方法演示:
BufferedReader bufr = new BufferedReader(new FileReader("dome.java"));
BufferedWriter bufw= new BufferedWriter (new FileWriter("dome_copy.txt"));
String line= null;
while ((line= bufr.readLine())!=null)//readLine()只返回回车符之前的数据。
{
bufw.write(line);
bufw.newLine();//换行,为了实现跨平台性
}
bufr.close();
bufw.close();
对缓冲区技术:我们通过自己定义的缓存来解释内部原理
class myBufferedReader
{
private Reader r;
myBufferedReader(Reader r)
{
this.r= r;
}
//自定义一个ReadLine方法,
public String myReadLine()throws IOException
{
//定义一个临时容器,一个可变长度的字符串容器。
StringBuilder sb = new StringBuilder();
int ch = 0;
//调用reader中的read的方法,
while ((ch=r.read())!=-1 )
{
if(ch=='\r')//结束判断
continue;
if(ch=='\n')//结束判断,
return sb.toString();//结束判断成功,返回一行字符串,
else
sb.append((char)ch);//数据转成字符存入StringBuilder内
}
if((sb.length())!=0)//在最后结束判断不成功,对StringBuilder在次进行是否有内容判断
return sb.toString();
return null;
}
public void myClose()throws IOException//复写Reader中的close方法。
{
r.close();
}
——————这里自然就出现了一个装饰设计模式,在后面详细说明。
字符流:Reader和Writer所有字符流的父类型
Java技术使用Unicode来表示字符串和字符,而且提供16位版本的流,以便用类似的方法处理字符。
如果构造了一个连接到流的Reader和Writer,转换规则会在使用缺省平台所定义的字节编码和Unicode之间切换。
字节流: InputStream 和 OutputStream 是所有字节流的父类,
字节流使用来拷贝字节文件,例如:图片
它与字符流的用法基本相同,通过read()方法来读取数据,
字节流缓冲区 BufferedInputStream 和 BufferedOutputStream 应用中也较多应用read()方法,而不是readLine()方法。
BufferedInputStream bufin= new BufferedInputStream(new FileInputStream ("c:\\1.jpg"));//可以写成现对路径,也可是绝对路径,会抛出异常。
BufferedOutputStream bufout = new BufferedOutputStream (new FileOutputStream("c:\\2.bmp"));
int by=0;
while ((by= bufin.read())!=-1)
{
bufout.write(by);
}
bufin.close();
bufout.close();
第二种
byte [] buf= new byte[1024];//这里应该有一个功能,可以求出他的字节数多少,以便确定内存大小,以便减少浪费空间。
int by=0;
while ((by= bufin.read(buf))!=-1)
{
bufout.write(buf,o,by);
}
bufin.close();
bufout.close();
这里需要注意的是读取数据,和写入数据,是把数据读写入流中,必须通过flush()或close()来把数据刷到目的地中去,
键盘录入:1. BufferedReader buf = new BufferedReader( new InputStreamReader(System.in));//默认输入字符串,
2. Scanner ss= new Scanner(System.in)//可以输入任何数据类型。
一个用到正则表达式来解析基本数据类型和字符串类型的简单文本扫描器,多线程不安全
可以指定文件。输入流(字节流),源(读取源),字符串,扫描(常用)
扫描的基本数据类型有,byte,short,int,long,float,double,特别注意的是这样有String类型。
(a)基本方式:
Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) { //其中的hasNext()判断是否有所数据!
long aLong = sc.nextLong(); //next输出下一个数据,是什么数据类型就在next跟什么,例:nextLong,nextInt,
}
(b)自写例:
//定义存储数据数组,并定义范围,
int[] num=new int[5];
//读取键盘录入
Scanner s = new Scanner(System.in);
//遍历数组,把键盘录入数据存入数组。通过Scanner中的nextInt()方法
for (int x = 0;x < num.length; x++)
{
num[x]=s.nextInt(); //数据存入数组中
}
桥梁流:InputStreamReader和OutputStreamWriter(字节流转化成字符流的桥转换器)
这两个类不是用于直接输入输出的,他是将字节流转换成字符流的桥转换器,并可以指定编解码方式。
OutputStreamWriter outs= new OutputStreamWriter(new FileOutputStream("dome.txt"),"UTF-8");
打印流: 1.PrintStream 是为了其他的输出流提高了添加功能,为了打印各种数据值表现形式,提高了两个功能一个是不抛出异常,一个是自动刷新,
打印所有字符时自动根据平台上的编码表转成字节。字节打印流
这个不经让想到是:改变标准输入源输出目的,
1.file 对象 file;
2.字符串 String
3.字节输出流 OutputStream
System.setIn(new FileInputStream("dome.txt"));//改变输入源
System.setOut(new PrintStream("dome_copy.txt"));//改变目的
2.PrintWriter 字符打印流。
构造函数可以接受的参数类型
1.file 对象 file;
2.字符串 String
3.字节输出流 OutputStream
4.字符输出流 Writer
BufferedReader buf = new BufferedReader( new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new FileWriter("dome.txt"),true);//打印到一个文件中去,true表示可以自动刷新。
String line= null;
while ((line=out.readLine())!=null)
{
if ("over".equals(line))//定义一个结束标记
break;
out.println(line);//打印流中ln自动换行
//out.write(line);//newLine()是BufferedWriter中断方法。
//out.flush();
}
out.close();
buf.close();
|
|