----------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类是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类提供了很多方法用于获取文件本身的一些信息,如下表:
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();
}
}
}
运行结果: