目录
1.常识
2.File类
3.文件内容的读写
3.1文件的读取
3.2文件的写入
1.常识
文件是存储在硬盘上的
硬盘和内存的区别:
1.内存存储空间小,硬盘空间大
2.内存访问速度快,硬盘速度慢
3.内存成本高,硬盘便宜
4.内存掉电数据丢失,硬盘掉电数据还在
2.File类
文件也是被操作系统管理的,操作系统内核中有一个专门的模块,文件系统
Java针对文件系统/文件进行了一系列的封装
文件操作,Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。
注意,有 File 对象,并不代表真实存在该文件。
即使本来存在这个文件,但是还是要调用File类来创建对象,从而达到操作文件的后续方法的实现
file类里面的方法与构造方法
1.观察 get 系列的特点和差异public class Demo { public static void main(String[] args) throws IOException { File file = new File("d:/java/test.txt"); System.out.println(file.getParent());//获取上一层文件目录 System.out.println(file.getName());获取文件名字 System.out.println(file.getPath());获取文件路径 System.out.println(file.getAbsolutePath());获取绝对路径 System.out.println(file.getCanonicalPath());获取唯一的绝对路径 } }
有些表示方法会用文件名的上层目录简单的用"."或者".."表示
如果路径中包含“.”或“..”等当前路径及上层路径表示法
public class Demo { public static void main(String[] args) throws IOException { File file = new File("./test.txt"); System.out.println(file.getParent()); System.out.println(file.getName()); System.out.println(file.getPath()); System.out.println(file.getAbsolutePath()); System.out.println(file.getCanonicalPath()); } }
getCanonicalPath()方法则会从路径名中删除“.”和“..”使用真实路径代替,这点是与相对获取绝对路径不同的一点.
"."代表当前这一层的文件,".."代表(所有的)父节点
IDEA中,直接运行一个程序,此时的基准目录就是当前项目所在的目录
相对路径是当前文件到目标文件的路径,而当前文件在IDEA指的是当前项目.
2.普通文件的创建与删除
public class Demo1 {//创建文件目录 public static void main(String[] args) throws IOException { File file = new File("text/aaa/111/222");//在这里我们想要创建一个文件目录 System.out.println(file.exists());//一开始还没有创建目录之前是没有文件存在的 System.out.println(file.isDirectory()); System.out.println(file.isFile()); System.out.println(file.createNewFile()); System.out.println("====================="); //file.mkdir();//创建目录,如果中间目录不存在,则创建失败 file.mkdirs();//创建多级目录 System.out.println(file.exists()); System.out.println(file.isDirectory()); System.out.println(file.isFile()); System.out.println(file.createNewFile()); } }
File file = new File("test/aaa/111"); file.mkdirs();//创建多级目录 System.out.println(file.delete())//这个直接把文件删除 file.deleteOnExist();//这个知道程序结束后把文件删除 System.out.pintln(file.exist());//这个虽然会返回ture,但是因为程序还在运行所以没被删除
由此可见程序运行后,111这个文件还是被删除了
3.文件的重命名
File file = new File("some-file.txt"); // 要求 some-file.txt 得存在,可以 是普通文件,可以是目录 File dest = new File("dest.txt"); // 要求 dest.txt 不存在 System.out.println(file.renameTo(dest));//最后返回true
public class Demo1 {//创建文件目录 public static void main(String[] args) throws IOException { File file = new File("./linjie.txt"); // 要求 原文件得存在,可以 //是普通文件,可以是目录 File dest = new File("./huawei.txt"); // 要求 修改之后的文件不存在 System.out.println(file.exists()); System.out.println(dest.exists()); System.out.println(file.renameTo(dest)); System.out.println(file.exists()); System.out.println(dest.exists());
修改之后得到
3.文件内容的读写
3.1文件的读取
1.InputStream类读取数据,由于是抽象类,所以用FileInputStream类创建对象,读取的是字节流的数据
想要读取英文字母时,返回的是它的ASCII码值,读取汉字的时候,按照utf8的编码规则,会得到三个字节一个汉字的编码
例子:
public static void main(String[] args) throws IOException { //使用一下InputStream //1.打开文件 InputStream inputStream = new FileInputStream("./text.txt");//相对路径 //2.读取文件 byte[] b = new byte[1024]; int len = inputStream.read(b); System.out.println(len); for (int i = 0; i < len; i++){ System.out.println(b[i]); } //3.关闭文件 inputStream.close(); } }
在文本文件里输入hello,返回
各自的ASCII码值
如果输入的是汉字
则一个汉字需要三个字节的数字表示,具体规则得看utf8的编码表
2.Read类采取字符流的方式读取数据
public class Demo2 { //使用字符流读一下文件 public static void main(String[] args) throws IOException { Reader reader = new FileReader("text.txt"); char [] buffer = new char[1024]; int len = reader.read(buffer);; for (int i = 0; i < len; i++) { System.out.println(buffer[i]); } reader.close(); } }
字符流读取文档的方式较字节流更方便
但Scanner类是一种最简单读取数据的方法
Scanner scanner = new Scanner(System.in)
String a = scanner.next();
System.out.println(a);
这里的in就是代表我们上面说到的inputStream,System代表在系统用户自行输入数据
如果要在我们的文件读取的话,就修改一下Scanner的构造方法
public class Demo4 { public static void main(String[] args) throws FileNotFoundException { InputStream inputStream = new FileInputStream("text.txt"); Scanner scanner = new Scanner(inputStream); String a = scanner.next(); System.out.println(a); } }
这个方法可以得到与我们输入完全一致的答案
3.2文件的写入
字节流:OutputStream/FileOutputStream
字符流:Writer/FileWriter
和Scanner相对的,还可以使用PrintWriter
printWriter跟我们的System.out.println有相像之处,前者在文件显示写入的内容,后者在系统面板上显示输出的内容
public static void main(String[] args) { try(OutputStream outputStream = new FileOutputStream("text.txt")){ PrintWriter printWriter = new PrintWriter(outputStream); printWriter.println("hello"); printWriter.flush();//刷新缓冲区,显示内容 }catch(IOException e){ e.printStackTrace(); } }