Chinaunix首页 | 论坛 | 博客
  • 博客访问: 283859
  • 博文数量: 28
  • 博客积分: 11
  • 博客等级: 民兵
  • 技术积分: 895
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-19 19:50
个人简介

不畏浮云遮望眼,只缘身在最高层

文章分类

全部博文(28)

文章存档

2014年(1)

2013年(27)

分类: Java

2013-01-31 12:08:31

4.文件流主要由FileInputStream、FileOutStream、FileReader、FileWriter四个类。
操作实例如下:
/***1).用FileInputStream来读取数据源中的数据****/
FileInputStream fin=null;
try
{
//step1:创建一个连接到指定文件的FileInputStream对象
fin=new FileInputStream("D:\\IOTest\\src.txt");
System.out.println("可以读取的字节数:"+fin.available());
//public int available() throws IOException ——返回此输入流下一个方法调用可以不受阻塞的从次输入流读取估计字节数
//setp2:读数据,循环读取文件中数据
//每次读取一个字节,并返回读取的字节,如果遇到文件尾,则返回-1。
for(int b=-1;(b=fin.read())!=-1;)
{
System.out.print((char)b);
}
System.out.println();
}
catch(FileNotFoundException e)  //FileNotFoundException 要操作的文件未找到
{
e.printStackTrace();
}
catch(IOException e)  //IOException I/O 异常的根类
{
e.printStackTrace();
}
finally   //finally 的代码是一定会执行的
{       //无论try 代码是否产生异常,该块的代码是一定得到执行的 在finally语句块中,一般经常放置一些释放资源的代码
try
{
if(null!=fin)
{
fin.close(); //setp3:关闭输入流
}

}
catch(IOException e)
{
e.printStackTrace();
}
}
2)程序中D:\\IOTest\\src.txt 中的内容为
i love my job
 唐伯虎点秋香
读取中文字符的时候,会出现乱码。用字节流去读取字符是,它会把字符拆分为两个字节进行读取,因此读取并不正确,出现乱码!

/******2).用FileOutputStream类往指定文件写入数据*************/
FileOutputStream out=null;
try
{
//setp1:创建一个向指定名的文件写入数据的FileOutputStream
//第二个参数设置为true表示:使用追加模式来添加字节
out=new FileOutputStream("D:\\IOTest\\dest.txt",true);
//setp2:写数据
out.write('#');
                        out.write("我是".getBytes());
out.write("code-monkey".getBytes()); //哈哈,程序猿
out.write("你好".getBytes());
//刷新输出流,将所有缓冲的数据写到文件中
out.flush();
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
finally
{
if(out!=null)
{
try
{
out.close(); //setp3:关闭输出流
}
catch(IOException e)
{
e.printStackTrace();
}
}
}


/*****3).用FileInputStream和FileOutputStream类完成图片的复制*********/
  InputStream is=null;
  OutputStream os=null;
  try
  {
  is=new FileInputStream("D:\\IOTest\\src.jpg");//创建对图片的输入流
  os=new FileOutputStream("D:\\IOTest\\my.jpg");//创建对图片的输出流
  for(int b=-1;(b=is.read())!=-1;) //循环读出数据,返回-1,说明读取到图片的末尾字节
     {
  os.write(b);  //把读取到的字节数据写到输出流
     }
  os.flush();//刷新缓冲区
  }
  catch(FileNotFoundException e)
  {
  e.printStackTrace();
  }
  catch(IOException e)
  {
  e.printStackTrace();
  }
  finally //关闭流 ,为什么呢?那是因为close 方法会释放流所占用的系统资源
  {
  if(null!=is)
  {
  try
  {
  is.close();//关闭输入流
  }
  catch(IOException ex)
  {
  ex.printStackTrace();
  }
  }
  if(null!=os)
  {
  try
  {
  os.close(); //关闭输出流   
  }
  catch(IOException ex)
  {
  ex.printStackTrace();
  }
  }
  }
3)程序运行后,就会把D:\\IOTest\\src.jpg 的图片重新复制成当前目录下的my.jpg图片!


/****4)..用FileWriter和FileReader实现字符文本文件复制的功能*****/
  FileReader fr=null;
  FileWriter fw=null;
  try
  {  
 //step1:创建IO流对象
  fr=new FileReader("D:\\IOTest\\src.txt");
  fw=new FileWriter("D:\\IOTest\\dest2.txt");
  //step2:IO流操作
  char [] buf=new char[8192];
                   //把数据读到数据buf中,返回的count是实际读到的字节总数
  for(int count=-1;(count=fr.read(buf))!=-1;) //读
  { 
  fw.write(buf,0,count);  //把读取到的count个字节 数组buf 写入输出流
  }
  fw.flush();//刷新输出流
  }
  catch(FileNotFoundException e)
  {
  e.printStackTrace();
  }
  catch(IOException e)
  {
  e.printStackTrace();
  }
  finally //
  {
  //step3:关闭流
  if(null!=fr)
  {
  try
  {
  fr.close();
      }
  catch(IOException e)
  {
  e.printStackTrace();  
  }
  }
  if(null!=fw)
  {
  try
  {
  fw.close();
  }
  catch(IOException e)
  {
  e.printStackTrace();  
  }
  }
  }


/****5).用BufferedReader和BufferedWriter实现字符文本文件复制的功能****/
  BufferedReader br=null;
  BufferedWriter bw=null;
  try
  {
  //创建缓冲流对象:它是过滤流,是对节点流的包装
  br=new BufferedReader(new FileReader("D:\\IOTest\\src.txt"));
  //把src.txt这个文件放到缓冲区
  
  bw=new BufferedWriter(new FileWriter("D:\\IOTest\\dest3.txt"));
  //把src.txt这个文件写入到缓冲区
  
  //一次读取字符文本文件的一行字符
  for(String str=null;(str=br.readLine())!=null;)
  {
  bw.write(str);//一次写入一行字符
  bw.newLine();//写入行分隔符
  }
  bw.flush();//刷新缓冲区
  }
  catch (IOException e)
  {
  e.printStackTrace();
  }
  finally
  {
  //step3:关闭IO流。关闭处理流时,会自动关闭它所包装的底层流
  try
  {
  if(null!=br)
  {
  br.close();
  }
  }
  catch (IOException e)
  {
  e.printStackTrace();
  }
  try
  {
  if(null!=bw)
  {
  bw.close();
  }
  }
  catch (IOException e)
  {
  e.printStackTrace();
  }
  }
在读取字节或者字符的时候,会把数据先读到该内部缓冲流,然后在返回;在写入字符或字节的时候,先把数据写到内部缓冲流,然后再一次性写入到目的数据源中,可以提高IO操作的效率!


阅读(1196) | 评论(0) | 转发(0) |
0

上一篇:java 流 小结1

下一篇:java流 小结3

给主人留下些什么吧!~~