浅谈java中的I/O机制

标签: java | 发表时间:2015-04-25 10:48 | 作者:朝着梦想
出处:http://www.iteye.com


      以前老师讲C++中的I/O机制时,听得似懂非懂,对什么字节流仅有一些浅显的认识。听胡哥讲了java中的I/0机制后,才对这些概念有了进一步的深入。
    首先,先介绍一些基本概念吧:
   字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制(8bit)
   在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
    注意:MiB和MB,KiB和KB等的区别:
   1KiB(kilobyte)=1024byte
   1KB(kibibyte)=1000byte
   1MiB(megabyte)=1048576byte
   1MB(mebibyte)=1000000byte
    基本数据类型与bit的关系如下表所示: 

基本数据类型 占用空间
boolean 1bit
char 16bit /2 byte
byte 8bit

short

16bit/2byte

int

32bit/4byte

long 64bit /8byte
float

32bit/4byte


   加入在记事本中写入数字123后,它的大小是3字节,而它所占的空间大小是4KB,为什么会是这样的结果呢???我觉得这应该和计算机内部的存储机制有关,具体为什么,等我查完相关的资料后,再来解答这个问题,言归正传,说说我们的I/0机制吧。
      I/0机制正如平常所见的水龙头中的水流出来一样,有流出的水,亦有流进的水。水正如数据,水龙头就如数据所在的文件。java中的数据流按方向分为输入流和输出流。输入流是以InputStream抽象类为继承类的各个子类,输出流是以OutputStream抽象类为继承类的各个子类。InputStream是基于字节读取的输入流,InpuStream类中主要定义了以下几个方法:
1.int available():返回流中可读取的有效字节 长度;
2、int read():返回流中的下一个字节作为一部byte指,注意此方法返回虽为int型,实际上是从流中读取的一个byte值,即8bit;
3、int read(byte[]b)用于流中读到的byte数组
如果要从文件中读取数据,那么就要用到FileStream类了
具体的用法如下代码: 

