java之 File类 & 字节流(byte)
0x01、File类
File类主要用于文件和目录创建、查找、删除等操作的。
1、file类的构造方法
public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
2、常用方法:
public String getAbsolutePath() :返回此File的绝对路径名字符串。
public String getPath() : 将此File转换为路径名字符串。
public String getName() : 返回由此File表示的文件或目录的名称。
public long length() : 返回由此File表示的文件的长度。
代码示例:
public static void main(String[] args) {
String Pathname = "C:\\Users\\86183\\Desktop\\a.txt";
File abc = new File(Pathname);
System.out.println(abc.getAbsolutePath());
String Pathname1 = "C:\\Users\\86183\\Desktop\\a.txt";
File abc1 = new File(Pathname1);
System.out.println(abc1.getAbsolutePath());
System.out.println(abc1.getPath());
System.out.println(abc1.length());
}
3、判断方法
public boolean exists() : 此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。
public boolean isFile() : 此File表示的是否为文件。
代码示例:
public static void main(String[] args) {
String Pathname = "C:\\Users\\86183\\Desktop\\artifact.exe";
File abc = new File(Pathname);
boolean a = abc.exists();
System.out.println(a);
System.out.println(abc.isFile());
System.out.println(abc.isDirectory());
}
4、增删功能方法
public boolean createNewFile() :当前仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete() :删除由此File表示的文件或目录。
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
public static void main(String[] args) throws IOException {
String Pathname = "a.txt";
File abc = new File(Pathname);
boolean file = abc.createNewFile();
System.out.println(file+"\n"+abc.getAbsolutePath());
File abc1 = new File("abc");
abc1.mkdir();
File abc2 = new File("abc\\abc");
abc2.mkdirs();
}
如果是对目录进行删除,删除的目录必须为空才能进行删除。
5、目录遍历
在file里面给我们提供了,可以直接获取file目录下面所有子文件或目录。
public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
public static void main(String[] args) throws IOException {
String Pathname = "../";
File abc = new File(Pathname);
String[] name = abc.list();
for (String s : name) {
System.out.println(s);
}
}
使用list方法获取所有文件,然后使用增强for循环进行遍历。
0x02、字节流
- I : Input 输入 从其他存储设备读数据到内存中就是输入
- O : Output 输出 从内存中写数据到其他存储设备
根据数据的流向分为:输入流和输出流。
-
输入流 :把数据从其他设备上读取到内存中的流。
- 字节输入流:以字节为基本单位,读数据
- 字符输入流:以字符为基本单位,读数据
-
输出流 :把数据从内存 中写出到其他设备上的流。
-
字节输出流:以字节为基本单位,写出数据
-
字符输出流:以字符为基本单位,写出数据
-
1、字节输出流
OutputStream抽象类是字节输入流的超类,他定义了几个共性的方法。
public void close():关闭此输出流并释放与此流相关联的任何系统资源。
public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
public abstract void write(int b) :将指定的字节输出流。
close方法,当完成流的操作时,必须调用此方法,释放系统资源。
(1)、FileOutputStream类
FileOutputStream类是文件输出流,用于将数据些出到文件当中。
查看构造方法:
public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。
如果创建一个io流的对象,必须传入文件的路径,,如果没有该文件就会创建该文件,如果有就会清空原本有的数据。
代码:
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
FileOutputStream FileoutDate = new FileOutputStream(file);
FileoutDate.write(97);
FileoutDate.close();
}
这里写进入一个97,但是打开文件会发现写进入的变成了a,这是因为我们这里是以byte形式进行写入的,,而97的ascii转换为字符后,就是a这个字符。
这里还可以指定写出的数据长度
Public class FileOutput {
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
FileOutputStream FileoutDate = new FileOutputStream(file);
byte[] b = "abce3".getBytes();
FileoutDate.write(b,2,2);
FileoutDate.close();
}
}
这里要先获取字符的字节类型数据,使用write写入,从第二位开始索引,写入2个字节。
在程序开发中,有些数据可能没法一次执行获取所有结果,这时候我们如果以上面的方式来循环写入运行结果的话,每次循环就都会被清空一次,只获得最后一次的执行结果。那么这时候我们就可以使用到追加,把它追加进入,而不是直接覆盖重写。
public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的
文件。
public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。
代码
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
FileOutputStream FileoutDate = new FileOutputStream(file,true);
byte[] b = "abce3".getBytes();
FileoutDate.write(b,2,2);
FileoutDate.close();
}
几行代码和前面的相同,只是在FileOutputStream 构造方法里面传入一个ture,表示使用追加模式,该模式默认为false。
2、字节输入流
InputStream抽象类是字节输入流的超类。可以读取字节数据到内存中。
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
(1)、FileInputStream 类
FileInputStream是文件输入流,从文件中读取字节到内存中。
构造方法:
FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系
统中的 File对象 file命名。
FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件
系统中的路径名 name命名。
代码:
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
FileInputStream fileinputdata = new FileInputStream(file);
int read = fileinputdata.read();
System.out.println((char) read);
read = fileinputdata.read();
System.out.println((char) read);
read = fileinputdata.read();
System.out.println(read);
fileinputdata.close();
}
使用read方法读取完后,地址会往后推一位,知道读取到没有,会返回-1。
以上的方法都是读取单个字节,我们可以定义一个字节类型的数值,然后让他每次读取我们指定的长度。
代码:
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
FileInputStream fileinputdata = new FileInputStream(file);
int len;
byte[] b = new byte[2];
while ((len=fileinputdata.read(b))!=-1){
System.out.println(new String(b,0,len));
}
fileinputdata.close();
}
这里定义了b变量用来接收每次读取的数据产的长度,然后定义一个len变量,接收每次读取的数据,这里可以直接把赋值放在循环条件里面,如果赋值的变量不等于-1,就一直循环,知道读取到-1,停止循环,前面说到如果没有数据读取会输出返回一个-1,结束循环。