Java日志十一「I/O流」

**

I/O流

**
所谓的I/O流就是在 java中,字节或者字符以流的方式输入和输出。I对应了input,O对应了output。Java中把字节与字符的输入和输出分成四个大类(一个字符=两个字节=16个二进制位)。

字节的顶级父类:

InputStream(所有输入字节流的父类),共性的方法包括read,close。 FileInputStream就是InputStream的一个子类。

OutputStream (所有输出字节流的父类),共性的方法包括write,close,flush。FileOutputStream就是OutputStream的一个子类。

下面我们做一些简单的对于文件字节的读写。

先看写数据到文件的操作

public static void main(String[] args) throws IOException
	{
		File file=new File("/Users/ahlahmlahlah/Desktop/test.txt");
			
		//创建FileOutputStream对象:
			
		FileOutputStream fos=new FileOutputStream(file);
		//FileOutputStream fos=new FileOutputStream("/Users/ahlahmlahlah/Desktop/test.txt");//第二种构造方法,传递String参数,路径名
		
		//第一种write方法(参数传递一个byte数组)
		byte[] bytes= {65,66,67,68,69};
		fos.write(bytes);
			
		byte[] bytes2="hello".getBytes();
		fos.write(bytes2);//写字符串  
			
		//第二种write,1代表索引开始的位置,2代表索引的长度
		fos.write(bytes,1,2);//69和70
			
		//追加方法
		File file2=new File("/Users/ahlahmlahlah/Desktop/test2.txt");
		FileOutputStream fos2=new FileOutputStream(file2,true);//这里的构造方法是true代表一直追加字节,若不写就无法追加,即每次运行程序之前写的数据都会消失。
		fos2.write(bytes2);
		fos2.write("/r".getBytes());// /r代表换行
			
		//close方法,关闭流
		fos.close();
	    fos2.close();

我们来看一下生成的txt文件
在这里插入图片描述
我们可以看到,ABCDE对应了下面这一段代码写入的数据

byte[] bytes= {65,66,67,68,69};
fos.write(bytes);

hello对应了下面一段代码写入的数据

byte[] bytes2="hello".getBytes();
fos.write(bytes2);

BC对应了下面一段代码写入的数据

fos.write(bytes,1,2);

至于生成的test2文件,我们把程序运行三次(一次写一个‘哈’),来看一下结果
在这里插入图片描述
写完数据到文件后我们里看从文件中读数据的操作(三种read方法)

 FileInputStream fis=new FileInputStream(file);
		     
	  //第一种read方法(一个字节一个字节的读入)
	   char a=(char) fis.read();
	    System.out.println(a);
		    
	    int i=fis.read();
	    System.out.println(i);//66(B)读完了读67
		    
	    i=fis.read();
	    System.out.println(i);//67(C)读完了读68
		    
	    int len=0;
	    while((len=fis.read())!=-1) //当没有内容了还在read就返回-1
	    {
	    	System.out.print((char)len+" ");
	    }//循环输入

打印结果:

A
66
67
D E h e l l o B C

第二种read方法

   //第二种read,读取多个字节
   FileInputStream fis=new FileInputStream(file);
   byte[] bytes3=new byte[5];
   int len=fis.read(bytes3);//读取5个字节,存到bytes3里面。返回一次读取的长度,和上面的read空参数返回的不同,上面直接返回读取的内容
   System.out.println(len);
   System.out.println(new String(bytes3));//利用String的构造方法把byte数组里面的数据转换成字符串输出
		    
   len=fis.read(bytes3);//又读了五个字节
   System.out.println(len);
   System.out.println(new String(bytes3));
		    
   len=fis.read(bytes3);
   System.out.println(len);
   System.out.println(new String(bytes3));//一直向下读取数据,直到读不到数据返回-1

结果

5
ABCDE
5
hello
2
BC

第三种read方法

 FileInputStream fis=new FileInputStream(file);
 byte[] bytes3=new byte[5];
 int len2=fis.read(bytes3,0,3);//从索引0开始读,读3个,返回3
 System.out.println(len2);
 System.out.println(new String(bytes3));

结果

3
ABC

下面是关于字符的读写操作

字符的顶级父类:
Reader(所有输入字符流的父类)(共性的方法包括read,close),FileReader是Reader的一个子类。

Writer(所有输出字符流的父类)(共性的方法包括write,close,flush),FileWriter是Writer的一个子类。

了解了上面字节流的操作,字符流的大同小异。

我们先来看字符的输出操作(三种write方法我都写在下面了,与上面的字节的输出相似,只是传递的参数可以是一个char数组)。

	File file3=new File("/Users/ahlahmlahlah/Desktop/test3.txt");
		    
    //FileWriter
     FileWriter fw=new FileWriter(file3);//后面加上true代表可以续写,与文件字节输出流的构造方法一样,这里将不演示了
	
	//三种write方法
		   
	 fw.write(97);//写了a到text3中
	 fw.flush();//flush可以把数据刷新到文件中去。
		    
	 char[] charArray1= {'a','b','c','d','e'};
	 fw.write(charArray1);写了abcde到text3中
	 fw.flush();
		    
     fw.write(charArray1,0,1);写了a到text3中
	 fw.flush();
		    
	 fw.close();

我们来看一下生成的text3文件
在这里插入图片描述
文件中的数据与我们预想的一样

下面是文件的读取操作

	//FileReader	    

   	  FileReader fr=new FileReader(file3);
      int len3=0;
	  char[] charArray3=new char[1024];
	  while((len3=fr.read(charArray3))!=-1) 
	   {
		  System.out.println(new String(charArray3,0,len3));//与FileInputStream一样,传参后返回值变成了读取的数目,这里用String类的一个构造方法把char数组转换成字符串输出
	   }
		    
		    fr.close();

结果

aabcdea

博主最近生病了,更新的比较慢。。。
下次吧I/O流的有关知识补全

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值