黑马程序员---Java基础--IO流

----------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!------------

一、流的概述


 在变量、数组和对象中存储数据是暂时的,程序结束后他们就会丢失。为了能够永久地保存程序创建的数据,需要将其保存在磁盘文件中,这样以后就可以在其他程序中使用它们。java的I/O技术可以将这些数据保存到文本文件、二进制文件甚至是压缩包中,以达到永久保存数据。

  流是一组有序的数据序列,根据操作的类型,可以分为输入流和输出流两种。I/O流提供了一天通道程序,可以使用这条通道包源中的字节序列送达目的地。虽然I/O流经常与磁盘文件存取有关,但是源和目的可以设计键盘、鼠标、内存或显示器窗口等

二、输入流和输出流
  输入流和输出流可以分为字符流和字节流
    
         字节流两个基类:
            InputStream   OutputStream
         字符流两个基类:
             Reader Writer

  1.输入流:InputStream 类是字节输入流的抽象类,是所有字节流的父类。InputStream 类的层次结构见下图


           

            Reader类是字符输入流的抽象类,所有的字符输入流的实现都是它的子类。Reader类的层次结构见下图


  2.输出流:OutputStream类是字节输入流的抽象类,该抽象类表示输出字节流的所有类的超类。OutputStream类的层次结构见下图


           

            Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。Writer类的层次结构见下图


  三、File类
  概述:File类是io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法的操作文件,可以通过调用File类的方法,实现创建、删除、重命名文件。
  1.文件的创建与删除
  可以使用File类创建一个文件对象,可以使用三种方法:
   1.File(String pathname)
   2..File(String parent ,String child)
   3..File(File f,String child)
   下面就用具体实例来说明:
 import java.io.*;
 public class FileTest {                    // 创建类FileTest
    public static void main(String[] args) { // 主方法
        File file = new File("word.txt");    // 创建文件对象
        if (file.exists()) {                // 如果该文件存在
            file.delete();                  // 将文件删除
            System.out.println("文件已删除");  // 输出的提示信息
        } else {                                // 如果文件不存在
            try {                                   // try语句块捕捉可能出现的异常
                file.createNewFile();            // 创建该文件
                System.out.println("文件已创建"); // 输出的提示信息
            } catch (Exception e) {               // catch处理该异常
                e.printStackTrace();                // 输出异常信息
            }
        }
    }
}
运行结果如下:

2.获取文件信息

Flie类提供了很多方法用于获取文件本身的一些信息,如下表:


例如获取D盘中的work文件夹下的work.txt文件的文件名、文件长度,并判断该文件是否隐藏文件,代码如下:
import java.io.*;
public class FileTest {                       // 创建类
    public static void main(String[] args) {
        File file = new File("word.txt");            // 创建文件对象
        if (file.exists()) {                          // 如果文件存在
            String name = file.getName();         // 获取文件名称
            long length = file.length();            // 获取文件长度
            boolean hidden = file.isHidden();        // 判断文件是否是隐藏文件
            System.out.println("文件名称:" + name); // 输出信息
            System.out.println("文件长度是:" + length);
            System.out.println("该文件是隐藏文件吗?" + hidden);
        } else {                              // 如果文件不存在
            System.out.println("该文件不存在"); // 输出信息
        }
    }
}
四、
程序在运行期间,大多数数据都是在内存中进行的,当程序关闭或者节诶数,数据就会消失。如果需要将数据保存,可以使用文件输入/输出流与需要保存的文件建立关系,就可以保存数据了。
1.FileInputStream和FileOutputStream类
   FileInputStream和FileOutputStream类都是用来操作磁盘文件的,该类继承自InputStream类,FileOutputStream类是OutPutStream的子类。
      FileInputStream类常用的构造方法如下:
        1.FileInputStream(String name)
        2.FileInputStream(File file)
