java之IO流(二)

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)关闭资源

举例:

public class FileOutputStreamDemo1 {
public static void main(String[] args) throws Exception{
//OutputStream out =new FileOutputStream("fos.txt");//	多态
//创建字节输出流
	//1)构造了输出流对象
	//2)指向了当前目录下输出fos.txt
	FileOutputStream f=new FileOutputStream("fos.txt");	
//写数据
	//1)将文件和和流对象不建立关系了
	//2)及时释放掉流对象所占用的空间
	f.write("hello".getBytes());
	f.close();
	//f.write("java".getBytes());
}
}

注释:OutputStream字节输出流不能创建对象,可以通过多态对子类进行实例化

关于字节输出流写数据的方法
  public void write(int b):一次写一个字节
   public void write(byte[] b) :一次写一个字节数组

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

举例:

public class FileOutputStreamDemo2 {
public static void main(String[] args) throws IOException {
	//构造一个字节输出流对象
	FileOutputStream f=new FileOutputStream("f2.txt");
	//写数据
	f.write(97);
	f.write(126);
	f.write(127);
	byte[] b= {97,98,99,100};
	f.write(b);
	f.write(b, 0, 3);
	f.close();
}
}
需求:输出文本文件,给文本文件中添加一些数据
  问题:
  写一些数据,这些数据并没有换行,如何实现换行的效果...
针对不同的操作系统,里面的换行符合不一样的
   windows: \r\n
   Linx:\n
  mac:\r
  一些高级记事本针对任意的换行会有换行的效果
  问题:如何末尾追加数据呢
  public FileOutputStream(File file, boolean append):指定为true,末尾追加数据
 举例:
public class FileOutputStreamDemo3 {
public static void main(String[] args) throws IOException {
	FileOutputStream f=new FileOutputStream("fox3.txt",true);
	//写数据
	for(int i=0;i<10;i++) {
		f.write(("hello"+i).getBytes());
		f.write(("\r\n").getBytes());
	}
	f.close();
}
}
需求:去读取当前项目下的fis.txt这个文件内容,将文件的内容输出在控制台上
  InputStream抽象类:字节输入流
  FileInputStream
  构造方法:
  public FileInputStream(String name)
  开发步骤:
   1)创建字节文件输入流对象
   2)读数据
   3)释放资源
  
  读数据方式:
   public abstract int read():一次读取一个字节

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

举例:

public class FileInputStreamDemo1 {
	public static void main(String[] args) throws IOException {
		FileInputStream f = new FileInputStream("fos.txt");
		// 开始读取:第一次读取
		// int b=f.read();
		// System.out.println(b);
		// System.out.println((char)(b));
		// b=f.read();
		// System.out.println(b);
		// System.out.println((char)b);
		// 重复读太高,需要while循环
		int b = f.read();
		while (b != -1) {
			System.out.println((char) b);
			b = f.read();
		}
	}
}

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

举例:

public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
	FileInputStream f=new FileInputStream("fos.txt");
	//第一次读取
//	byte[] b=new byte[5];
//	int n = f.read(b);
//	System.out.println(n);
//	System.out.println(new String(b));
//	n=f.read(b);
//	System.out.println(n);
//	System.out.println(new String(b));
	//代码重复度高
	byte[] b=new byte[1024];
    int len=0;
	while((len=f.read(b))!=-1) {
		System.out.println(new String(b,0,len));
	}
}
}
复制文本文件。
将当前项目下的a.txt文件的内容读取出来,复制到b.txt文件中
 源文件: a.txt --->  读取文件的内容---->FileInputStream
 目的地文件: b.txt----> 输出文件 --->FileOutputStream
 本身读写操作:

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

扫描二维码关注公众号,回复: 1129682 查看本文章

举例:

public class CopyDemo1 {
//封装目的文件和源文件
public static void main(String[] args) throws IOException {
	FileInputStream f=new FileInputStream("fos.txt");
    FileOutputStream fos=new FileOutputStream("b.txt");
    //边读边写
    int by=0;
    while((by=f.read())!=-1) {
    	fos.write(by);
    }
    System.out.println("---------");
    f.close();
    fos.close();
}
}

注释:复制图片时会出现乱码现象,如果出现乱码,就用字节流来进行操作

猜你喜欢

转载自blog.csdn.net/wt5264/article/details/80498332