黑马程序员——IO流(下)

——- android培训java培训、期待与您交流! ———-
有时候我们用记事本编写JAVA程序时,控制台报告异常,指定在某行错误,我们能不能带行号打印出我们所编写的JAVA程序呢?答案是可以的!我们来学习一下类 LineNumberReader。
LineNumberReader类:

定义:跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(), 
它们可分别用于设置和获取当前行号。 
默认情况下,行编号从 0 开始,该行号随数据读取在每个行结束符处递增, 
并且可以通过调用 setLineNumber(int) 更改行号。 
但要注意的是,setLineNumber(int)  
不会实际更改流中的当前位置; 
它只更改将由 getLineNumber() 返回的值。

我们用到的构造方法摘要

LineNumberReader(Reader in) 
      使用默认输入缓冲区的大小创建新的行编号 reader。 

我们用到的方法摘要

 int getLineNumber() 
      获得当前行号。 
 void setLineNumber(int lineNumber)
 设置当前行号。
 String readLine() 
      读取文本行。 

要求:读取自身文件并给文件前加上行号
代码:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class ReadLineDemo {

    private void readLineDemo(){
        try {
            //创建对象
            LineNumberReader fis = new LineNumberReader(new FileReader("c:\\puke\\ReadLineDemo.java"));
            //设置第一行的行号
            fis.setLineNumber(0);
            String line = null;
            try {
                while((line=fis.readLine())!=null){
                    System.out.println(fis.getLineNumber()+" "+line);
                }
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ReadLineDemo().readLineDemo();
    }

}

这里写图片描述
感觉很不错吧!其实我们看API不难发现

java.lang.Object
  继承者 java.io.Reader
      继承者 java.io.BufferedReader
          继承者 java.io.LineNumberReader

LineNumberReader不过对BufferedReader进行封装一下加上两个getLineNumber() setLineNumber(int lineNumber)方法,我们自己也可以自定义的!
讲了那么多说的都要是对文字操作我自己都要有点烦,我们来说说字节流吧!说到字节流,我们会想到应该是对二进制数进行操作吧!电脑硬盘上的数据都是二进制也就是说我们学会了对字节流的操作我们就能操作笔记本上的数据了。
我们就通过一些例子来理好的掌握字节流吧!
要求:将C盘下的任意一文件拷到D盘指定目录下
分析:任意一文件那就说明可能是文本,图片,电影等,我们不知道要传递什么量?但可以确定文件是由二进制数据组成,那我就InputStream,OutStream的子类来实现数据的转移,来学习二个类。
FileInputStream类:

java.lang.Object
  继承者 java.io.InputStream
      继承者 java.io.FileInputStream
FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。 
FileInputStream 用于读取诸如图像数据之类的原始字节流

我们用到的构造方法摘要

FileInputStream(String name) 
      通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。 

我们要用到的方法:

int read(byte[] b) 
      从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 
void close() 
      关闭此文件输入流并释放与此流有关的所有系统资源。 

FileOutputStream类:

java.lang.Object
  继承者 java.io.OutputStream
      继承者 java.io.FileOutputStream
FileOutputStream 用于写入诸如图像数据之类的原始字节的流。

我们要用到的构造方法:

FileOutputStream(String name) 
      创建一个向具有指定名称的文件中写入数据的输出文件流。 
FileOutputStream(String name, boolean append) 
      创建一个向具有指定 name 的文件中写入数据的输出文件流。
       append为true在文件末尾追加数据

我们要用到的方法:

 void write(byte[] b, int off, int len) 
 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 
 void close() 
 关闭此文件输出流并释放与此流有关的所有系统资源。 

要求:将C盘下的任意一文件拷到D盘指定目录下
代码:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MoveFileDemo {
    //两个目录一个用于输入路径一个用于输出路径
    private void moveFile(String cDir,String dDir){
        try {
            FileInputStream fis = new FileInputStream(cDir);
            FileOutputStream fos = new FileOutputStream(dDir);
            //定义每次读取的大小
            byte []buf = new byte[1024*10];
            //获取每次读的长度
            int len;
            try {
                while((len = fis.read(buf))!=-1){
                    //读多少数据,写多少数据
                    fos.write(buf, 0, len);
                }
                //关闭资源
                fis.close();
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new MoveFileDemo().moveFile("c:\\puke\\nazi.jpg","D:\\nazi.jpg");
    }

}

现在我们在学习两个很实用的转换流,InputStreamReader,OutputStreamWriter,意思就是字节流转换为字符流!
试想一下我们在键盘录入数据,我们想要把录入的数据写在硬盘上要怎么做呢?
先来看一下上面两个转让换流具体内容吧!
InputStreamReader类:

InputStreamReader 是字节流通向字符流的桥梁: 
它使用指定的 charset 读取字节并将其解码为字符。 
它使用的字符集可以由名称指定或显式给定, 
或者可以接受平台默认的字符集。
每次调用 InputStreamReader 中的一个 read() 方法 
都会导致从底层输入流读取一个或多个字节。 
要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节, 
使其超过满足当前读取操作所需的字节。 

我们用到的构造方法摘要

InputStreamReader(InputStream in) 
      创建一个使用默认字符集的 InputStreamReader。 

OutputStreamWriter类

OutputStreamWriter 是字符流通向字节流的桥梁: 
可使用指定的 charset 将要写入流中的字符编码成字节。 
它使用的字符集可以由名称指定或显式给定, 
否则将接受平台默认的字符集。

我们用到的构造方法:

OutputStreamWriter(OutputStream out) 
      创建使用默认字符编码的 OutputStreamWriter。 

示例:我们在键盘录入数据,我们把录入的数据写在硬盘上

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class InputDemo {
    private void inputDemo(){
        //通过转流获取键盘录入,并把字节数据转成字符数据
        BufferedReader fis = new BufferedReader(new InputStreamReader(System.in));
        //输出数据
        try {
            PrintWriter fos = new PrintWriter("c:\\puke\\print.txt");
            String line = null;
            System.out.print("请输入:");
            try {
                while((line=fis.readLine())!=null){
                    //结束输入
                    if(line.equals("over")){
                        break;
                    }
                    //把数据写到硬盘中
                    fos.println(line);
                    //把流写到文件中
                    fos.flush();
                    System.out.print("请输入:");
                }
                //关闭资源
                fis.close();
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new InputDemo().inputDemo();
    }

}

这里写图片描述

——- android培训java培训、期待与您交流! ———-

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值