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