若是要对文件以及文件内容进行操作,应该使用的是:java.Io 包
在java.IO包中,File 类是唯一一个与文件本身操作有关的类,但是不涉及到文件的具体内容。文件本身指的是:创建、删除等操作
public File(String pathnamc);
根据完整的路径来完成对文件的本身操作
public File(File parent , String child);
主要用于在Android系统中
public boolean createNewFile();
import java.io.File;
import java.io.IOException;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:\\demo.txt"); //设置文件的路径(文件并不存在)
System.out.println(file.createNewFile());//创建文件
}
}
在第六行中,只是给了file一个路径(转义斜杠),第七行使用 createNewFile() 创建的file路径的文件;方法返回布尔值,创建成功则返回 true 反之则返回 false。
public boolean delete() ;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:\\demo.txt"); //设置文件的路径(文件并不存在)
System.out.println(file.delete());
}
}
我们在 code 第 4 行引用了delete() 方法,删除file指定路径的文件
public boolean exists();
文件存在则返回true 反之返回 false
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:\\demo.txt"); //设置文件的路径(文件并不存在)
if (file.exists()) {
file.delete();
} else {
System.out.println("文件不存在");
}
}
}
在 windows 和 Linux 系统的环境下,路径的分隔符号有所不同
所以,如果路径写死,就会影响程序的可移植性
public static final String separator;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator + "demo.txt");
}
}
通过 File中的常量 separator 来代替自定义的文件路径分隔符,可以较完美的解决路径分隔符带来的系统不兼容的问题
public File getParentFile() ; // 返回File便于File类对其操作
public String getParenFile() ; // 返回String数据,便于输出路径名
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"demo" + File.separator +
"demo.txt");
System.out.println(file.getParentFile().exists());// 返回 false
// 获取父类地址,判断是否存在
}
}
file.getParentFile() 返回的是父类目录,使用 exists() 方法进行判断是否存在目录或文件
public boolean mkdir(); // 处理一级目录
public boolean mkdirs();// 处理多级目录
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"demo" + File.separator +
"demo.txt");
if (!file.getParentFile().exists()) {
System.out.println(file.getParentFile().mkdir()); //创建目录(父路径)
}
}
}
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"demo" + File.separator +
"txt" + File.separator +
"demo.txt");
if (!file.getParentFile().exists()) {
System.out.println(file.getParentFile().mkdirs()); //创建多级目录(父路径)
}
}
}
public long length();
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"demo" + File.separator +
"txt" + File.separator +
"demo.txt");
// if (!file.getParentFile().exists()) {
// System.out.println(file.getParentFile().mkdirs()); //创建目录(父路径)
// }
// System.out.println(file.createNewFile());
System.out.println((double)file.length());
}
}
public boolean isFile();
public boolean isDirectory();
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"demo" + File.separator +
"txt" + File.separator +
"demo.txt");
System.out.println("是否是文件" + file.isFile());
System.out.println("是否是目录" + file.isDirectory());
System.out.println(file.length());
}
}
public long lastModified();
new Date ( [File].lastModified() ) ; // 标准格式
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ; //日期格式化
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"demo" + File.separator +
"txt" + File.separator +
"demo.txt");
// SimpleDateFormat 将日期格式化输入
// new Date()构造转换为标准日期格式
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
// 返回结果:2019-07-06 21:21:12
}
}
public String [] list() ;
public File [] listFiles();
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"00 JavaSE 笔记");
System.out.println(file.getPath());
String [] list = file.list();
for (int x = 0; x < list.length; x++) {
System.out.println("|--" + list[x]);
}
}
}
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"00 JavaSE 笔记");
System.out.println(file.getPath());
File [] list = file.listFiles();
for (int x = 0; x < list.length; x++) {
System.out.println("|--" + list[x]);
}
}
}
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"00 JS 笔记");
System.out.println(file.getPath());
print(file);
}
public static void print(File file) {
if (file.isDirectory()) {
File list [] = file.listFiles();
for (int x = 0; x < list.length; x++) {
print(list[x]);
}
} else {
System.out.println("|--" + file);
}
}
}
文件夹/文件存在无法打开的,可以使用Null条件过滤掉
public abstract class OutputStream
extends Object
implements Closeable,Flushable
OutputStream类实现了:Closeable 和 Flushable 接口
public interface Closeable extends AutoCloseable{
public void close() throws IOException; //关闭
}
AutoCloseable:是一个jdk1.7之后定义的自动关闭的机制(建议不用)
public interface Flushable {
public void flush() throws IOException; // 缓存刷新
}
OutputStream 类是在JDK1.0就提供了 close() 和 flush() 两个方法
public abstract void write(int b) throws IOException;
public void write(byte [] b) throws IOException;
public void write(byte[] b , int off , int len) throws IOException;
OutputStream:属于抽象类,如果想实现对抽象类进行对象的实例化操作,那么一定要使用抽象类中的子类。
public FileOutputStream(File file) throws FileNotFoundException;
public FileOutputStream(File file,boolean append);
package helloworld;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if (!file.getParentFile().exists()) { //文件目录不存在
file.getParentFile().mkdirs(); //创建目录
}
// 使用OutputStream和FileOutputStream子类进行对象实例化
OutputStream out = new FileOutputStream(file);
String str = "Hello,World!";
byte data [] = str.getBytes(); // 利用byte类,将字符串转为byte字节数组
out.write(data); // 将内容输出到demo.txt文件中
out.close(); // 关闭操作
}
}
package helloworld;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if (!file.getParentFile().exists()) { //文件目录不存在
file.getParentFile().mkdirs(); //创建目录
}
// 使用OutputStream和FileOutputStream子类进行对象实例化
OutputStream out = new FileOutputStream(file);
String str = "Hello,World!";
byte data [] = str.getBytes(); // 利用byte类,将字符串转为byte字节数组
for (int x = 0; x < data.length; x++) {// 将内容输出到demo.txt文件中
out.write(data[x]); //单字节输出
}
out.close(); // 关闭操作
}
}
package helloworld;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if (!file.getParentFile().exists()) { //文件目录不存在
file.getParentFile().mkdirs(); //创建目录
}
// 使用OutputStream和FileOutputStream子类进行对象实例化
OutputStream out = new FileOutputStream(file);
String str = "Hello,World!";
byte data [] = str.getBytes(); // 利用byte类,将字符串转为byte字节数组
out.write(data,0,5);//部分:从下标0开始的5个数组单元
out.close(); // 关闭操作
}
}
package helloworld;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if (!file.getParentFile().exists()) { //文件目录不存在
file.getParentFile().mkdirs(); //创建目录
}
// 使用OutputStream和FileOutputStream子类进行对象实例化
OutputStream out = new FileOutputStream(file,true);
// true:进行追加 false:不进行追加并覆盖
String str = "Hello,World!\r\n";// 换行使用 \r\n 进行操作
byte data [] = str.getBytes(); // 利用byte类,将字符串转为byte字节数组
out.write(data);
out.close(); // 关闭操作
}
}
public abstract class InputStream
extends Object
implements Closeable
public abstract int read() throws IOException;
public int read(byte[] b) throws IOException;
public int read(byte[] b,int off,int len) throws IOException;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if(file.exists()) {
InputStream in = new FileInputStream(file);
byte [] data = new byte[1024];
in.read(data);
in.close();
System.out.println("{" + new String(data) + "}");
}
}
}
从程序中可以看见一个大问题!我们在不清楚文件字节大小的情况下读取到数组中,而数组过大,会导致出现输出问题;由此我们可以在内容读取到数组的时候,设置参数读取内容读取到数组的数据大小。
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if(file.exists()) {
InputStream in = new FileInputStream(file);
byte [] data = new byte[1024];
int len = in.read(data);
in.close();// 关闭
System.out.println("{" + new String(data,0,len) + "}");
// String(byte[] b , int off , int length)
}
}
}
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if(file.exists()) {
InputStream in = new FileInputStream(file);
byte [] data = new byte[1024];
int foot = 0 ; int temp = 0 ;
while((temp = in.read())!= -1) {
data[foot ++] = (byte) temp;
}
in.close();
System.out.println("{" + new String(data,0,foot) + "}");
}
}
}
public abstract class Writer
extends Object
implements Appendable,Closeable,Flushable
public interface Appendable() {//函数式接口
public Appendable append(char c);
// 添加指定字符c
public Appendable append(CharSequence csq);
// 添加指的字符序列 csq
public Appendable append(CharSequence csq,int start,int end);
// 添加指定字符序列的子序列
}
在Appendable接口里面定义了追加的操作,而且追加的数据都是字符或字符序列
public void write(char[] cbuf) throws IOException;
public void write(String str) throws IOException;
public FileWriter(File file);
public FileWriter(File file,boolean append);
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
//getParentFile()方法,获取父路径
}
Writer out = new FileWriter(file);
String str = "Hello,World!";
out.write(str);
out.close();
}
}
public abstract class Reader
extends Object
implements Readable , Closeable
public int read(char[] cbuf) thows IOException;
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if (file.exists()) {
Reader in = new FileReader(file);
char [] data = new char[1024];
int len = in.read(data);
in.close();
System.out.println(new String(data, 0, len));
}
}
}
在使用字节流输出/输入数据的时候,直接与终端进行数据交互,即使不关闭输出流,也不会对操作有所影响。但 字符输出/输入流,如果不关闭,就会是数据交互受到影响;不关闭输出/输入流,数据就会呆在缓冲区中,只有关闭了输出/输入流,缓存区的内容会被强制清空并输出/输入。如果不关闭输出流的情况下,可以使用 flush() 方法强制清空缓存区
在实际开发中,字节流数据处理的范围较广;例如:图片、音乐、视频、文字等。而字符流处理的数据主要是:进行中文的有效处理。
所以,在处理中文的问题时,优先使用字符流方法。
public class InputStreamReader
extends Reader
publit InputStreamReader(InputStream in)
public class OutputStremWriter
extends Writer
public OutputStreamWriter(OutpurStream out)
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
File.separator +
"demo" +
File.separator +
"demo.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
OutputStream out = new FileOutputStream(file); // 字符流
Writer Out = new OutputStreamWriter(out); // 字节流转字符流
Out.write("Hello,World!");
Out.flush();//强制清空缓存区(不关闭输出流可使用flush()方法强制)
}
}