java流
按流分向:
输入流:程序可以从中读取数据的流
输出流:程序能向其中写入数据的流
按数据传输单位分:
字节流:以字节为单位的 inputstream/outputstream
字符流:以字符为单位的输出 reader/writer
基本用法:
字节流:表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。
字符流:以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。
区别:
Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。
但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。实际上是通过byte[]和String来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。
在两者之间可以加BufferedInputStream/BufferedOutputStream缓存
具体实现代码:
字节流:
FileInputStream fi=new FileInputStream("F:/1.jpg");
// BufferedInputStream in=new BufferedInputStream(fi);
FileOutputStream fo=new FileOutputStream("F:/ssh/3.jpg");
//BufferedOutputStream out=new BufferedOutputStream(fo);
byte[] buf=new byte[1024];
int len=fi.read(buf);//读文件,将读到的内容放入到buf数组中,返回的是读到的长度
while(len!=-1){
fo.write(buf, 0, len);
len=fi.read(buf);
}
// out.close();
fo.close();
//in.close();
fi.close();
如果运用到Buffer缓存
应该改为 String s="";
while ((s= bufRead.readLine()) != null) {
out.write(s);
}
字符流:
FileReader in=new FileReader("E:/1.jpg");
FileWriter out=new FileWriter("E:/6.jpg");
BufferedReader file1=new BufferedReader(in);
BufferedWriter file2=new BufferedWriter(out);
String s;
byte[] is=new byte[1024];
while((s = file1.readLine()) != null)
{
file2.write(s);
}
file1.close();
file2.close();