是什么
I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
File类的使用
File类的使用
文件和文件目录路径的抽象表示形式。File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。File对象可以作为参数传递给流的构造器
构造方法
方法 | 含义 |
---|---|
public File(String pathname); | 以pathname为路径创建File对象,可以是绝对路径或者相对路径 |
路径分隔符
路径中的每级目录之间用一个路径分隔符隔开。
- windows和DOS系统默认使用“\”来表示
- UNIX和URL使用“/”来表示
使用File.separator;动态的提供分隔符
常用方法
方法 | 含义 |
---|---|
getAbsolutePath(); | 获取绝对路径 |
getPath() ; | 获取路径 |
getParent(); | 获取上层文件目录路径 |
length() ; | 获取文件长度(即字节数) |
list() ; | 获取指定目录下的所有文件或者文件目录的名称数组 |
listFiles(); | 获取指定目录下的所有文件或者文件目录的File数组 |
isDirectory(); | 判断是否是文件目录 |
isFile(); | 判断是否是文件 |
exists(); | 判断是否存在 |
createNewFile(); | 创建文件 |
mkdir(); | 创建文件目录,上层目录不存在,也不创建 |
mkdirs(); | 创建文件目录,如果上层文件目录不存在,一并创建 |
delete(); | 删除文件或者文件夹 |
IO流使用
字节流
字节流操作字节,比如:.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt
字节流
简单复制文件,实现开发不用这种
@Test
public void Test1(){
File file = new File("C:/work/TestIoCopy.txt");
try(FileOutputStream outputStream = new FileOutputStream(file);
FileInputStream inputStream = new FileInputStream("C:/work/TestIo.txt")) {
file.createNewFile();
int len = 0;
while ((len = inputStream.read()) != -1) {
outputStream.write(len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
自写缓冲区的字节流
有一个缓冲区会快很多
@Test
public void Test2(){
File file = new File("C:/work/TestIoCopy.txt");
try(FileOutputStream outputStream = new FileOutputStream(file);
FileInputStream inputStream = new FileInputStream("C:/work/TestIo.txt")) {
byte[] buffer=new byte[1024];
file.createNewFile();
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
字符流
字符流操作字符,只能操作普通文本文件。最常见的文本文件:.txt,.java,.c,.cpp 等语言的源代码。
自写缓冲区的字符流
@Test
public void test3(){
try(FileReader reader = new FileReader("C:/work/TestIoread.txt");
//true表示不覆盖文件,即可以续写
FileWriter writer = new FileWriter("C:/work/TestIoread.txt",true);) {
char[] buf = new char[1024];
int len = 0;
while ((len=reader.read(buf))!=-1){
String s = new String(buf,0,len);
System.out.println(s);
}
writer.write("啊啊啊");
}catch (Exception e){
e.printStackTrace();
}
}
缓冲流
Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。
缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:
- BufferedInputStream 和 BufferedOutputStream
- BufferedReader 和 BufferedWriter
字节缓冲流
@Test
public void test4(){
try(FileInputStream inputStream = new FileInputStream("C:/work/work2.zip");
BufferedInputStream bufferIn = new BufferedInputStream(inputStream);
FileOutputStream outputStream = new FileOutputStream("C:/work/workTest.zip");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);) {
byte[] bytes = new byte[1024];
int len = 0;
while ((len = bufferIn.read(bytes))!=-1){
bufferedOutputStream.write(bytes, 0, len);
}
}catch (Exception e){
e.printStackTrace();
}
}
字符缓冲流
@Test
public void test5(){
try(FileReader reader = new FileReader("C:/work/TestIoread.txt");
BufferedReader bufferedReader = new BufferedReader(reader);
FileWriter writer = new FileWriter("C:/work/TestIoread.txt",true);
BufferedWriter bufferedWriter = new BufferedWriter(writer);) {
char[] chars = new char[1024];
int len = 0;
while ((len = bufferedReader.read(chars))!=-1){
bufferedWriter.write(chars, 0, len);
bufferedWriter.write("复制文本追加".toCharArray());
}
}catch (Exception e){
e.printStackTrace();
}
}
转换流
转换流提供了在字节流和字符流之间的转换。很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能
- InputStreamReader:将InputStream转换为Reader
- OutputStreamWriter:将Writer转换为OutputStream
转换流
这里我用gbk进行读取,utf-8进行写入,实现了乱码操作
@Test
public void test6(){
try(FileInputStream inputStream = new FileInputStream("C:/work/TestIoread.txt");
InputStreamReader streamReader = new InputStreamReader(inputStream, "gbk");
FileOutputStream outputStream = new FileOutputStream("C:/work/TestIoread2.txt");
OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream,"utf-8");) {
char[] chars = new char[1024];
int len = 0;
while ((len=streamReader.read(chars))!=-1){
streamWriter.write(chars,0,len);
}
}catch (Exception e){
e.printStackTrace();
}
}
打印流
PrintStream和PrintWriter 适用于文本输出
打印流
这里我用了自动刷新
@Test
public void test7(){
try(PrintStream ps = new PrintStream(new FileOutputStream("C:/work/TestIoread3.txt"),true);
PrintWriter pw = new PrintWriter(new FileOutputStream("C:/work/TestIoread4.txt"),true)) {
ps.print("我是你爹");
pw.println("来吧展示");
}catch (Exception e){
e.printStackTrace();
}
}
对象流
若某个类实现了 Serializable 接口,对该类的对象进行序列化
ObjectOutputStream
@Test
public void test8(){
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:/work/data1.txt"));
) {
oos.writeObject(new Dog("旺财", 123));
}catch (Exception e){
e.printStackTrace();
}
}
ObjectInputStream
@Test
public void test9(){
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:/work/data1.txt"));) {
Dog dog = (Dog) ois.readObject();
System.out.print(dog.toString());
}catch (Exception e){
e.printStackTrace();
}
}
随机流
支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件
RandomAccessFile 类