DataStream和FileStream用法

来源:互联网 发布:淘宝上买气排有记录吗 编辑:程序博客网 时间:2024/06/05 16:45
1、DataInputStream和DataOutputStream都是Java中输入输出流的装饰类,用起来很方便。
package another;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;public class TestDataStream { public static void main(String[] args) throws Exception { //新建 FileOutputStream fos=new FileOutputStream("E://dahjkdhajkdata.txt"); //读出 BufferedOutputStream bos=new BufferedOutputStream(fos); //输出流 DataOutputStream dos=new DataOutputStream(bos);  // FileInputStream fis=new FileInputStream("E://dahjkdhajkdata.txt"); BufferedInputStream bis=new BufferedInputStream(fis); DataInputStream dis=new DataInputStream(bis);   String str="你好hi"; dos.writeUTF(str);   //按UTF-8格式写入 dos.writeChars(str); //按字符写入  //按字节写入有两种方法,第一种方法只能适应无汉字的情况;  //因为方法1在写入时会把所有的字符都按1个字节写入,而汉字的表示需要2个字节,  //这就造成了数据的丢失,读入时就会出现乱码。  //而方法2在将字符串转换为字节数组时就把汉字字符变为了2个字节,  //写入文件的时候也会按2个字节的文字写入,这样读取的时候就不会出现问题 dos.writeBytes(str);//方法1:将整个字符串按字节写入  byte[] b=str.getBytes(); dos.write(b);  //方法2:将字符串转换为字节数组后再逐一写入 dos.close(); //按UTF-8格式读取 System.out.println(dis.readUTF());  //字符读取 char [] c=new char[4]; for(int i=0;i<4;i++){      c[i]=dis.readChar();   //读取4个字符  }  System.out.print(new String(c,0,4));  System.out.println();  //字节读取  byte [] b1=new byte[4];  dis.read(b1); //读取4个字节  System.out.print(new String(b1,0,4));//输出时会出现乱码  System.out.println();    byte [] b2=new byte[1024];  int len=dis.read(b2); //按字节读取剩余的内容  System.out.println(new String(b2,0,len));}}

使用该类时候遇到的编码问题。可参考:http://blog.csdn.net/fishwjy/article/details/38092985

2、FileInputStream和FileOutputStream这是一对继承于InputStream和OutputStream的类,用于本地文件读写(二进制格式读写
并且是顺序读写,读和写要分别创建出不同的文件流对象)

package another;/*import java.io.*;//这是一对继承于InputStream和OutputStream的类,用于本地文件读写(二进制格式读写//并且是顺序读写,读和写要分别创建出不同的文件流对象)//I/O类包括节点流类和包装流类//FileOutputStream实例对象时,如果指定的文件已经存在,//这个文件中的原来内容将被清除//创建FileOutputStream实例对象时,可以指定还不存在的文件名//不能指定一个已被其他程序打开的文件public class TestFileStream {public static void main(String[] args) throws IOException{File inFile = new File("E://从前慢.mp3");File outFile = new File("E://新从前慢.mp3");FileInputStream inStream = new FileInputStream(inFile);FileOutputStream outStream = new FileOutputStream(outFile);byte [] inOut = new byte[inStream.available()];//通过available方法取得流的最大字符数inStream.read(inOut);//读入流,并保存在byte数组里,并且已经读入byte[]数组的内容,会在流文件中删除outStream.write(inOut);//写出流,产生一个新文件inStream.close();outStream.close();}}//但是如果文件过大,即超过64M则需要分开几个流操作//需要两个线程读写数据时,线程并发执行,读写的同步问题可能会发生困难//可使用管道,操作系统里管道就是一个队列//可参考http://blog.sina.com.cn/s/blog_77eac33f0101as49.html//DataInput/DataOutput接口:实现与机器无关的各种数据格式读写//(如readChar() 、readInt()、readLong()、readFloat(),而readLine()//将返回一个String)。其中RandomAccessFile类实现了该接口,//具有比FileInputStream或FileOutputStream类更灵活的数据读写方式。*/import java.io.*;  public class TestFileStream {      public static void main(String [] args) {          try {              FileOutputStream out = new FileOutputStream("E://hello.txt");                            out.write("checheya".getBytes());                            out.close();                            File file = new File("E://hello.txt");              FileInputStream in = new FileInputStream(file);                          byte[] buf = new byte[20];              int len = in.read(buf);                            System.out.println(buf);//乱            System.out.println(new String(buf, 0, len));                            in.close();          } catch (Exception e) {              e.printStackTrace();          }      }  }