1. File
练习:深度优先 遍历puth下所有文件夹和文件。
package test;
import java.io.File;
class getfileDFS{
static int i =0;
public void DFSFile (File f){
if(f.isDirectory())
{
System.out.println("Directory name is :"+f.getName());
File[] files= f.listFiles();
for(File ff:files){
DFSFile(ff);
}
}
else{//f is a file ,not a directory
System.out.println("filename is : "+f.getName());
}
}
}
public class FileOperator {
public static void main (String args[])
{
String puth = "D:/how2j";
File file = new File(puth);
getfileDFS G = new getfileDFS();
G.DFSFile(file);
}
}
2 . Stream
抽象类 : InputStream
OutputStream
练习:向文件中写入数据 ,用到子类 FileOutputStream read() write()【字节流】
package test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
class getfileDFS{
public boolean W2F(File f,byte[] data){
try {
FileOutputStream fout = new FileOutputStream(f);
fout.write(data);
fout.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
}catch (IOException e){
e.printStackTrace();
return false;
}
return true;
}
}
public class FileOperator {
public static void main (String args[])
{
getfileDFS G = new getfileDFS();
File wf = new File("D:/how2j/temp.txt");
byte[] data = {65,66,67,97};
//这里定义的其实是ASCII码 ,
if(G.W2F(wf,data))
{
System.out.println("写入成功!");
}
}
}
result:
ABCa
!!! 注意 : 输入 输出流 都需要关闭,可以再try 里(草率) 可以再 finally 里(正规)。
3【字符流】
Reader字符输入流
Writer字符输出流
专门用于字符的形式读取和写入数据 . FileReader 是Reader子类,以FileReader 为例进行文件读取
package test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
class getfileDFS{
public void W2FbyReader(File f){
char[] temp = new char[(int)f.length()];
try {
FileReader fout = new FileReader(f);
//read 形参char[] , 返回值 int
System.out.println(fout.read(temp));
for(char a:temp)
{
System.out.print(a);
}
fout.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
}
public class FileOperator {
public static void main (String args[])
{
getfileDFS G = new getfileDFS();
File wf = new File("D:/how2j/temp.txt");
byte[] data = {65,66,67,97};
G.W2FbyReader(wf);
}
}
result:
4
ABCa
4 缓存流(由字符流构造)
BufferedReader
PrintWriter
eg 读入一个文件 删除所有 // 形式的注释 写回
package io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class IoTool{
private static Matcher m;
private static Pattern p = Pattern.compile("//.*");
public static void removezs(File f){
try {
FileReader fr = new FileReader(f);
BufferedReader r = new BufferedReader(fr);
ArrayList<String> temp = new ArrayList<String>();
while(true){
String line = r.readLine();
if (null == line)
break;
else{
m = p.matcher(line);
temp.add(m.replaceFirst(""));
}
//System.out.println(line);
}
FileWriter fw = new FileWriter(f);
PrintWriter w = new PrintWriter(fw);
for(String t:temp)
{
w.println(t);
System.out.println(t);
}
fw.close();
fr.close();
w.close();
r.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class myio {
public static void main (String arges[])
{
File file = new File("d:/q.txt");
IoTool it = new IoTool();
IoTool.removezs(file);
}
}
五 。数据流(由Stream构造)
DataInputStream 数据输入流
DataOutputStream 数据输出流
注: 要用DataInputStream 读取一个文件,这个文件必须是由DataOutputStream 写出的,否则会出现EOFException,因为DataOutputStream 在写出的时候会做一些特殊标记,只有DataInputStream 才能成功的读取。
按照写的顺序读就好,不需要分隔符。
public static void read() {
File f =new File("d:/lol.txt");
try (
FileInputStream fis = new FileInputStream(f);
DataInputStream dis =new DataInputStream(fis);
){
boolean b= dis.readBoolean();
int i = dis.readInt();
int ii = dis.readInt();
String str = dis.readUTF();
System.out.println("读取到布尔值:"+b);
System.out.println("读取到整数:"+i);
System.out.println("读取到整数:"+ii);
System.out.println("读取到字符串:"+str);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void write() {
File f =new File("d:/lol.txt");
try (
FileOutputStream fos = new FileOutputStream(f);
DataOutputStream dos =new DataOutputStream(fos);
){
dos.writeBoolean(true);
dos.writeInt(300);
dos.writeInt(1);
dos.writeUTF("123 this is gareen");
} catch (IOException e) {
e.printStackTrace();
}
}
六 ,对象流
注:把一个对象序列化有一个前提是:这个对象的类,必须实现了Serializable接口
//创建对象输出流
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos =new ObjectOutputStream(fos);
//创建对象输入流
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois =new ObjectInputStream(fis);
oos.writeObject(h);
Hero h2 = (Hero) ois.readObject();