Java笔记–输入、输出
1,File类
File能新建,删除,重命名文件和目录,但是不能访问文件内容,访问文件本身内容需要使用输入、输出流
import java.io.File;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) throws IOException{
//以当前路径创建一个File对象
File file = new File(".");
//输出绝对路径
System.out.println(file.getAbsolutePath());
//在当前路径创建一个临时文件
File tmpFile = File.createTempFile("aaa", ".txt",file);
//退出时删除临时文件
tmpFile.deleteOnExit();
//使用当前路径创建一个新的文件
File newFile = new File("bbb.txt");
newFile.createNewFile();
//列出当前路径所有文件和路径
String[] fileList = file.list();
for(String filename : fileList) {
System.out.println(filename);
}
}
}
2,IO流基础概念
IO流按照不同的分类方式,可以将流分为三种不同的类型
1,输入流和输出流
输入输出根据程序运行所在内存的角度划分
输入流:InputStream,Reader
输出流:OutputStream,Writer
2,字节流和字符流
字节流:操作的数据单元是8位字节 InputStream OutputStream
字符流:操作的数据单元是16位字节 Reader Writer
3,字点流和处理流
字点流(低级流):可以从、向一个特定的IO设备读、写数据的流
处理流(高级流,包装流):对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能
使用处理流进行输入/输出是,程序不会直接连接到实际的数据源,没有和实际的I/O节点连接,只要使用相同的处理流,程序就可以采用完全相同的I/O代码来访问不同的数据源
什么是流
将输入输出设备抽象成管道,那么在管道中传输的就是流,管道中传输的最小介质可分为字节流和字符流,可以类比为水管和水管中的水,一个水滴可以是字节流也可以是字符流
3,字节流和字符流
字符流和字节流其实差不多,区别是操作的数据单元不一样
3.1,InputStream和Reader
int read(byte[] b):从输入流中最多读取b.length个字节的数据,并将其储存在字节数组b中,返回实际读取的字节数
InputStream的使用:
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) throws IOException{
//创建字节输入流
FileInputStream fis = new FileInputStream("FileInputStreamTest.java");
//缓存数组
//1024这个数值与文件编码有关,防止出现乱码
byte[] bbuf = new byte[1024];
//实际读取的字节数
int hasRead = 0;
while((hasRead = fis.read(bbuf))>0) {
//取出缓存数组中的字节,将字节转换成字符串输入
System.out.println(new String(bbuf,0,hasRead));
}
fis.close();
}
}
结果:控制台以字符串形式显示FileInputStreamTest.java文件中的内容
Reader的使用:I/O的正确操作–结束时关闭输入输出流
import java.io.FileReader;
public class FileReaderTest {
public static void main(String[] args) {
FileReader fr=null;
try {
//创建字符输入流
fr = new FileReader("FileReaderTest.java");
//创建长度为32的缓存数组
char[]cbuf = new char[32];
int hasRead=0;
while((hasRead = fr.read(cbuf))>0) {
System.out.print(new String(cbuf,0,hasRead));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
结果:控制台以字符串形式显示FileReaderTest.java文件中的内容
3.1,OutputStream和Writer
void write(byte/char[] buf):将字节/字符数组中的数据传输到指定的输出流中
OutputStream的使用:
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileOutputStreamTest {
public static void main(String[] args) {
try ( //创建字节输入流
FileInputStream fis = new FileInputStream("FileInputStreamTest.java");
//创建字节输出流
FileOutputStream fos = new FileOutputStream("FileOutputTest.txt");){
byte[] bbuf = new byte[32];
int hasRead = 0;
while((hasRead = fis.read(bbuf))>0) {
fos.write(bbuf,0,hasRead);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:先将FileInputStreamTest.java文件的内容读入缓存数组中,再写入FileOutputTest.txt文件中,每读一次就写入文件输出流
Writer的使用:
import java.io.FileWriter;
public class FileWriteTest {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("FileWriter.txt");){
fw.write("11111\r\n");
fw.write("22222222\r\n");
fw.write("3333333333333\r\n");
fw.write("44444444444444444\r\n");
fw.write("5555555555555555555555\r\n");
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果生成FileWriter.txt文件:
11111
22222222
3333333333333
44444444444444444
5555555555555555555555
4,输入输出体系
如果进行输入/输出的内容是文本内容,考虑使用字符流;如果进行输入/输出的内容是二进制内容,考虑使用字节流
4.1,以字符串为物理节点的字符I/O操作
String src = "123\n"+"456\n"+"789\n";
StringReader sr = new StringReader(src);
4.2,转换流
InputStreamReader:将字节输入流转换成字符输入流
OutputStreamWriter:将字节输出流转换成字符输出流
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class KeyinTest {
public static void main(String[] args) {
try (
//将System.in对象转换成Reader对象
InputStreamReader reader = new InputStreamReader(System.in);
//将普通的Reader包装成BufferedReader
BufferedReader br = new BufferedReader(reader);){
String line = null;
while((line=br.readLine())!=null) {
if(line.equals("exit")) {
System.exit(1);
}
System.out.println("输出内容为:"+line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java使用System.in代表标准输入,即键盘输入,但是这个标准输入流是InputStream类的实例,使用不方便,而且键盘输入的内容你那个是文本内容,所以可以使用InputStreamReader将其转换为字符输入流,普通的Reader读取输入内容依然不方便,可以将普通的Reader再次包装BufferedReader
4.2,重定向标准输入输出
static void setErr(PrintStream err):重定向标准错误输出流
static void setIn(InputStream in):重定向标准输入流
static void setOut(PrintStream out):重定向标准输出流
4.3,实现图片的复制
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FinalTest {
static FileInputStream fis=null;
static FileOutputStream fos=null;
public static void main(String[] args) {
//图片地址
String filePath1 = "E:\\Java\\eclipse\\work space"
+ "\\SummerTest\\copytest1\\picture.png";
//图片复制目的地
String filePath2 = "E:\\Java\\eclipse\\work space"
+ "\\SummerTest\\copytest2\\picture.png";
try {
fis = new FileInputStream(filePath1);
fos= new FileOutputStream(filePath2);
byte[] bbuf = new byte[32];
int hasRead = 0;
while((hasRead=fis.read(bbuf))>0) {
fos.write(bbuf,0,hasRead);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fos.close();
fis.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
done! 后面再补充