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