下面通过一个例子来说明
使用FileOutputStream类想文件work写入信息,然后通过FileInputStream将work文件中的数据读取到控制台上
import java.io.*;
public class FileTest { // 创建类
    public static void main(String[] args) { // 主方法
        File file = new File("word.txt"); // 创建文件对象
        try { // 捕捉异常
            // 创建FileOutputStream对象
            FileOutputStream out = new FileOutputStream(file);
            // 创建byte型数组
            byte buy[] = "我有一只小毛驴,我从来也不骑。".getBytes();
            out.write(buy); // 将数组中信息写入到文件中
            out.close(); // 将流关闭
        } catch (Exception e) { // catch语句处理异常信息
            e.printStackTrace(); // 输出异常信息
        }
        try {
            // 创建FileInputStream类对象
            FileInputStream in = new FileInputStream(file);
            byte byt[] = new byte[1024]; // 创建byte数组
            int len = in.read(byt); // 从文件中读取信息
            // 将文件中信息输出
            System.out.println("文件中的信息是:" + new String(byt, 0, len));
            in.close(); // 关闭流
        } catch (Exception e) {
            e.printStackTrace(); // 输出异常信息
        }
    }
}
  运行结果如下:
 
 
  2.FileReader和FileWriter类
     使用FileOutputStream类向文件中写入数据与使用FileInputStream类从文件爱你中读数据,存在不足,就是这两个类都只提供了对字节或者字节数组的读取方法。由于汉字在文件中占用两个字节,如果使用字节流,读取不好会出现乱码现象,这是采用FileReader类或者FileWriter类可以避免这样的现象
     下面通过一个程序介绍FileReader和FileWriter的用法
     创建Swing窗体,单击窗体中的“写入文本”按钮实现将文本框中的数据写入磁盘中;单击“读取文本”将磁盘文件的信息显示在文本框中
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

public class Ftest extends JFrame { // 创建类,继承Jframe类
    private JScrollPane scrollPane;
    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null; // 创建面板对象
    private JTextArea jTextArea = null; // 创建文本域对象
    private JPanel controlPanel = null; // 创建面板对象
    private JButton openButton = null; // 创建按钮对象
    private JButton closeButton = null; // 创建按钮对象
    
    private JTextArea getJTextArea() {
        if (jTextArea == null) {
            jTextArea = new JTextArea();
        }
        return jTextArea;
    }
    
    private JPanel getControlPanel() {
        if (controlPanel == null) {
            FlowLayout flowLayout = new FlowLayout();
            flowLayout.setVgap(1);
            controlPanel = new JPanel();
            controlPanel.setLayout(flowLayout);
            controlPanel.add(getOpenButton(), null);
            controlPanel.add(getCloseButton(), null);
        }
        return controlPanel;
    }
    
    private JButton getOpenButton() {
        if (openButton == null) {
            openButton = new JButton();
            openButton.setText("写入文件"); // 修改按钮的提示信息
            openButton
                    .addActionListener(new java.awt.event.ActionListener() {
                        // 按钮的单击事件
                        public void actionPerformed(ActionEvent e) {
                            // 创建文件对象
                            File file = new File("word.txt");
                            try {
                                // 创建FileWriter对象
                                FileWriter out = new FileWriter(file);
                                // 获取文本域中文本
                                String s = jTextArea.getText();
                                out.write(s); // 将信息写入磁盘文件
                                out.close(); // 将流关闭
                            } catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        }
                    });
        }
        return openButton;
    }
    
    private JButton getCloseButton() {
        if (closeButton == null) {
            closeButton = new JButton();
            closeButton.setText("读取文件"); // 修改按钮的提示信息
            closeButton
                    .addActionListener(new java.awt.event.ActionListener() {
                        // 按钮的单击事件
                        public void actionPerformed(ActionEvent e) {
                            File file = new File("word.txt"); // 创建文件对象
                            try {
                                // 创建FileReader对象
                                FileReader in = new FileReader(file);
                                char byt[] = new char[1024]; // 创建char型数组
                                int len = in.read(byt); // 将字节读入数组
                                // 设置文本域的显示信息
                                jTextArea.setText(new String(byt, 0, len));
                                in.close(); // 关闭流
                            } catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        }
                    });
        }
        return closeButton;
    }
    
    public Ftest() {
        super();
        initialize();
    }
    
    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("JFrame");
    }
    
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getScrollPane(), BorderLayout.CENTER);
            jContentPane.add(getControlPanel(), BorderLayout.SOUTH);
        }
        return jContentPane;
    }
    
    public static void main(String[] args) { // 主方法
        Ftest thisClass = new Ftest(); // 创建本类对象
        thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        thisClass.setVisible(true); // 设置该窗体为显示状态
    }
    
    protected JScrollPane getScrollPane() {
        if (scrollPane == null) {
            scrollPane = new JScrollPane();
            scrollPane.setViewportView(getJTextArea());
        }
        return scrollPane;
    }
}
运行结果如下:


