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 show(int n){
if(n<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