IO流:(Input Output) 输入输出流 java
输入:将文件读到内存中。windows
输出:将文件从内存输出到其余地方。数组
IO计数的做用:主要就是解决设备和设备之间的数据传输问题。缓存
好比:硬盘到--->内存,内存数据--->硬盘中 把键盘中的数据写入到内存。app
IO的应用场景:jvm
好比:打卡机打出信息表、注册的时候图片的上传、下载 功能、解析XML测试
数据保存到本地,数据一个永久保存。数据保存到磁盘上是以文件的形式存在的。spa
java中如何操做文件:操作系统
java是经过File文件类来操做文件和文件夹。orm
File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串建立一个新 File 实例。
File(String pathname)
经过将给定路径名字符串转换为抽象路径名来建立一个新 File 实例。
File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串建立一个新 File 实例。
java是跨平台的不一样的操做系统上均可以运行。
目录分隔符:
不一样的系统目录 的分隔符是不同的。
在Windows系统上目录分隔符:\ ,可是Linux系统上的目录分隔符是 / 。
注意点:在Windows上 \ 或者 / 均可以做为目录的分隔符,若是你用的反斜杠,
将U盘中的文件拷贝到电脑中:输入流--->读到内存--->经过输出流读到电脑磁盘中。
代码是在内存中运行的。
路径问题:
绝对路径 : 文件在硬盘上的完整路径。绝对路径通常都是以盘符开头 D:\\a.txt 绝对路径
相对路径 : 相对路径就是资源文件相对当前程序所在的路径
File中经常使用的方法:
建立:
CreateNewFile() 在指定位置建立一个空文件,成功就返回true,若是已存在就不建立而后返回false
mkdir() 在指定位置建立目录,这只会建立最后一级目录,若是上级目录不存在就抛异常。
mkdirs() 在指定位置建立目录,这会建立路径中全部不存在的目录。
renameTo(File dest) 重命名文件或文件夹,也能够操做非空的文件夹,文件不一样时至关于文件的剪切,剪切时候不能操做非空的文件夹。移动/重命名成功则返回true,失败则返回false。
删除:
delete() 删除文件或一个空文件夹,若是是文件夹且不为空,则不能删除,成功返回true,失败返回false。
deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时建立的临时文件也能够被删除
建立文件的方法:
File file = new File("D:\\aa"); System.out.println("经过指定的路径建立一个空的文件"+file.createNewFile()); |
建立文件夹的方法:
File dir = new File("D:\\cc"); //1.不可以有同名的文件或文件夹 2.只能建立单级文件夹 System.out.println("建立文件夹成功吗"+dir.mkdir()); File dirs = new File("D:\\bb\\aa");System.out.println("建立文件夹成功吗?"+dirs.mkdirs()); |
文件夹的重命名:
File file = new File("D:\\aa.txt"); System.out.println("是否找到该文件夹?"+file.exists()); File destFile = new File("D:\\aabb"); //指的是重命名的名字 System.out.println("重命名成功吗?"+file.renameTo(destFile)); |
文件的重命名:
File file = new File("D:\\aa"); System.out.println("重命名成功吗?"+file.renameTo(new File("D:\\aa.txt"))); //若是更改盘符 : renameTo 是作剪切的操做。 File file = new File("D:\\aa.txt"); System.out.println("重命名成功吗"+file.renameTo(new File("G:\\aa.txt"))); |
删除:
//1.delete() : 删除文件或空的文件夹。 直接删除掉 File file = new File("D://a.txt"); System.out.println("删除成功吗?"+file.delete()); file.deleteOnExit();//用来删除临时文件 System.out.println("哈哈"); file.deleteOnExit(); //在jvm退出的时候删除。 |
判断方法:
exists() 文件或文件夹是否存在。
isFile() 是不是一个文件,若是不存在,则始终为false。
isDirectory() 是不是一个目录,若是不存在,则始终为false。
isHidden() 是不是一个隐藏的文件或是不是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
获取方法:
getName() 获取文件或文件夹的名称,不包含上级路径。
getPath() 返回绝对路径,能够是相对路径,可是目录要指定
getAbsolutePath() 获取文件的绝对路径,与文件是否存在不要紧
length() 获取文件的大小(字节数),若是文件不存在则返回0L,若是是文件夹也返回0L。
getParent() 返回此抽象路径名父目录的路径名字符串;若是此路径名没有指定父目录,则返回null。
lastModified() 获取最后一次被修改的时间。
文件夹相关:
staic File[] listRoots() 列出全部的根目录(Window中就是全部系统的盘符)
list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操做会返回null。
list(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操做会返回null。
listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操做会返回null。
listFiles(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操做会返回null。
获取最后一次被修改的时间:
System.out.println("最后一次修改的时间:"+file.lastModified()); long time = file.lastModified(); Date date = new Date(time); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("最后一次修改的时间:"+dateFormat.format(date)); |
文件夹的操做;
File[] files = File.listRoots(); // 获取windows电脑中全部的盘符 for (File file : files) { System.out.println("盘符:"+file); } |
//获取指定文件夹下文件和子目录的字符串名称 ,子目录中的东西是获取不到的。 File file = new File("D:\\java "); String[] nameStrings = file.list();
for (String string : nameStrings) {
System.out.println(string);
} /*File file = new File("D:\\java "); File[] files = file.listFiles(); for (File file2 : files) { System.out.println("name:"+file2.getName()); //判断file2指的是文件仍是文件夹 if(file2.isDirectory()){ //从子目录中在次获取值 File[] nextFiles = file2.listFiles(); for (File file3 : nextFiles) { System.out.println("subname:"+file3.getName()); } } }*/ |
查找指定的后缀名的文件:
File file = new File("D:\\java课件及资料"); //定义一个过滤器 //FilenameFilter 一个接口 String[] strings = file.list(new MyFilter());
for (String string : strings) {
System.out.println(string); } |
IO流的分类:
流按照操做数据的类型分为两种:字节流,字符流
字节流:读取的是文件的二进制数据,不会对二进制作处理。不会解析成看得懂的数据。
字符流:读取的也是二进制数据,他会将这个二进制的数据转化为咱们可以识别的字符(解码)。字符流是以字符为单位的。
字符流 = 字节流 + 解码。
按照流的方向能够分为:输入流,输出流
判断流是输入仍是输出:以当期的应用程序为参考,观察出具是流入仍是流出,若是流入就是输入流,若是流出就是输出流。
字节流:
InputStream:此抽象类是表示字节输入流的全部类的超类,抽象的类。
如何判断一个流是字节输入流:
判断一下他的类名是不是以InputStream结尾。
使用 FileInputStream: 是InputStream的子类
读取文件的四种方式:
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Demo1 {
/** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub // getFile(); // getFile2(); // getFile3(); getFile4(); }
//方式四:经过建立缓冲区和循环的方式来读取 public static void getFile4() throws IOException{
//1.找目标文件 File file = new File("D:\\java课件"); //2.创建通道 FileInputStream fileInputStream = new FileInputStream(file); //3.建立一个缓冲区 byte[] b = new byte[1024]; // 通常写1024倍数 //4.读取数据 int count = 0; while((count = fileInputStream.read(b))!=-1){
System.out.println(new String(b,0,count)); } //5.关闭资源 fileInputStream.close(); }
//方式三:建立缓冲区来读取数据 缺陷不可以读取一个完整的文件 public static void getFile3() throws IOException{ //1.找目标文件 File file = new File("D:\\a.txt"); //2.创建通道 FileInputStream fileInputStream = new FileInputStream(file); //3.建立一个缓冲区 byte[] b = new byte[1024]; //4.读数据 //缓冲区来读数据 : 数据存在哪里 //数据是存在缓存区字节数组中的 //返回值就是文件的大小。 int count = fileInputStream.read(b); System.out.println(count); //String里面帮咱们作了解码功能 System.out.println(new String(b, 0, count));
//5.关闭资源 fileInputStream.close();
}
//方法二:用循环来读取字节数 缺点读取的效率不高 public static void getFile2() throws IOException{
//1.找目标文件 File file = new File("D:\\a.txt"); //2.创建通道 FileInputStream fileInputStream = new FileInputStream(file); //3.读数据 /*for(int i = 0;i<file.length();i++ ){//有多少个字节就去多少次 char c = (char)fileInputStream.read(); System.out.print(c); }*/
int content = 0; //经过while循环调用read()的方法 ,若是返回的值以-1表示文件没有内容了。 while((content = fileInputStream.read())!= -1){
System.out.print((char)content); }
//4.关闭资源 fileInputStream.close(); }
//方法一:每次只读取一个字节 public static void getFile() throws IOException{
//1.找到目标文件 File file = new File("D:\\a.txt"); //2.创建通道 FileInputStream fileInputStream = new FileInputStream(file); //3.读取文件中的数据 //read() 只获取一个字节 int data = fileInputStream.read(); //a 第一个字节 int data2 = fileInputStream.read(); System.out.println("获取的数据:"+data2); //4.关闭资源(释放资源) fileInputStream.close(); }
}
|
字节输出流 :
OutPutStream : 他也是全部字节输出流的超类 ,也是一个抽象的类 ,使用子类
-----FileOutputStream 文件输出流
FileOutputStream 的使用步骤:
1.找到目标文件
2.创建通道
3.写入数据
4.关闭资源
FileOutputStream的使用注意事项:
1.使用FileOutputStream写数据的时候,若是目标文件不存在,那么就会本身建立一个目标文件对象。
2.使用FileOutputStream写数据的时候,若是目标文件存在,先将里面的数据清空,在写入数据。
3.使用FileOutputStream写数据的时候,若是目标文件存在,想将数据在原有的基础上追加,这个
时候就应该使用FileOutputStream(File file, boolean append) 构造方法, append若是为true表示
能够追加数据,反之不信。
4..使用FileOutputStream写数据的时候,用write(int a)方法写数据,虽然接收的是int ,但实际上只有一个字节的数据,
操做的是低八位的二进制 ,其余的24位所有丢掉。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; public class Demo2 {
/** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub writeData();
//writeData2();
FileInputStream inp = new FileInputStream(new File("D:\\a.txt")); byte[] b = new byte[1024]; inp.read(b); System.out.println(Arrays.toString(b));
}
//方式二: public static void writeData2() throws IOException{ //1.找目标文件 File file = new File("D:\\a.txt"); //2.建立一个通道 FileOutputStream outputStream = new FileOutputStream(file,true); // 在这一步建立的文件。 //3.创键一个字节数组 String str = "hello word"; //将字符串变为字节数组 byte[] b = str.getBytes();
//4.写入数据 outputStream.write(b);
//5.关闭资源 outputStream.close();
}
//方式一 public static void writeData() throws IOException{ //1.找目标文件 File file = new File("D:\\a.txt");
//2.建立一个通道 FileOutputStream outputStream = new FileOutputStream(file);
//3.开始写入数据 /*int a = 10; // 4个字节 outputStream.write(a); //每次输出一个字节 outputStream.write('b'); outputStream.write('c');*/
// 0000-0000 0000-0000 0000-0001 1111-1111 == 511 int a = 127; outputStream.write(a); // 255 //4.关闭资源 outputStream.close(); }
} |