JAVA中IO简介1

一、简介

       java中IO流(以下简称IO流)分为字符流和字节流。字符流在读写文件时和编码表相联系,适合传输文本类型的文件。字节流在读写文件时不和编码表发生联系,适合传输图片、视频等文件。

IO流中有两个常用的基类:

字节流的的抽象基类:InputStream  和  OutputStream

字符流的抽象基类:Reader  和  Writer

常用的IO流都是有这四个类派生踹来的子类,名称一般以父类的名称做后缀,前缀一般为该流的功能,例如:字符流:FileReader,FileWriter;字节流:FileInputStream, FileOutputStream等等。

二、字符流

1.使用字符流创建文件

字符流最常见的操作对象是文本文件,下面用一段代码来入门

public class FileWriterDemo {
	public static void main(String[] args)throws Exception {
		//创建一个FileWriter对象,这个对象已初始化就要指定要操作的文件
		FileWriter fw = new FileWriter("1.txt");
		//write()方法将字符串写入到流中,也就是写入了内存
		fw.write("abcde");
		//调用flash()方法刷新数据,把内存中字符串写到文件里
		fw.flush();
		fw.write("snn");
		//关闭流资源,每当关闭前,就会进行一次刷新,
		//将数据写入文件,关闭后,流消失
		fw.close();
	}
}

2.IO的异常处理

import java.io.*;
/**
 * 本程序用来演示一个基本的IO的异常处理,这个可以作为一个模板
 * @authorsnn
 */
public class FileWriterExceptionDemo {
 
    public static void main(String[] args) {
       //在外面建立流的引用
       FileWriter fw = null;
       //使用try-catch捕获
       try {
           fw = new FileWriter("k:\\demo.txt");
           fw.write("hahaha");
       } catch (IOException e) {
           e.printStackTrace();
       }finally{
           //切记不要忘了关闭流资源
           try {
              if(fw!=null){
                  fw.close();
              }
           } catch (IOException e) {
              // TODO Auto-generatedcatch block
              e.printStackTrace();
           }
       }
    }
}

3.文件的续写

FileWriter fw = new FileWriter("1.txt",true);

//加上参数true时表示不再覆盖原文件,而是在数据的后边接着写入数据

4.文件的读取一:读一个操作一个

FileReader fr = new FileReader("1.txt");
       int ch;
       while((ch=fr.read())!=-1){
           System.out.print((char)ch);
       }
       fr.close();

5.文件的读取二:读到缓冲区中再操作

FileReader fr = new FileReader("1.txt");
       char[] buf =newchar[1024];
       int len = 0;
       while((len=fr.read(buf))!=-1){
           System.out.println(new String(buf,0,len));
       }
       fr.close();

6.文本文件的复制

①读一个,写一个

FileWriter fw = new FileWriter("f:\\1.txt");
       FileReader fr = new FileReader("1.txt");
       int ch = 0;
       while((ch=fr.read())!=-1){//读一个字符,写一个字符
           fw.write(ch);
           fw.flush();
       }
       fw.close();
       fr.close();

②读一些,写一些,即读到缓冲区,再写

FileWriter fw = new FileWriter("f:\\1.txt");
       FileReader fr = new FileReader("1.txt");
       char[] buf =newchar[1024];
       intlen= 0;
       while((len=fr.read(buf))!=-1){//先读满buf,在写数据
           fw.write(buf,0,len);
           fw.flush();
       }
       fw.close();
       fr.close();

7.利用BufferedReader和BufferedWriter

BufferedWriter bfw = new BufferedWriter(new FileWriter("f:\\2.txt"));
       BufferedReader bfr = new BufferedReader(new FileReader("2.java"));
       String line = null;
       while((line=bfr.readLine())!=null){//利用缓冲区读一行数据,写一行数据
           bfw.write(line);
           bfw.newLine();
           bfw.flush();
       }
       bfw.close();
       bfr.close();

8.装饰设计模式

当已有的对象要进行功能增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能,那么自定义的类就成为装饰类

装饰类通常会通过构造方法接收被装饰的对象。并基于已有功能提供更强的功能。例如:BufferedWriter和BufferedReader就是FileWriter和FileReader的装饰类,提供了操作数据的更多的方法。

9.LineNumberReader带行号的读取流

BufferedWriter bfw = new BufferedWriter(new FileWriter("f:\\2.txt"));
       LineNumberReader lnr = new LineNumberReader(new FileReader("2.java"));
       String line = null;
       while((line=lnr.readLine())!=null){
           bfw.write(lnr.getLineNumber()+":"+line);//2.txt中会有行号
           bfw.newLine();
           bfw.flush();
       }
       bfw.close();
       lnr.close();

三、字节流

1.写数据,不用刷新就可以写入

FileOutputStream fos = new FileOutputStream("xxx.txt");
       fos.write("ni hao ya".getBytes());
       fos.close();

2.读数据

①读一个操作一个

FileInputStream fis = new FileInputStream("1.txt");
       int len = 0;
       while((len=fis.read())!=-1){//读到一个就会写一个
           System.out.print((char)len);
       }
       fis.close();

②读一些,操作一些

   

 FileInputStream fis = new FileInputStream("1.txt");
       byte[] buf =newbyte[1024];
       intlen= 0;
       while((len=fis.read(buf))!=-1){//先把数据存到数组里,再操作
           System.out.print(new String(buf,0,len));
       }
       fis.close();

③字节流特有方法

fis.available()要读取的文件的长度,建立一个大小正好的数组

FileInputStream fis = new FileInputStream("1.txt");
       byte[] buf =newbyte[fis.available()];
       int len = 0;
       while((len=fis.read(buf))!=-1){
           System.out.print(new String(buf,0,len));
       }
       fis.close();

3.复制图片

FileInputStream fis = new FileInputStream("xin.jpg");
       FileOutputStream fos = new FileOutputStream("f:\\xin.jpg");
       byte[] buf =newbyte[1024];
       int len = 0;
       while((len=fis.read(buf))!=-1){
           fos.write(buf,0, len);
           fos.flush();
       }
       fos.close();
       fis.close();

4.复制MP3-利用BufferedInputStream和BufferedOutputStream

BufferedInputStream bis = newBufferedInputStream(new FileInputStream("gj.mp3"));
       BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("f:\\gj.mp3"));
       int len = 0;
       byte[] buf =newbyte[1024];
       while((len=bis.read(buf))!=-1){
           bos.write(buf,0,len);
           bos.flush();
       }
       bos.close();
       bis.close();

5.键盘录入以及字节流和字符流的相互转换

System.out:对应着标准输出设备,控制台

System.in:对应着标准的输入设备,键盘

InputStreamReader:把字节流转换成字符流

OutputStreamWriter:把字符流转换成字节流

练习:读取键盘录入,并输出在控制台

//读取键盘录入
       BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
       //将录入数据输出到控制台
       BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
       String line = null;
       while((line=bfr.readLine())!=null){
           if("over".equals(line))
              break;
           bfw.write(line);
           bfw.newLine();
           bfw.flush();
       }
       bfw.close();
       bfr.close();

6.流操作的基本规律

流的操作通过三个明确来完成

(1)明确源和目的

源:输入流。InputStream  Reader

目的:输出流。OutputStream   Writer

(2)操作的数据是否是纯文本

是:字符流

否:字节流

(3)当体系明确后,在明确要使用哪个具体的对象

通过设备来区分:

源设备:内存,硬盘,键盘

目的设备:内存,硬盘,控制台

7.改变标准输入输出设备

System.setIn(InputStream in):这个方法可以设置标准输入设备

System.setOut(OutputStream out):这个方法可以设置标准输出设备

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值