文件
File类并不是代表文件,它可以代表特定文件的名称,也可以是某个目录。
这里的名称就是路径,因为在Java中“\”被用作转义字符,所有Windows风格的路径最好用"\“来分隔,如:“c:\temp\test.txt”, 但在Linux下此路径就应该这样写: c:/temp/test.txt”。 如果要考虑跨平台,则最好这样写: “c:”+File.separator+“temp” +File.separator+“文件名”
文件file 相关方法使用
package com.wdy.file;
import java.io.File;
import java.util.Date;
public class FileDemo {
public static void main(String[] args) throws Exception {
File file = new File("D:\\abc.txt");
file.createNewFile();
System.out.println("是否是文件夹: " +file.isDirectory());
System.out.println("是否是文件: " +file.isFile());
System.out.println(file.isHidden());
System.out.println(new Date(file.lastModified()));
System.out.println(file.getTotalSpace()/1024/1024/1024+"G");
System.out.println(file.getFreeSpace()/1024/1024/1024+"G");
File f = new File("C:\\");
File[] fs = f.listFiles();
for (File f2 : fs) {
System.out.println(f2.getName());
}
}
}
Demo 通过递归 查找c盘下所有文件
package com.wdy.file;
import java.io.File;
public class FileDemo02 {
static int count = 0;
public static void main(String[] args) {
File file = new File("C:\\");
find(file);
System.out.println("图片: " + count);
}
public static void find(File file) {
if(file!=null && file.isFile()) {
String fileName = file.getName();
return;
}
File[] fs = file.listFiles();
if(fs!=null) {
for (File f : fs) {
find(f);
}
}
}
}
File和流
File类关心得是磁盘上存储的文件,而流是指程序运行中数据的通道信道,流类关心的是文件的内容。
流
输入流和输出流
字节流和字符流
- 字节流以字节的形式来处理数据
- 字符流以字符的形式来处理数据
输入流 Demo: 读取指定文件内容
获取当前文件位置的方法: 1)右击java文件 ——Properties——查看绝对路径 2)利用线程获取bin文件夹位置,再进行修改
用字节流读取出现乱码(中文乱码)如何解决? 1)采用包装模式:字节流——>字符流 InputStreamReader 2)直接用字符流读取 Reader类
try…with…resource 捕获异常 : 使用条件:出现异常的类实现了Closeable接口 如Reader类实现了Closeable接口
package com.wdy.stream;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class InputStreamDemo {
public static void main(String[] args) {
String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
System.out.println(path);
path =path.substring(0, path.length()-4);
System.out.println(path);
String fileName = path+"src/io/file/FileDemo02.java";
try(InputStreamReader r = new InputStreamReader(new FileInputStream(fileName));){
int n = 0;
while((n=r.read())!=-1) {
System.out.print((char)n);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
用字符流读取:Reader
package com.wdy.stream;
import java.io.FileReader;
import java.io.Reader;
public class ReaderDemo {
public static void main(String[] args) {
String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
System.out.println(path);
path =path.substring(0, path.length()-4);
System.out.println(path);
String fileName = path+"src/io/file/FileDemo02.java";
try(Reader in = new FileReader(fileName);){
int n = 0;
while((n = in.read())!=-1){
System.out.print((char)n);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
输出流
1)输出流:即在指定文件写内容的操作方法
2)OutputStream底层实现了Closeable接口 (关闭的接口) 、flushable接口(缓存的接口)
3)提高拷贝效率的方式 : 缓存:创建1024字节大小的数组中。讲数据先读入数组(缓存)中
4).close() 底层包含了flush()方法,flush()方法可以省略 5)音视频拷贝使用字节流
输入流demo1:用字节流完成输出流 。在文件中写入一个字符。通过write方法把内容写到流管道
package com.wdy.stream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class OutStreamDemo {
public static void main(String[] args) throws Exception {
OutputStream out = new FileOutputStream("D:\\out.txt", false);
out.write('c');
out.flush();
out.close();
}
}
输入流demo2:用字符流完成输入流 。在文件中写入字符串
package com.wdy.stream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterDemo {
public static void main(String[] args) throws Exception {
Writer out = new FileWriter("D:\\outw.txt", true);
out.write("test...");
out.close();
}
}
输入流demo3:视频拷贝。利用缓存提高效率
package com.wdy.stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyDemo {
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream("D:\\dyit\\20220202\\video\\IO-File.mp4");
OutputStream out = new FileOutputStream("D:\\copyMovie.mp4");
byte[] buffer = new byte[1024];
long s1 = System.currentTimeMillis();
while(in.read(buffer)!=-1) {
out.write(buffer);
}
long s2 = System.currentTimeMillis();
System.out.println("拷贝耗时: " + (s2-s1));
out.close();
in.close();
}
}
|