File 文件和目录路径名的抽象表示(调用构造方法不一定有真实的路径或文件存在,只是有一个抽象的方法指向它)
-
构造方法
File(File parent, String child)
File(String pathname)
File(String parent, String child) -
创建方法
public boolean createNewFile() throws IOException//创建文件(路径不存在时先创建目录,否则抛异常)
public boolean mkdirs()//创建多层目录
public boolean mkdir()//创建单层目录 -
删除方法
public boolean delete()//多层文件(文件夹)删除 必须先删除最里面的子文件(文件夹),否则删除失败
注:
1. 如果创建的文件或目录忘记写磁盘路径,则默认为项目路径
2. Java中的删除不走回收站
3. 要删除一个文件夹,该文件夹内不能包含文件或者文件夹
- 重命名方法
public boolean renameTo(File dest) 重命名功能
File file3 = new File("a.txt");
file3.createNewFile();
System.out.println("rename:"+file3.renameTo(new File("b.txt")));
System.out.println("rename:"+file3.renameTo(new File("e:\\b.txt")));
注:
1. 如果路径相同,则修改文件名
2. 如果路径不同,则想当与剪切并改名
-
常用方法
public File getAbsolutePath() 获取文件绝对路径
public String getPath() 获取文件相对路径
public String getName()(获取文件名称
public long lastModified()//返回文件最后一次修改时间(毫秒)
public long length()返回由此抽象路径名表示的文件的长度(字节数)。 如果此路径名表示目录,则返回值未指定。public String[] list()获取指定目录下的文件和目录字符串数组。
public File[] listFiles()获取指定目录下的所有文件或者文件夹的File数组。File file4 = new File("e:\\"); String[] strs = file4.list(); for(String str:strs ){ System.out.println(str); } /* testworkspace var workerId 小程序项目 工作总结 */ File file5 = new File("e:\\"); File[] files = file5.listFiles(); for(File file : files ){ System.out.println(file); } /* e:\testworkspace e:\var e:\workerId e:\小程序项目 e:\工作总结 */
eg:查找某个磁盘下以.txt结尾的文件
例一:思路:获取某磁盘文件对象,遍历该磁盘下所有文件,输出符合条件的文件
public static void main(String[] args) {
File file = new File("e:\\");
File[] files = file.listFiles();
for(File f :files){
//判断是否是文件
if(f.isFile()){
//判断是否是以.txt 结尾
if(f.getName().endsWith(".txt")){
System.out.println("返回结果:"+f.getName());
}
}
}
例二:获取某磁盘下的String文件数组,一一判断过滤
public static void main(String[] args) {
File file = new File("e:\\");
//获取该路径下所有文件的string数组(并过滤不符合要求的str)
String[] strArray = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file = new File(dir,name);
boolean flag = file.isFile();
boolean flag1 = name.endsWith(".txt");
return flag && flag1;
}
});
for (String s: strArray){
System.out.println("输出结果:"+s);
}
}
注:== accept()方法可简写如下: return new File(dir,name).isFile() && name.endsWith(".jpg");==
IO流
-
分类
1.按流向输入流 (读数据)
输出流(写数据)
2.按数据类型
字节流
字节输入流(InputStream)
字节输出流(OutputStream)
字符流(为方便操作文本数据,java提供了字符流)
字符输入流(Reader)
字符输出流(Writer)
- 字节流学习
OutputStream(抽象类)常见方法
- 将给定的字节数组内容全部输出:public void write(byte b[]) throws IOException
- 将部分字节数组内容输出:public void write(byte b[], int off, int len) throws IOException(重点)
- 输出单个字节:public abstract void write(int b) throws IOException
eg1:
public static void main(String[] args) throws IOException {
//创建文件输出流
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("hello IO".getBytes());
//释放资源
fos.close();
}
创建文件输出流作用
1.创建文件fos.txt
2.创建fos.txt对象
3.将对象指向文件
close作用
1.让对象变成垃圾,这样就可以被垃圾回收器回收了
2.通知系统去释放跟该文件相关的资源
实现让数据换行
fos.write("\r\n".getBytes());
注: 不同系统针对不同换行符识别不一样
windows: \r\n
linux: \n
Mac: \r
在计算机中中文存储分两个字节:第一个字节肯定是负数,第二个字节常见的是负数,有可能有正数,但是没有影响
eg2.将D盘下的ab.png 存储到该项目目录下(一次读一个字节)
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("d:\\ab.png");
FileOutputStream fos = new FileOutputStream("mn.png");
int by = 0;
while((by = fis.read())!= -1){
fos.write(by);
}
fos.close();
fis.close();
}
eg3.输出a.txt内容 (一次读一个字节数组)
public static void main(String[] args) throws IOException {
//文件输入流
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
byte[] bytes = new byte[5];
//第一次
int len = fis.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));
//第二次
len = fis.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));
//第三次
len = fis.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));
//第四次
len = fis.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));
}
输出结果:
5
hello
5
wor
2
ldwor
-1
ldwor
第一次输出 hello
第二次输出 \r\nwor
第三次输出 ldwor
第四次输出 ldwor
eg4:代码简(优)化:
public static void main(String[] args) throws IOException {
//文件输入流
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
byte[] bytes = new byte[5];
int len = 0;
while((len = fis.read(bytes))!= -1){
fos.write(bytes,0 ,len);
}
}
-
字符流学习
字符流 = 字节流+编码表
-
OutputStreamWriter构造方法
public OutputStreamWriter(OutputStream out)(根据默认编码将字节流的数据转换为字符流)
public OutputStreamWriter(OutputStream out,Charset cs) (根据指定的编码把字节流转换为字符流)
-
write方法
public void write(char[] cbuf, int off, int len) throws IOException
public void write(String str, int off, int len) throws IOException
public void write(int c) throws IOException
-
OutputStreamWriter构造方法
public InputStreamReader(InputStream in)
public InputStreamReader(InputStream in, CharsetDecoder dec)
-
read方法
public int read() throws IOException
public int read(char[] cbuf, int offset, int length) throws IOException
eg1:将字符串写入文件
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt") );
osw.write("a");
osw.close();
}
注:当写入一个字符时,a.txt中没有文件,原因是:方法默认写入一个字符,a为一个字节,写入的a在缓冲流中,所以需要调用 osw.flush()
eg2:读取输入流输出到控制台
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
int len = 0;
while ((len = isr.read()) != -1) {
System.out.print((char) len);
}