IO流、文件的copy以及递归方法的理解

IO

IO流按流向分为输入流和输出流

按数据的类型分为字节流和字符流

字节流:

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

字节输出流:OutputStream :写字节

字符流:

字符输入流:Reader:读字符

字符输出流:Writer:写字符

开发步骤:

   1)创建字节输出流对象

   2)写数据

   3)关闭资源

例如:

package com.westos.IO;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
public class IoDome {
 
public static void main(String[] args) throws IOException {
//创建输出流对象
FileOutputStream out=new FileOutputStream("f:\\adc.txt");
//写数据
out.write("Uzi".getBytes());
//关闭资源
out.close();

}
}

 

 关于字节输出流写数据的方法

   public void write(int b):一次写一个字节

    public void write(byte[] b) :一次写一个字节数组

    public void write(byte[] b, int off,int len):一次写一部分字节数组

 

package com.westos.IO;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
public class IoDome2 {
 
public static void main(String[] args) throws IOException {
//创建输出流对象
FileOutputStream file=new FileOutputStream("f:\\LoL.txt");
//创建字符数组
byte[] bys= {97,98,99,100,101};
//一次写一个数组
// file.write(bys);
//一次写一部分字节数组
file.write(bys,0,3);
//关闭资源
file.close();
}
}

 

问题:

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

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

  

   windows: \r\n

   Linx:\n

   mac:\r

问题:如何末尾追加数据呢

 

  public FileOutputStream(File file, boolean append):指定为true,末尾追加数据

 

例如:

package com.westos.IO;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
public class IoDome3 {
 
public static void main(String[] args) throws IOException {
//创建字节输出流对象
FileOutputStream file=new FileOutputStream("f:\\lol.txt",true);
for(int x=0;x<5;x++) {
//写资源
file.write(("baby"+x).getBytes());
//写入换行符号
file.write(("\r\n").getBytes());
}
//关闭资源
file.close();
}
}

IO流中加入异常处理的三种方式:

例如:

package com.westos.IO;
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * @author 杰哥
 *当Io流中加入异常处理怎么做?
 *
 */
public class IoDome4 {
 
public static void main(String[] args) {
//创建字节文件输出流对象
FileOutputStream file=null;
//方式1:分别进行异常处理
try {
file=new FileOutputStream("adc.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//写数据
try {
file.write("Uzi".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
//关闭资源
try {
file.close();
} catch (IOException e) {
e.printStackTrace();
}

//方式2:一起处理(没有释放资源,不好)
try {
FileOutputStream file2=new FileOutputStream("ad.txt");
file2.write("Mlxg".getBytes());
file2.close();
} catch (IOException e) {
e.printStackTrace();
}

//方式3:try--catch--finally:将输出流对象写在异常外面这种方法经常使用

FileOutputStream file3=null;
try {
file3 =new FileOutputStream("a.txt");
file3.write("Mlxg".getBytes());
file3.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace(); 
}
finally {
//释放资源前进行非空判断
if(file3!=null) {
try {
file3.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

上面我们学习了写文件,现在让我们看看读文件

  

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

  InputStream抽象类:字节输入流

  FileInputStream

  构造方法:

  public FileInputStream(String name)

  开发步骤:

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

   2)读数据

   3)释放资源

  

  读数据方式:

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

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

 

  

 例如:

package com.westos.IO;
 
import java.io.FileInputStream;
import java.io.IOException;
 
/*读数据方式:
   public abstract int read():一次读取一个字节
   public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)
*/
public class IoDome5 {
 
public static void main(String[] args) throws IOException {
//创建输入流对象
FileInputStream file=new FileInputStream("f:\\LoL.txt");
int num = 0;
//读取数据
//当文本中的文件为空时就会在控制台输出-1,所以我们需要判断
while((num=file.read())!=-1) {
System.out.println((char)num);
}
//关闭资源
file.close();
//一次读取一个字节数组
//创建输入流对象
FileInputStream file2=new FileInputStream("f:\\LoL.txt");
byte[] bys=new byte[1024];
int num=0;
while((num=file2.read(bys))!=-1) {
System.out.println(new String(bys,0,num));
}
//关闭资源
file.close();
}
}

文件的copy

 

思路:

就是将文件a的内容复制到文件b

先创建有一个源文件(就是文件a

在创建一个目的地文件(就是文件b

在判断文件不是null的情况下,每读一个文件就去写一个文件

最后关闭资源

 

例如:

package com.westos.Copy;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class CopyDome {
 
public static void main(String[] args) throws IOException {
//创建源文件对象
FileInputStream fis=new FileInputStream("f:\\a.txt");
//创建要复制的文件对象
FileOutputStream fos=new FileOutputStream("f:\\b.txt");
int by=0;
while((by=fis.read())!=-1) {
//上面读取一个文件写一个文件
fos.write(by);
}
//关闭资源
fis.close();
fos.close();
}
}

 

使用字节数组去copy图片

package com.westos.Copy;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class CopyDome2 {
 
/**
 * @param args
 * 使用字节数组的方式去copy
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
//创建源文件和目的地文件
FileInputStream fis=new FileInputStream("f:\\a.jpg");
FileOutputStream fos=new FileOutputStream("f:\\b.jpg");
//创建字节数组
byte[] bys=new byte[1024];
int len=0;
while((len=fis.read())!=-1) {
fos.write(bys,0,len);
}
fis.close();
fos.close();
}
}

递归方法

递归与嵌套得分开不能混淆:

例如:

嵌套:

Math类中:max方法:

Math.max(3,Math.max(20,30));

递归:

Public void showint n{

ifn<o){

System.out.println(0);

}

System.out.println(n);

Show(n--);

}

构造方法是不存在递归的:

 

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

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

  2)必须满足一些规律

  3)一定要写方法

例如:

package com.westos.Copy;
 
import java.util.Scanner;
 
public class diguiDome {
 
/**
 * @param args
 * 用递归方法来算阶乘算法
 */
public static void main(String[] args) {
//键盘录入一个数据
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数...");
int num=sc.nextInt();
System.out.println(num+"的阶乘是"+jiecheng(num));
}
 
private static int jiecheng(int num) {
if(num==1) {
return 1;
}else {
return num*jiecheng(num-1);
}
}
}
运行结果:
请输入一个数...
5
5的阶乘是120

 

猜你喜欢

转载自blog.csdn.net/j_better/article/details/80370746
今日推荐