模块9 文件操作
学习目标:
理解流的概念和作用
理解字节流与字符流的异同
了解文件选择框的使用
掌握常用的输入/输出流类的使用
File类:
特点:可以表示文件,但不能获取文件的内容。
构造方法:
File(文件名或文件目录)
eg: File file=new File(“text . txt”)
利用File类的方法访问文件或目录的属性,具体如下:
file. exists(); //判断文件或目录是否存在
file. isFile();//判断是否是文件
file. isDirectory();//判断是否是目录
file. getName();//获取文件或目录的名字
file. getPath();//获取文件或目录的路径
file. getAbsolutePath();//获取文件或目录的绝对路径
file. lastModified();//获取文件或目录的最后修改日期
file. length();//获取文件或目录的大小,单位是字节
File类方法举例:
package com.java.file;
import java.io.File;
import java.util.Date;
public class TestFile {
public static void main(String[] args) {
File file = new File("C:\\1.txt");
System.out.println("文件是否存在?"+file.exists());
System.out.println("是文件吗?"+file.isFile());
System.out.println("是目录吗?"+file.isDirectory());
System.out.println("名称是:"+file.getName());
System.out.println("路径是:"+file.getPath());
System.out.println("绝对路径是:"+file.getAbsolutePath());
System.out.println("最后修改日期为:"+file.lastModified());
System.out.println("最后修改日期为:"+new Date(file.lastModified()));
System.out.println("文件的大小为"+file.length()+"个字节");
}
}
流:
读文件是指把文件中的数据读取到内存,即输入;反之,写文件就是把内存中的数据写到文件中,即输出。
字节流与字符流:
字节流:
InputStream(抽象类,不能用来创建对象)
OutputStream(抽象类,不能用来创建对象)
文件输入流:
FileInputStream(InputStream子类,可以用来创建对象)
利用文件输入流类的方法读取文本文件数据:
file. available();//可读取的字节数
file.read();//读取文件数据
int read(byte[ ] b);
file. close();//关闭文件输入流对象
举例:
package com.java.file;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class DemoFileInputStream1 {
public static void main(String[] args) throws IOException {
FileInputStream fin = new FileInputStream("C:\\1.txt");//定义输入流
int n;
n= fin.available();//查看有多少个字节
System.out.println("有"+n+"个字节可读取");
int i;
i = fin.read();//从输入流读取一个字节
System.out.println((char)i);//显示读取到的内容
fin.close();//关闭输入流
}
}
文件输出流:
FileoutputStream(OutputStream子类,可以用来创建对象)
利用文件输出流类的方法读取文本文件数据:
void write(int b);//向输入流写入一个字节
void write(byte[ ] b);
void write(byte[ ] b, int index, int length );
void close();//关闭输出流
举例:
package com.java.file;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class DemoFileOutputStream {
public static void main(String[] args) throws Exception {
FileOutputStream fout = new FileOutputStream("C:\\2.txt");
fout.write(65);
byte[] b ="中国和俄罗斯".getBytes();//字符串转化成byte类型数据
fout.write(b);
fout.write("\r\n".getBytes());
fout.write(b, 6, 6);
fout.close();
}
}
字符流:
Reader(抽象类,不能用来创建对象)
Writer(抽象类,不能用来创建对象)
字符输出流:
BufferedReader和FileReader(Reader子类,可以用来创建对象)
BufferedWriter和FileWriter(Writer子类,可以用来创建对象)
利用BufferedReader类的方法读取文本文件的数据:
br. read();
int read(char[ ] c);
br. close();
注:字符串可通过getBytes( )方法转换成byte类型数据。
FileReader举例1;
package com.java.file;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class TestFileReader1 {
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("C:\\3.txt");
// int i;
// while((i=fr.read())!=-1) {
// System.out.print((char)i);
// }
char[] c = new char[20];
fr.read(c);
// for(char x:c) {
// System.out.print(x);
// }
String s = String.valueOf(c);
s = s.trim();
System.out.println(s);
fr.close();
}
}
举例2:
package com.java.file;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class TestFileReader2 {
public static void main(String[] args) throws Exception {
//在窗口中放置一个文本框和一个按钮,当点击按钮时
//将c盘中3.txt文档中的内容读取到文本框中显示
FileReader fr = new FileReader("C:\\3.txt");
JFrame f= new JFrame();
JTextArea t = new JTextArea();//创建文本域
JButton b = new JButton("按钮1");
char[] c = new char[20];//文本输入有关
fr.read(c);//读取文件内容到数组中
String s = String.valueOf(c);//将字符数组转化为字符串
s.trim();//裁剪字符串首尾多余的空格
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//t.replaceSelection(s);//将文本域中选定的文字内容替换成指定内容
t.setText(s);//设置文本域中的内容为指定内容
}
});
b.setSize(100, 100);
t.setBounds(100, 100, 1000, 1000);
f.add(t);
f.add(b);
f.setLayout(new FlowLayout());//设置窗口为流式布局
f.setBounds(1500, 200, 400, 400);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
FileWriter举例1:
package com.java.file;
import java.io.FileWriter;
import java.io.IOException;
public class TestFileWriter1 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("C:\\4.txt");
fw.write("职业学院");
fw.close();
}
}
举例2:
package com.java.file;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class TestFileWriter2 {
public static void main(String[] args) throws IOException {
JFrame f= new JFrame();
FileWriter x = new FileWriter("C:\\test.txt");
JButton b = new JButton("保存");
JTextArea y = new JTextArea(1,5);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
String w=y.getText();
x.write(w);
x.close();
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}
});
f.add(b);
f.add(y);
f.setLayout(new FlowLayout());
f.setSize(400, 400);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
x.close();
}
}
提高数据传输速度-----字节缓冲流:
字节缓冲输入流:BufferedInputStream
字节缓冲输出流:BufferedOutputStream
构造方法:
字节缓冲输入流:BufferedInputStream(文件输入流对象)
字节缓冲输出流:BufferedOutputStream(文件输出流对象)
输入:int read();
输出:write( int );
举例:
package com.java.file;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class DemoBufferedStream {
public static void main(String[] args) throws Exception {
FileOutputStream fout = new FileOutputStream("C:\\王菲.mp3");
FileInputStream fin = new FileInputStream("C:\\红豆.mp3");
BufferedInputStream bin = new BufferedInputStream(fin);
BufferedOutputStream bout = new BufferedOutputStream(fout);
long t0 = System.currentTimeMillis()/1000;
System.out.println(t0);
int i;
while((i = bin.read())!=-1) {
bout.write(i);
}
bin.close();
bout.close();
long t1 = System.currentTimeMillis()/1000;
System.out.println(t1);
System.out.println(t1-t0);
}
}