java - 流
字节流 |
描述 |
字符流 |
描述 |
|
输入流 |
InputStream |
Reader |
||
FileInputStream |
从文件中读取原始字节流,如图像 |
FileReader |
从文件中读取字符流 |
|
BufferedReader | 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取 | |||
输出流 |
OutputStream |
Writer |
||
FileOutputStream |
向文件中写入原始字节流,如图像 |
FileWriter |
向文件中写入字符流 |
|
BufferedWriter | 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入 |
package com.sungoal.webmanagement.log; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; /** * @Package com.sungoal.webmanagement.log * @ClassName: Testdecode * @Description: TODO(这里用一句话描述这个类的作用) * @author andy * @date 2013-10-22 下午05:57:02 */ public class Testdecode { static String fileName = "D:\\logs\\log_dir1\\2013102210.txt"; /** * * @Title: simpleJudge * @Description: TODO(单一判断文件是否是uft-8编码) */ public static void simpleJudge(){ File file = new File(fileName); byte[] b = new byte[3]; try { InputStream ios = new java.io.FileInputStream(file); ios.read(b); ios.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if (b[0] == -17 && b[1] == -69 && b[2] == -65) System.out.println(file.getName() + ":编码为UTF-8"); else System.out.println(file.getName() + ":可能是GBK,也可能是其他编码。"); } /** * * @Title: codeString * @Description: TODO(返回文件的编码) * @param fileName * @return * @throws Exception String */ public static String codeString(String fileName) throws Exception{ BufferedInputStream bin = new BufferedInputStream( new FileInputStream(fileName)); int p = (bin.read() << 8) + bin.read(); String code = null; switch (p) { case 0xefbb: code = "UTF-8"; break; case 0xfffe: code = "Unicode"; break; case 0xfeff: code = "UTF-16BE"; break; default: code = "GBK"; } return code; } /** * @return * @Title: readFile * @Description: TODO(以文件的存储编码来读取文件,防止读取出来为乱码) void */ private static void readFile() { //code为上面方法里返回的编码方式 InputStreamReader inputStreamReader = null; try { FileInputStream fInputStream = new FileInputStream("D:\\logs\\log_dir1\\2013102210.txt"); inputStreamReader = new InputStreamReader(fInputStream, codeString(fileName)); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (Exception e1) { e1.printStackTrace(); } BufferedReader in = new BufferedReader(inputStreamReader); StringBuffer sBuffer = new StringBuffer(); try { String strTmp = in.readLine(); //按行读取 while (strTmp != null) { sBuffer.append(strTmp + "/n"); strTmp = in.readLine(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(sBuffer.toString()); } public static void main(String[] args) { readFile(); } }
任何数据的读写都是01010101
java以unicode编码,一个字符两个字节
以stream结尾的都是字节流
方向不同(单位为8bit)分为: 字节输入流(InputStream)和字节输出流(OutputStream)
数据单位(单位为16bit)不同:字符输入流(Reader)和字符输出流(Writer)
功能不同 : 节点流(管道直接套接在数据源上)和处理流(套接在其他管道之上的流)
flush先把缓冲区的数据写出来,然后close
bufferedreader readline,提高读取效率
bufferedwriter newline
转换流 : 字节流转换成字符流 如 outputstreamwriter 将输出的字节流转换成输出的字符流
阻塞
数据流 : datainputstream,bytearrayoutputstream 现在读写英文(字节流)中文(字符流)都没问题,但是读写double,和long等类型的,没有此类对应的接口,当然你可以通过String.valueOf(参数).getBytes() ,再一个字节一个字节的读写,
第一麻烦
第二 列举一个long类型的 23223233232323243432323322,本来long类型在内存中只占8个字节,现在内存中占了几十个字节了
所以数据流应运而生了
print流 : 不会抛异常,不用try catch,会自动flush
object流: objectoutputstream
实现Serializable接口(标记性接口,空实现),jdk帮你实现对象的实例化
transient 修饰的成员变量不予考虑,不被序列化
序列化把一个object转换成字节流直接写到文件中
Externalizable(可外部化),自己可以控制如何实现序列化
posted on 2012-04-29 15:19 lovebeauty 阅读(361) 评论(0) 编辑 收藏 举报