java-----I/O流

来源:互联网 发布:经典数据新闻案例分析 编辑:程序博客网 时间:2024/06/05 04:18

按照不同分类,大致可以分为输入流,输出流;字节流,字符流;包装流,基本流。
其中输入流大致可以看做InputStream,基本方法为read(),read(byte []),read(byte [],int off ,int len).
需要特别注意:read()返回下一个数据字节;如果到达流的末尾,则返回 -1。
read(byte [])返回读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回 -1。
read(byte [],int ,int)返回读入缓冲区的总字节数;如果因为已到达流末尾而不再有数据可用,则返回 -1。
off - 数组 b 中将写入数据的初始偏移量。len - 要读取的最大字节数。
输出流大致可以看做OutputStream ,基本方法为write(int b), write(byte [] b) , write(byte []b,int off ,int len).注意当使用输出流时最好flash,以免数据未输出成功。

字节流:以字节为单位进行输入输出,有FileInputStream(用于传输文件);ObjectInputStrea(用于序列化或反序列化对象),;PipedInputStream(管道流,多用于线程中,并相互连接);ByteArrayInputStream(使用字节数组传输)DataInputStream(使用基本数据类型传输);BufferedInputStream(缓冲流,缓冲区默认为4K)。输出流与之类似。
字节流每次传输只传输低八位,其中DataInputStream的底层实现为下:
对象序列化时可以加transient关键字来使属性透明化,不序列化该属性。

        out.write((v >>> 24) & 0xFF);  //分4次传输32位,每次8位        out.write((v >>> 16) & 0xFF);        out.write((v >>>  8) & 0xFF);        out.write((v >>>  0) & 0xFF);

字符流:以字符为单位进行传输,有PIpedReader(管道流);BufferedReader(缓冲流,可以逐行读取);CharArrayStream(字节数组流);StringReader(字符串流);FileReader(文件流)。InputStreamReader(是一种转化流,可以将字节流转化为字符流传输);PreintWriter(可以整行输入)

另外有RandomAcessFile可以来输入输出。父类为Object,不属于输入输出流,也不是字节字符流。
但是可以直接输入输出,可字节,可字符。

        // txt默认UTF-8读取        //而randomacessfile则是iso-8859-1        //控制台则是虚拟机设置的编码,默认是GBK,但已改为UTF-8        // 所以乱码           RandomAccessFile in =new RandomAccessFile("src/笔记.txt", "r");           String str =null;           while((str=in.readLine())!=null){           //getBytes转化时会默认使用UTF-8编码,把读取的字符转化为UTF-8的数组字节           //必须要使用ISO-8859-1编码,把读取的ISO-8859-1字符转化为原始的字节数据           //然后在将原始的字节数据转化为UTF-8。这样才能正确输出本来UTF-8的字符。           String str_utf =new String(str.getBytes("ISO-8859-1"),"UTF-8");           System.out.println(str_utf);           }           in.close();

另有一种特殊文件格式为properties。可以直接读取到map中。文件内格式为key=value形式。
` Properties p=new Properties();
p.put(2, 4);
p.load(new FileInputStream(“src/abc.properties”));

     Set keys=p.keySet();     for(Object o:keys){         System.out.println(o+":"+p.get(o));     }`