1、IO:输入输出
- 输入设备:键盘、鼠标…
- 输出设备:显示器、打印机…
- 划分标准:站在内存角度
- 硬盘既是输入设备(可以从硬盘读取文件),又是输出设备(将内容保存到文件)
-最常见的输入输出是:文件输入输出 - 重点:文件输入(读文件)输出(写文件)
2、Java输入输出功能集中在java.io包
- 文件操作
- 文件读
- 文件写
3、文件操作:java.io.File类
- 查询文件、删除文件、重命名、创建文件夹
- 复制、移动文件等功能不涉及
import java.io.*;
class Test{
public static void main (String[] args) {
File f = new File("d:/111");
f.delete();
}
}
import java.io.*;
class Test{
public static void main (String[] args) {
File f = new File("C:/Windows");
File[] files = f.listFiles();
for(File file : files){
System.out.println(file.getName());
}
}
}
4、文件读
案例:某文件中有一段字符串,请将其读入内存后显示
- java.io.FileInputStream : 字节流,对中文乱码支持不好
- java.io.FileReader:字符流,支持多字节字符
- java.io.BufferedReader:缓冲读,支持字符按行读
例子:文档text.txt里面有一段话,要求读入之后在屏幕上显示
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
File f = new File("d:/test.txt");
FileInputStream fis = new FileInputStream(f);
byte[] data = new byte[(int)f.length()];
fis.read(data);
String str = new String(data);
System.out.println(str);
fis.close();
}
}
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
File f = new File("d:/test.txt");
FileInputStream fis = new FileInputStream(f);
while(true){
int i = fis.read();//适合读取
if(i==-1) break;
System.out.print((char)i);
}
fis.close();
}
}
FileInputStream
read字节数组:适合读字符串
read字节+循环:适合读取字符
为了解决此问题,java推出了FileReader解决了FileInputStream双字节读取的问题
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
File f = new File("d:/test.txt");
FileReader fis = new FileReader(f);
while(true){
int i = fis.read();
if(i==-1) break;
System.out.print((char)i);
}
fis.close();
}
}
针对字符串,还可以按行读取,适合读取“一行一行的文档”
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
File f = new File("d:/test.txt");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
while(true){
String str = br.readLine();
if(str==null) break;
System.out.println(str);
}
fr.close();
}
}
5、文件写
案例:字符串“中南大学CSU”,请将其保存到文件
- java.io.FileOutputStream : 字节流,对中文乱码支持不好
- java.io.FileWriter:字符流,支持多字节字符(使用少)
- java.io.PrintStream:支持丰富的格式写
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
File f = new File("d:/test.txt");
FileOutputStream fos = new FileOutputStream(f,true);
String str = "中南大学CSU";
byte[] data = str.getBytes();
fos.write(data);
fos.close();
}
}
write函数写入一个字节数组:适合字符
write函数写入一个个字节:适合字节流
write函数写入一个个字节,也不适合双字节字符,java推出了FileWriter,但是极少使用
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
File f = new File("d:/test.txt");
PrintStream ps = new PrintStream(f);
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
ps.print(i + "*" + j + "=" + i*j + " ");
}
ps.println();
}
ps.close();
}
}
写字符:printStream类
案例:将一个99乘法表存入文件test.txt
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
File f = new File("d:/test.txt");
PrintStream ps = new PrintStream(f);
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
ps.print(i + "*" + j + "=" + i*j + " ");
}
ps.println();
}
ps.close();
}
}
综合案例:
1、将字符文件用凯撒加密法加密(每个字节数字+3)China->Fklqd
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
FileInputStream fis = new FileInputStream("1.txt");
FileOutputStream fos = new FileOutputStream("1加密.txt");
while(true){
int i = fis.read();
if(i==-1) break;
fos.write(i+3);
}
fos.close();
fis.close();
}
}
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
FileInputStream fis = new FileInputStream("1加密.txt");
FileOutputStream fos = new FileOutputStream("1解密.txt");
while(true){
int i = fis.read();
if(i==-1) break;
fos.write(i-3);
}
fos.close();
fis.close();
}
}
2、将图片文件用凯撒加密法加密
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
FileInputStream fis = new FileInputStream("img.jpg");
FileOutputStream fos = new FileOutputStream("img加密.jpg");
while(true){
int i = fis.read();
if(i==-1) break;
fos.write(i+3);
}
fos.close();
fis.close();
}
}
import java.io.*;
class Test{
public static void main (String[] args) throws Exception{
FileInputStream fis = new FileInputStream("img加密.jpg");
FileOutputStream fos = new FileOutputStream("img解密.jpg");
while(true){
int i = fis.read();
if(i==-1) break;
fos.write(i-3);
}
fos.close();
fis.close();
}
}
最后讲解一个类:java.io.RandomAccessFile
public void seek(long pos)最重要
RandomAccessFile适合读写大型的文件
例如:文件分块拷贝、下载的场合
不太适合流文件(读写文本)