读写数据时的坑
-
如果文件比较大时,一次性读取可能会出现内存溢出的情况
byte[] bytes = new bytes[is.available()]; is.read(bytes);
-
循环读取,写出时可能会出现有重复字节
byte[] bytes = new bytes[1024]; int len; while((len = is.read(bytes))!=-1){ // os.write(bytes); 可能出现重复字节 os.write(bytes,0,len); }
-
使用
BufferedInputStream(InputStream)/BufferedOutputStream(OutputStream)
字节缓冲流时,可能会出现数据不完整。对于字符流,也有字符缓冲流BufferedReader/BufferedWriter,并且提供readLine()
和newLine()
方法int len; while((len = bis.read())!=-1){ bos.write(len); } // 一定要关闭流或者刷新流,因为如果不执行close或者flush,那么拷贝的数据可能要小一点。 // 为什么会小?因为缓冲区中可能还有数据没有刷新到磁盘。 bis.close(); bos.close();
-
字节流读写中文可能出现乱码
一个中文字是两个字节,假如使用
read()
读取,那么必定会出现一个中文字被读取两次,这样会导致乱码。读取中文数据时,建议使用字符流,在写出中文时,必须要将中文转成字节数组。OutputStream os = new FileOutputStream("D://test.txt"); os.write("我读书少 你不要骗我".getBytes());
-
字符流不能拷贝非纯文本,因为读取的时候会将字节转成字符,在转换过程中,找不到的字符就会用“?”来代替