public void ReadFile() 
{ 
String FileName="c:\\deci.txt"; 
try { 

InputStream Ins=new FileInputStream(FileName); 
try { 
           int byteCount=Ins.available();     // 获得输入文件的字节数 
    byte [] stringByte=new byte[byteCount];   //新建字节数组 
    Ins.read(stringByte);    //读入数组 
    String readstr=new String(stringByte);   //将字节数组转换为字符串 
    System.out.println(readstr);   //输出读入文件的内容 
    Ins.close(); 
    
    
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 

} catch (FileNotFoundException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 

   
   上面的例子仅仅使用于读取字节,加入我们要读入字符串,int,double,float这些数据对象呢,总不能又一个一个字节的读吧,这时我们就要用到另外一个输入类DataInputStream,具体用法如下: 

//读文件 
public void ReadFile() 
{ 

try{ 
     //用DataInputStream类 
InputStream is=new FileInputStream("testComputer.txt"); 
DataInputStream ios=new DataInputStream(is); 
//字符串读取时,先读取存储的长度,再读取其内容 
byte Scount=ios.readByte();        //先读取其长度 
System.out.println(Scount); 

byte [] rts=new byte[Scount];   //读取内容 
ios.read(rts); 
   String aa=new String(rts); 
   System.out.println(aa); 
  
    byte sscount=  ios.readByte();   //与上面类似 
    byte[]rsp=new byte[sscount]; 
ios.read(rsp); 
String bb=new String(rsp); 
System.out.println(bb); 

byte a=ios.readByte();    //读取存储的byte 
System.out.println(a); 

int count=ios.readInt();   //读取存储的int 
System.out.println(count); 

double sell=ios.readDouble();  //读取存储的double 
System.out.println(sell); 
ios.close(); 

} catch(Exception e) 
{ 
e.printStackTrace(); 
} 
     

} 
   

   介绍完了输入流之后,接下来介绍我们的输出流OutputStream,OutputSteam主要定义了以下几个方法:
1、void close():关闭流,与输入流类似;
2、void flush():强制输出到目标中
3、void write(byte[]b):将byte数组中的内容输出到流中:
具体用法如下:

public void WriteFile(String str)
	{
		String FileName="WriteFile.txt";    //文件路径为当前文件的库文件
		 try {
			OutputStream os=new FileOutputStream(FileName);
			byte[] WriteByte=str.getBytes();
			try {
				os.write(WriteByte);
				os.flush();      //强制写出
				os.close();
				
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 
	}


类似的道理:如果要将int,double等数据写进文件,就需要用到DataOutputStream类了,具体用法如下:

//写入文件操作
	public void testWrite(Computer cp) 
	{
		try{
			//先写入文件
			OutputStream os=new FileOutputStream("testComputer.txt");
			DataOutputStream dos=new DataOutputStream(os);
	
			//对于字符串而言,先存储其长度,再存储字节数组
			int len=cp.type.length();
			byte [] ts=cp.type.getBytes();     //存储字符串时,可有意识地对字符串进行一系列操作,对数据加密,但注意读取时,要先消去相应的操作
			  
			dos.writeByte(len);
			dos.write(ts);
			
			//对于字符串而言,先存储其长度,再存储字节数组
			int lens=cp.ProduceDate.length();
			byte[] sp=cp.ProduceDate.getBytes();
			dos.writeByte(lens);
			dos.write(sp);
			//存入其他类型的变量
			dos.writeByte(cp.ProduceCount);    //写入byte
			dos.writeInt(cp.SellCount);           //写入int         //注意查看源代码自己写相应函数
			dos.writeDouble(cp.YunXing);     //写入double
			//刷新,关闭
			dos.flush();
		    dos.close();
		} catch(Exception e)
		{
			e.printStackTrace();
		}
		
		}	
	

 

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java] 推荐:

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).

Java PaaS 对决

- 呆瓜 - IBM developerWorks 中国 : 文档库
本文为 Java 开发人员比较了三种主要的 Platform as a Service (PaaS) 产品:Google App Engine for Java、Amazon Elastic Beanstalk 和 CloudBees [email protected] 它分析了每种服务独特的技术方法、优点以及缺点,而且还讨论了常见的解决方法.

Java浮点数

- d0ngd0ng - 译言-电脑/网络/数码科技
Thomas Wang, 2000年3月. Java浮点数的定义大体上遵守了二进制浮点运算标准(即IEEE 754标准). IEEE 754标准提供了浮点数无穷,负无穷,负零和非数字(Not a number,简称NaN)的定义. 在Java开发方面,这些东西经常被多数程序员混淆. 在本文中,我们将讨论计算这些特殊的浮点数相关的结果.

Qt——转战Java?

- - 博客 - 伯乐在线
编者按:事实上,在跨平台开发方面,Qt仍是最好的工具之一,无可厚非,但Qt目前没有得到任何主流移动操作系统的正式支持. 诺基亚的未来计划,定位非常模糊,这也是令很多第三方开发者感到失望,因此将导致诺基亚屡遭失败的原因. Qt的主要开发者之一Mirko Boehm在博客上强烈讽刺Nokia裁了Qt部门的决定,称其为“绝望之举”,而非“策略变更”.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.

Java异常

- - CSDN博客推荐文章
“好的程序设计语言能够帮助程序员写出好程序,但是无论哪种语言都避免不了程序员写出坏的程序.                                                                                                                          ----《Java编程思想》.

java面试题

- - Java - 编程语言 - ITeye博客
 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. 抽象包括两个方面,一是过程抽象,二是数据抽象.  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法. 对象的一个新类可以从现有的类中派生,这个过程称为类继承.

Java使用memcached

- - 互联网 - ITeye博客
首先到 http://danga.com/memcached下载memcached的windows版本和java客户端jar包,目前最新版本是memcached-1.2.1-win32.zip和java_memcached-release_1.6.zip,分别解压后即可. 然后是安装运行memcached服务器,我们将memcached-1.2.1-win32.zip解压后,进入其目录,然后运行如下命令:c:>;memcached.exe -d install
c:>memcached.exe -l 127.0.0.1 -m 32 -d start.

Java线程池

- - 企业架构 - ITeye博客
线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的. 在jdk1.5之后这一情况有了很大的改观. Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用. 为我们在开发中处理线程的问题提供了非常大的帮助.

java 缩略图

- - 开源软件 - ITeye博客
文章说明:根据用户上传的图片按等比例生成相应的的缩略图,两小例笔记. 第一、java-image-scaling 开源小工具生成图片缩略图. Maven地址: http://mvnrepository.com/artifact/com.mortennobel/java-image-scaling/.