java i/o各种封装类及例子

时间:2021-06-13 15:45:05

来源:http://wenwen.soso.com/z/q192584218.htm

Q:最近学了i/o感觉太乱,希望哪位大哥整理下。

如: a类-->封装 b类-->封装c类,做什么用。一般读文件怎么划分用那种流。

 

A1

还是我来跟你说吧。

 

Java中最基本的是字节流,如FileInputStream/FileOutputStream;

然后是带缓冲的字节流:BufferedInputStream/BufferedOutputStream,此流的作用就是提高基本字节流的效率;

再有就是过滤流,如:DataInputStream/DataOutputStream。这些流的作用就是,我们可以直接读取/写入Java基本数据类型,如直接写入int char boolean float double short byte 等。

 

然而有时候我们处理的只是文本文件,有不想没错都自己写代码把字节转换成字符怎么办?

这时候字符流就出现了!

Java中最基本的字符流就是Reader类,但它是抽象类

我们可以使用InputStreamReader/OutputStreamReader类来把字节流封装成字符流,

当然也可以直接使用FIleReader类获得字符流,

接着我们可以继续封装字符流来获得一些特殊的功能。

如可以封装BufferedReader/BufferedWriter来获得更高的读取/写出效率的字符流

其中BufferedReader来由按行读取文件的功能。

这些就是一些比较常用的流。

 

下面举个例子:

比方说我要读取一个文本文件,那么我可先构造一个字节流:

FileInputStream fis = new FileInputStream(new FIle("F://SomeFile"));

然后我想按字符读取这个文件,我可以把它封装成字符流:

InputStreamReader ir = new InputStreamReader(fis);

最后我想提高效率和获得按行读取的功能,可以继续封装:

BufferedReader br = new BufferedReader(ir);

OK,到这里我就完成了封装,可以使用这个br来读取文件了。

 

 呵呵,写得有点多,希望你能看明白。

 

Q:3q,能说说具体的场地用发么?比如,我在网络对话中该使用哪种流?读取文本文件用什么输入流?读取其他文件(如MP3) 又该用什么流?或者说说,常用什么类流读取/写入文件~~

是有点笨~`

 

A1:

你首先要搞明白你去读文件需要的是什么!

文本文件需要的是文字,当然就是字符流了。

网络对话,最基层是发送字节数据,所以基层还是字节流。

但是如HTTP/FTP等协议是基于字符的,可以再封装一层字符流。

读取二进制文件(文本文件之外的文件)就用字节流好了。

一般网上都有现成的包来把字节流转化成你需要的资源,如读取图片、音乐、视频等,都是使用第三方类库从字节流中读取的。

 

A2:

贴一个最近写的java文件中注释清理的代码,希望对你帮助。

最近一个项目需要清理java源文件中的注释,故用java 的读写流简单实现了清理功能,一些代码的特殊替换也可用这个算法实现。

在main函数中调用processClear(file) 函数进行处理,file对象为一个源文件目录的File类型的实例,因清理时会加上临时扩展名_temp, 故再调用processReName(file)将文件名更新,算法有点重复,因临时要急用,所以偷懒了。改天再重构,下面是源码:

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

 

public class ClsRemark {

 /**
  * @param args
  */
 public static void main(String[] args) {
  try {
   File file = new File("H://src");
   System.out.print(" Start>>> ...");
   processClear(file);           // Clear
   processReName(file); // ReName
   System.out.print(" End>>> ...");
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

 

 /**
  *
  * @param file
  * @throws IOException
  */


 public static void processClear(File file) throws IOException {
  File[] files = getFiles(file);
  if (files != null && files.length > 0) {
   for (int i = 0; i < files.length; i++) {
    if (files[i].isDirectory()) {
     processClear(files[i]);
    } else {
     clear(files[i]);
    }
   }
  }
 }

 

 /**
  *
  * @param file
  * @throws IOException
  */


 public static void processReName(File file) throws IOException {
  File[] files = getFiles(file);
  if (files != null && files.length > 0) {
   for (int i = 0; i < files.length; i++) {
    if (files[i].isDirectory()) {
     reName(files[i]);
    } else {
     reName(files[i]);
    }
   }
  }
 }

 

 /**
  *
  * @param file
  * @return
  */


 public static File[] getFiles(File file) {
  return file.listFiles();
 }

 

 /**
  *
  * @param file
  * @throws IOException
  */


 public static void clear(File file) throws IOException {
  if (file.getName().substring(file.getName().length() - 5, file.getName().length()).equalsIgnoreCase(".java")) {
   FileReader fr = new FileReader(file);
   BufferedReader br = new BufferedReader(fr);
   FileWriter fw = new FileWriter(file.getPath() + "_temp"); // 临时在扩展名后加上_temp
   BufferedWriter bw = new BufferedWriter(fw);

   String strLine;
   strLine = br.readLine();
   while (strLine != null) {
    if (strLine != null && strLine.trim().length() > 0) {
     if (strLine.trim().charAt(0) == '/' || strLine.trim().charAt(0) == '*') {
      strLine = "";
     } else if (strLine.indexOf("//") > 0) {
      strLine = strLine.substring(0, strLine.indexOf("//"));
     } else if (strLine.indexOf("/*") > 0) {
      strLine = strLine.substring(0, strLine.indexOf("/*"));
     }

    }
    bw.write(strLine);
    bw.newLine();
    strLine = br.readLine();
   }

   bw.close();
   fw.close();
   br.close();
   fr.close();

   file.delete();
  }
 }

 

 /**
  *
  * @param file
  * @throws IOException
  */


 public static void reName(File file) throws IOException {
  if (file.getName().substring(file.getName().length() - 10, file.getName().length()).equalsIgnoreCase(".java_temp")) {
   FileReader fr = new FileReader(file);
   BufferedReader br = new BufferedReader(fr);
   FileWriter fw = new FileWriter(file.getPath().substring(0, file.getPath().length() - 10));                   // 截取掉扩展名后_temp
   BufferedWriter bw = new BufferedWriter(fw);

   String strLine;
   strLine = br.readLine();
   while (strLine != null) {
    bw.write(strLine);
    bw.newLine();
    strLine = br.readLine();
   }

   bw.close();
   fw.close();
   br.close();
   fr.close();

   file.delete();
  }
 }
}