DataStream和FileStream用法

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();  
        }  
    }  
}  

你可能感兴趣的:(java)