五、带缓存的输入流好人输出流
 概述:缓存是I/O的一种性能优化。缓存流为I/O增加了呢你才缓存区
 1.BufferedInputStream和BufferedOutputStream类
    BufferedInputStream类两个构造函数:
         BufferedInputStream(InputStream in)
         BufferedInputStream(InputStream in,int size)
    BufferedOutputStream类两个构造函数:
         BufferedOutputStream(InputStream in)
         BufferedOutputStream(InputStream in,int size)
         使用BufferedOutputStream输出信息和向OutputStream输出信息一样,只不过BufferedOutputStream有一个fiush()方法用来将缓存区的数据强制输出完

2.BufferedReader和BufferedWriter类
概述:BufferedReader和BufferedWriter类分别继承Reader类和Writer类。这两个类同样具有内部缓存机制
     BufferedReader类常用的方法如下:
       read():读取单个字符
       readLine():读取一个文本行,并将返回为字符串:若五数据刻度,则返回null
       write(String s,int off,int len):写入字符串的某部分
       flush():刷新该流的缓存
       newLine():写入一个分隔符
       例如:想指定磁盘中写入数据,并通过BufferedReader类将文件中的信息分行显示
import java.io.*;
public class Student { // 创建类
    public static void main(String args[]) { // 主方法
        // 定义字符串数组
        String content[] = { "好久不见", "最近好吗", "常联系" };
        File file = new File("word.txt"); // 创建文件对象
        try {
            FileWriter fw = new FileWriter(file); // 创建FileWriter类对象
            // 创建BufferedWriter类对象
            BufferedWriter bufw = new BufferedWriter(fw);
            for (int k = 0; k < content.length; k++) { // 循环遍历数组
                bufw.write(content[k]); // 将字符串数组中元素写入到磁盘文件中
                bufw.newLine(); // 将数组中的单个元素以单行的形式写入文件
            }
            bufw.close(); // 将BufferedWriter流关闭
            fw.close(); // 将FileWriter流关闭
        } catch (Exception e) { // 处理异常
            e.printStackTrace();
        }
        try {
            FileReader fr = new FileReader(file); // 创建FileReader类对象
            // 创建BufferedReader类对象
            BufferedReader bufr = new BufferedReader(fr);
            String s = null; // 创建字符串对象
            int i = 0; // 声明int型变量
            // 如果文件的文本行数不为null,则进入循环
            while ((s = bufr.readLine()) != null) {
                i++; // 将变量做自增运算
                System.out.println("第" + i + "行:" + s); // 输出文件数据
            }
            bufr.close(); // 将FileReader流关闭
            fr.close(); // 将FileReader流关闭
        } catch (Exception e) { // 处理异常
            e.printStackTrace();
        }
    }
}
运行结果如下:

    
例子:
编写程序,使用字符输入、输出流读取文件,将一段文字加密文字后存入文件,然后再读取,并将加密前和加密后的文件输出
import java.io.*;
public class Example {
    public static void main(String[] args) {
        char a[] = "我爱编程".toCharArray();
        int n = 0;
        try {
            File out = new File("word.txt");
            for (int i = 0; i < a.length; i++) {
                a[i] = (char) (a[i] ^ 'R');
            }
            FileWriter fw = new FileWriter(out);
            fw.write(a, 0, a.length);
            fw.close();
            FileReader fr = new FileReader(out);
            char tom[] = new char[10];
            System.out.println("加密后:");
            while ((n = fr.read(tom, 0, 10)) != -1) {
                String s = new String(tom, 0, n);
                System.out.println(s);
            }
            fr.close();
            fr = new FileReader(out);
            System.out.println("明文:");
            while ((n = fr.read(tom, 0, 10)) != -1) {
                for (int j = 0; j < n; j++) {
                    tom[j] = (char) (tom[j] ^ 'R');
                }
                String str = new String(tom, 0, n);
                System.out.println(str);
            }
            
            fr.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
}


运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值