File类的知识
public static void main(String[] args) throws IOException
{
//以当前路径创建一个file对象
File file = new File("C:\\Users\\G410\\eclipse-workspace\\javase");
//直接获取文件名输出一点
System.out.println(file.getName());
//获取相对路径的父路径可能出错, 下面代码输出 null
System.out.println(file.getParent());
//获取绝对路径
System.out.println(file.getAbsoluteFile());
//获取绝对路径
System.out.println(file.getAbsolutePath());
//以当前时间作为新文件名来创建文件
File newfile = new File(System.currentTimeMillis()+"");
System.out.println("newfile对象是否已经存在"+newfile.exists());
//以指定的newfile对象来创建一个文件
newfile.createNewFile();
//文件创建完成后返回true
System.out.println("newfile对象是否已经存在"+newfile.exists());
//mkdir方法返回false 无法创建newfile目录
System.out.println(newfile.mkdir());
//使用list方法列出当前路径下所有的文件和路径
String[] filelist = file.list();
System.out.println("=====当前目录下所有文件和路径如下========");
for(String filename:filelist)
{
System.out.println(filename);
}
//列出C:\Users\G410\eclipse-workspace\javase下所有磁盘的根路径
File[] roots = File.listRoots();
System.out.println("======所有磁盘根路径=====");
for(File f:roots)
{
System.out.println(f);
}
//列出file下所有子文件
System.out.println("======列出C:\\Users\\G410\\eclipse-workspace\\javase下下所有子文件=====");
File[] filelis=file.listFiles();
for(File fi:filelis)
{
System.out.println(fi);
}
}
输出
javase
C:\Users\G410\eclipse-workspace
C:\Users\G410\eclipse-workspace\javase
C:\Users\G410\eclipse-workspace\javase
newfile对象是否已经存在false
newfile对象是否已经存在true
false
=====当前目录下所有文件和路径如下========
.classpath
.project
.settings
1520311111063
1520311120680
1520311238677
1520311446642
1520311507031
1520311673879
1520311681120
1520311804875
1520322187481
bin
src
======所有磁盘根路径=====
C:\
D:\
E:\
F:\
G:\
======列出C:\Users\G410\eclipse-workspace\javase下下所有子文件=====
C:\Users\G410\eclipse-workspace\javase\.classpath
C:\Users\G410\eclipse-workspace\javase\.project
C:\Users\G410\eclipse-workspace\javase\.settings
C:\Users\G410\eclipse-workspace\javase\1520311111063
C:\Users\G410\eclipse-workspace\javase\1520311120680
C:\Users\G410\eclipse-workspace\javase\1520311238677
C:\Users\G410\eclipse-workspace\javase\1520311446642
C:\Users\G410\eclipse-workspace\javase\1520311507031
C:\Users\G410\eclipse-workspace\javase\1520311673879
C:\Users\G410\eclipse-workspace\javase\1520311681120
C:\Users\G410\eclipse-workspace\javase\1520311804875
C:\Users\G410\eclipse-workspace\javase\1520322187481
C:\Users\G410\eclipse-workspace\javase\bin
C:\Users\G410\eclipse-workspace\javase\src
文件过滤器的使用
匿名内部类写法
public class FileFilter {
public static void main(String[] args)
{
File file = new File("C:\\Users\\G410\\eclipse-workspace\\javase");
//匿名内部类中写文件过滤规则
String[] nameList = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java")||new File(name).isDirectory();
}
});
for(String name:nameList)
{
System.out.println(name);
}
}
}
lambda写法
public class FileFilter {
public static void main(String[] args)
{
File file = new File("C:\\Users\\G410\\eclipse-workspace\\javase");
//直接写过滤规则
String[] nameList = file.list((dir,name)->name.endsWith(".java")|| new File(name).isDirectory());
for(String name:nameList)
{
System.out.println(name);
}
}
}
输出结果
.settings
bin
src
IO流
InputStrem 和reader 是所有输入流的模板他们是接口
int read()从输入流中读取单个字节返回读取的字节数据int read(byte[] b) 从输入流中最多读取b.length个字节,并将其储存在b中返回实际读取的字节数
int resd(byte[] b,int off,int len)从输入流最多读取len个字节的数据并将其存储在b中并不是从数组起点开始而是从off位置开始返回实际读取的字节数组
* Reader也有类似的方法
创建测试文件
内容
FileInputStream 是InputStream的实现类
测试FileInputStream
@Test
public void fileInputStreamtest() {
//创建流
try(FileInputStream fis = new FileInputStream("src//test111//test"))
{
//存储从流中读取的值
byte[] temp=new byte[1024];
int len;
while((len=fis.read(temp))>0)//len为读出长度如果<0则读取完毕
{
System.out.println(new String(temp,0,len));//输出读取内容
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
输出
字符流 FileReader 是Readerd的实现类
测试FileReader
//测试字符流
@Test
public void FileReader()
{
try(FileReader r = new FileReader("src//test111//test");)
{
char[] temp = new char[1024];
int len;
while((len=r.read(temp))>0)
{
System.out.println(new String(temp,0,len));
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出:
outputStream和writer是输出流接口
方法
void write(int c) 将指定字节/字符数组中的数据输出到指定输出流中
void write(byte[]/char[] buf)将字节数组/字符数组中的数据输出到指定流中
void writer(byte[]/char[] buf,int off,int len)
FileOutputStream和FileWriter是他们的实现类
测试FileOutputStream
//将tes1.java中内容写入到test中
@Test
public void fileoutputStream()
{
try(
FileInputStream fis = new FileInputStream("src//test111//test1.java");
FileOutputStream fos = new FileOutputStream("src//test111//test");
)
{
int len;
byte[] temp = new byte[1024];
while((len=fis.read(temp))>0)
{
fos.write(temp,0,len);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
运行后test中内容变为
转换流
将键盘输入的字节流转化为字符流打印到控制台如果读取到exit 则退出程序
//转换流
@Test
public void InputStreamReader()
{
//字节流转字符流
InputStreamReader isr = new InputStreamReader(System.in);
//再次包装为缓冲流这样流的功能更加强大可以用整行读取的方法 readline()
BufferedReader br = new BufferedReader(isr);
String line=null;
try {
while((line=br.readLine())!=null)
{
System.out.println(line);
if(line.equals("exit"))
{
System.out.println("退出");
System.exit(1);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行结果
对象序列化
Serialize 指将一个对象写入IO流 反序列化(Deserialize)从IO中恢复对象
如果一个实现Serializable 接口的类 的Field是另一个引用类型而这个引用类型没有实现Serlalizable 则这个类变得不可不可序列化
如果多个对象引用同一个对象序列化时那个对象只被序列化一次 有一个序列化算法给每个每个对象一个序列化编号防止重复
对象序列化测试
新建一个待序列化的类要实现Serializable接口
public class test1 implements Serializable{
int value;
String string;
public test1(int value, String string) {
System.out.println("构造器启动");
this.value = value;
this.string = string;
}
@count
public void fun1() {}
public void fun2() {}
@count
public void fun3() {}
public void fun4() {}
}
测试
@Test
public void ObjectInputStream()
{
try ( ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src//test111//test"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src//test111//test"));
)
{
test1 obj= new test1(1,"对象1");
oos.writeObject(obj);
System.out.println("写入完成读出对象");
test1 obj1=(test1) ois.readObject();
System.out.println(obj1.string+" "+obj1.value);
}
catch(Exception e)
{
e.printStackTrace();
}
}
输出:
由结果可知test1对象只在new的时候调用了构造器反序列化时没有再次调用构造器
参考资料:疯狂Java讲义