`
543089122
  • 浏览: 149873 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java IO的学习总结

    博客分类:
  • java
阅读更多
1、JAVA中的IO流分字节流和字符流
2、InputStream/OutputStream是字节流的接口
3、Reader/Writer是字符流的接口
4、字节流InputStream/OutputStream的子类
a)BufferedInputStream/BufferedOutputStream以InputStream/OutputStream对象做为参数构造一个流缓冲区
b)ByteArrayInputStream/ByteArrayOutputStream以byte[]作为构造参数构造一个缓冲区,
该缓冲区会随着数据的不断写入而自动增长,可以使用toByteArray()和toString()获取数据。
用法:
1)获取所有数据
InputStream in=new FileInputStream("c:/1.txt");
BufferedInputStream buffIn=new BufferedInputStream(in);
ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
int b;
while((b=buffIn.read())!=-1){
byteOut.write(b);//byteOut会随着写入的增长而增长
}
buffIn.close();
byte[] arr=byteOut.toByteArray();

2)不用ByteArrayOutputStream完成同样的事
InputStream in=new FileInputStream("c:/1.txt");
byte[] b=new byte[in.available()];//创建一个该文件长度的byte数组,不过对于比较大的文件该方法不可取。
in.read(b);//一次性读取出来
c)FileInputStream/FileOutputStream文件输入输出流

d)ObjectOutputStream/ObjectInputStream对象序列化
public static void main(String[] args) throws IOException, ClassNotFoundException {
String filename="c:"+File.separator+"map.obj";
Map map=new HashMap();
putData(map);
FileOutputStream out=new FileOutputStream(filename);
ObjectOutputStream objout=new ObjectOutputStream(out);
objout.writeObject(map);
objout.close();
out.close();

System.out.println("读");
FileInputStream in=new FileInputStream(filename);
ObjectInputStream objin=new ObjectInputStream(in);
Map readmap = (Map) objin.readObject();
System.out.println(readmap);
System.out.println(readmap.size());
}
public static void putData(Map map){
for (int i = 0; i < 20; i++) {
map.put("a"+i, "aa"+i);
}
}
5、字符流Reader/Writer的子类
a)FileReader/FileWriter文件操作类
b)管道流PipedReader/PipedWriter
/**
* 管道流PipedWriter/PipedReader是一种特殊的流,用于在不同的线程之间传递数据。
* 一个线程发送数据到输出管道,另一个线程从输出管道中读数据,通过使用管道实现不同线程间的通信。
* PipedWriter:写入数据到管道中
* PipedReader:从管道中读取数据
*
* writer.connect(reader)/reader.connect(writer)都证明了读写管道的联通,2种写法都没错.
*
* 过程:
* 1、声明读写管道对象
* 2、读连接写/写连接读
* 3、写管道将数据写到写管道对象中,写管道可以关闭。
* 4、读管道可以从管道中读取数据
* 注意PipedWriter/PipedReader的构造函数。
* 其实管道流就如同一个缓冲区,所以当放置到管道流中的字符过于大的话,也就是装满了的话管道的writer方法会阻塞。
*/
PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader();
//writer.connect(reader);
reader.connect(writer);//
System.out.println("reader:" + reader.ready());
String str = "abcdefg";
for (int i = 0; i < str.length(); i++) {
writer.write(str.charAt(i));
}
writer.flush();//
writer.close();
System.out.println("reader:" + reader.ready());
int ch;
while ((ch = reader.read()) != -1) {
System.out.println(ch);
}
reader.close();

6、
7、字节流和字符流的区别
字节流在操作的时候是直接与文件本身关联的,不使用缓冲区,字节流----文件
字符流在操作的时候是通过缓冲区与文件关联的,字符流---缓冲区---文件
保存在硬盘上的文件的内容都是以字节的形式存在的,所以字节流操作比较多,
但是在操作中文的时候字符流比较好用。
java的

8、关于字节流出现乱码的问题
   因为字节流获取的是二进制数据,也就是byte,英文:1个byte=1个字符,中文:2个byte=1个字符。
   所以出现乱码。java内部的转换方式是依靠String类来转换的
   1、new String(byte[],0,len)
   new String(char[],0,len)
   2、StringCoding.decode(b, 0, n);
   3、decode方法首先用当前平台的默认encoding转换,然后用ISO-8859-1转换,出错就退出。

   想法:当我们用字节流读取文件内容的时候,得到的是字节码,这个时候可以用String将字节码转换成字符就不是乱码了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics