File和IO流

File

 

File:表示文件或者目录的路径的抽象表现形式.  IO流就是对文件进行操作的

 

File类的三个构造方法

 public File(String pathname):表示pathname的抽象路径表现的形式 (开发中使用这种方式)

例如 File f1 = new File(D:\\word\\abc.txt);

public File(String parent,String child)

 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例

 例如:File f2 = new File(D:\\word,abc.txt);

 public File(File parent, String child):根据一个file对象和一个文件路径来构造File实例

 

以上三种方式构造的对象直接输出的结构是该抽象路径

 

 

 

跟创建相关的功能:

 public boolean createNewFile():创建文件,当文件不存在的时候,创建此抽象路径下的文件

//当你定义的是 H:\\Demo\\a.txt  若是Demo文件夹不存在会出现错误

 

错误类型:java.io.IOException: 系统找不到指定的路径。

 public boolean mkdir():创建一个文件夹,如果文件夹存在,不创建 返回一个false

如果父目录不存在也会创建失败返回一个false

 public boolean mkdirs():创建文件夹,如果父目录不存在,会创建此目录

 

 

删除功能

 public boolean delete() :删除文件或者文件夹(目录不能是空的) :逐一删除文件或者目录的


File类的判断功能

 public boolean isDirectory():判断是否是文件夹

 public boolean isFile() :判断是否是文件

 public boolean canRead(): 是否可读

 public boolean canWriter():是否可写

 public boolean exists():是否存在

 public boolean isHidden():是否是隐藏文件

 

 

 

File类的获取功能:

 public String getAbsolutePath():获取抽象文件的绝对路径

 public String getPath():获取相对路径的字符串

 public String getName()返回由此抽象路径名表示的文件或目录的名称

 public long length()返回由此抽象路径名表示的文件的长度。

 public long lastModified():文件最后一次被修改的时间(时间毫秒值)

 /

 

 

 

File的高级功能(!!)

  public String[] list() :获取当前某个路径下的所有的文件夹以及文件名称的字符串数组

  public File[] listFiles() :获取当前某个路径下所有的文件夹以及文件的File数组

 

具体应用

 

 

判断E盘目录下是否有后缀名为.txt的文件,如果有,就输出此文件名称

 

H盘下:图片文件

思路:

1)使用File对象表示e盘的根目录

2)File[] listFiles() ;String[] list() 获取当前盘符下所有的文件以及文件夹的File数组

3)File数组对象进行非空判断,判断他是否为null,不是null,遍历

4)如果他是文件,并还有满足是否以.jpg结尾

满足就可以进行输出文件名称

 方法一:利用File的高级方法

 

 

 

private static void filter1(File f) {

File [] FileArr = f.listFiles();

//判断内容不为空

if( FileArr !=null ) {

//循环该数组

for(File s :FileArr) {

//判断是否是文件

if(s.isFile()) {

//判断文件是否以.txt结尾

if(s.getName().endsWith(".txt")) {

//输出文件名

System.out.println(s.getName());

}

}

}

}

}

 

方式二:在高级方法中调用文件名称过滤器 (用匿名内部类的方式)

 public String[] list(FilenameFilter filter)

   public File[] listFiles(FilenameFilter filter)

   

   FilenameFilter:一个接口:  文件名称过滤器

   boolean accept(File dir, String name)测试指定文件是否应该包含在某一文件列表中。

   

   文件是否包含在文件列表中,取决于返回值,true;false表示不包含

 */

 

 

//通过过滤器

 

private static void filter2(File f) {

//调用过滤器

File[] f1 =  f.listFiles(new FilenameFilter() {

@Override

public boolean accept(File dir, String name) {

//创建封装对象

File f = new File(dir,name);

boolean flag = f.isFile();

boolean flag2 =  name.endsWith(".txt");

return  flag && flag2;

}

});

//遍历该数组

for(File s :f1) {

System.out.println(s.getName());

}

}

}



 IO:在设备和设备之间的一种数据传输!

 IO流的分类:

 按流的方向分:

  输入流: 读取文件   (e:\\a.txt):从硬盘上文件读取出来后输出这个文件的内容

  输出流: 写文件:e:\\a.txt 内容读出来--->写到f盘下

  按数据的类型划分:

  字节流

  字节输入流:InputStream:读取字节

  字节输出流:OutputStream:写字节

 字符流

  字符输入流:Reader:读字符

  字符输出流:Writer:写字符

 

 

  需求:在当项目下输出一个文件,fos.txt文件(文本文件)

  只要文本文件,优先采用字符流,字符流在字节流之后出现的

  使用字节流进行操作

  无法创建字节输出流对象:OutputSteam :抽象类,不能实例化

  又学习过File,并且当前是对文件进行操作,子类:FileOutputSteam进行实例化

  File+InputStream

  File+OutputStream

  FileXXX  (FileReader)

  FileXXX  (FileWriter)

  

  开发步骤:

  1)创建字节输出流对象

  2)写数据

  3)关闭资源

 

 

示例:

//先创建对象,由于它OutputStream是抽象类,故而应用它的实类或者多态的方式创建

//多态 OutputStream os = new OutputStream() ;

//子实类:  

             FileOutputStream fos = new FileOutputStream("demo") ;

//写数据  写的时候只接受int类型的数据或者是byte[]类型的数据

fos.write("你好".getBytes());

 

 

 

//关闭资源

/**

  1)将文件和流对象不建立关系了 (fos对象不指向fos.txt)

  2)及时释放掉流对象所占用的内存空间

  */

fos.close();

 

//如果关闭流对象了,那么就不能对流对象进行操作了

 

 

需求:输出文本文件,给文本文件中添加一些数据

  

  问题:

  写一些数据,这些数据并没有换行,如何实现换行的效果...

  针对不同的操作系统,里面的换行符合不一样的

  

 windows: \r\n

  Linx:\n

  mac:\r

  

  

  一些高级记事本针对任意的换行会有换行的效果

 

 

Day22.2文件

 

IO流中加入异常处理(try...catch...)

    方式1) 分别进行异常处理

    创建字节文件输出流对象

 

 

//方式一,分别进行try---catch操作

FileOutputStream fos = null;

//对创建对象进行操作

try {

fos =  new FileOutputStream("day22.3.txt");

} catch (FileNotFoundException e) {

e.printStackTrace();

}

//对写数据进行操作

try {

fos.write(("猪最重要的就是开心").getBytes());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//堆释放资源进行操作

try {

fos.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

方式2: 一起处理 (针对整个资源没有释放,不好)

try {

FileOutputStream fos = new FileOutputStream("day22.3.1.txt");

fos.write(("做猪最重要的是开心").getBytes());

fos.close();

}

 catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

 

 

}方式3:经常这样使用:try...catch...finally...

// finally中访问这个对象,需要将对象放到try语句外面

 

 

//方式三

FileOutputStream fos = null;

try {

fos =  new FileOutputStream("day22.3.1.txt");

fos.write(("做猪最重要的是开心").getBytes());

}

 catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//运用finally使得无论如何都会进行资源释放的操作

finally {

if ( fos != null ) {

try {

fos.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

 

 

 

FileInputStream

 

 

 

需求:去读取当前项目下的fis.txt这个文件内容,将文件的内容输出在控制台上

 InputStream抽象类:字节输入流

 FileInputStream

 构造方法:

 public FileInputStream(String name)

  开发步骤:

  1)创建字节文件输入流对象

  2)读数据

3)释放资源

 

读数据方式:

  public abstract int read():一次读取一个字节

 

 

 

  public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)

 

重点(往后常用的模版代码)

   //最终版代码

指定字节数组的长度是:1024或者1024的倍数

byte[] bys2 = new byte[1024] ;

int len2 = 0 ;

while((len2=fis.read(bys2))!=-1) { //判断,赋值,循环

System.out.println(new String(bys2, 0, len2)); //带上len的用法

}

 

复制文本文件。

 

将当前项目下的a.txt文件的内容读取出来,复制到b.txt文件中

 

 源文件:a.txt--->  读取文件的内容---->FileInputStream

 目的地文件:b.txt---->输出文件--->FileOutputStream

 

 

 

方法 1.本身读写操作:

 读取一个字节,写一个字节,针对不会出现中文乱码的问题..

 

 

 

public static void main(String[] args) throws Exception {

//封装目的地文件和源文件

FileInputStream fis = new FileInputStream("a.txt") ;

FileOutputStream fos = new FileOutputStream("b.txt") ;

//进行读写操作

//一次读取一个字节

int by = 0 ;

while((by=fis.read())!=-1) {

//第一个字节,写个一个字节

fos.write(by);

}

System.out.println("------");

//一次读取一个字节数组

//释放资源

fis.close();

fos.close();

}

}

 

方法2读写操作,读入整个数组,写的时候写入整个数组

 

public static void main(String[] args) throws Exception {

//封装目的地文件和源文件

FileInputStream fis = new FileInputStream("c:\\a.txt") ;

FileOutputStream fos = new FileOutputStream("d:\\b.txt") ;

//读写操作

int by = 0 ;

while((by=fis.read())!=-1) {

//不断写数据

fos.write(by);

}

//释放资源

fos.close();

fis.close();

}

 

 

 

递归

 

 

 递归:只的是方法调用方法本身的一种现象

 

 Math:max()方法Math.max(10,Math.max(15,20)); 方法嵌套

 

 举例

 方法递归:

 public void show(int n){

 if(n<0){

 System.exit(0) ;//jvm退出了

 }

 

 System.out.println(n) ;

 show(n--) ;

 }

方法递归的三个必要条件:

 1)方法递归必须有出条件  

 2)必须满足一些规律

 3)一定要写方法

 

 注意:构造方法不存在方法递归的

 举例

 从前有座山,山里有个庙,庙里有个老和尚和小和尚,老和尚给老和尚讲了一个故事是:

 从前有座山,山里有个庙,庙里有个老和尚和小和尚,老和尚给老和尚讲了一个故事是:

 从前有座山,山里有个庙,庙里有个老和尚和小和尚,老和尚给老和尚讲了一个故事是:

 从前有座山,山里有个庙,庙里有个老和尚和小和尚,老和尚给老和尚讲了一个故事是:

 条件结束:山塌了,或者和尚挂了

 

 

 

 

具体应用:

 

需求:5的阶乘

 5! = 5 * 4 * 3 * 2*1

 5! = 5 * 4!

 

  方式:

  1)普通for循环

  2)用递归的方式去写

  1)方法递归必须有出条件

 2)必须满足一些规律

 3)一定要写方法

 

 

Private static void jiecheng(int n ){

///n 等于1 ,该递归已经计算完毕,记为出口条件

If (n == 1){

return 1 ;

}

Else{

//根据规律写出具体描述

Return n * jiecheng(n-1);

}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值