在变量,数组和对象中储存数据是暂时储存在的,程序结束后它们就会消失。想要永久的储存程序创建的数据,就需要将其保存在磁盘文件中,而中只有数据储存起来才可以在其他程序中使用它们java的I/O技术可以将数据保存起来到文本文件中,二进制文件甚至是ZIP压缩文件,以达到永久性保存数据的要求 掌握I/O处理技术能够提高对数据的处理能力
15.1输入/输出流
流是一组有序的数据,根据操作的类型,可分为输入流和输出流两种,I/O(Input/Output。输入。输出)流提供了一条通道程序 可以使用这条通道把园中的字节序列送到目的地,虽然I/O流通常与磁盘文件存取有关,但程序的源和目的地也可以是键盘,鼠标,内存或者显示器窗口等
输入流
InputStream类字节输入流的抽象类,它是所有字节输入流的父类 (主要内容就不一一叙述)
输出流
OutputStream类是字节输出流的抽象类,此抽象类是表示输出的字节流的所有类的超类
15.2File类
File类是java.io包中唯一代表磁盘文件本身的累 。File累定义了一些平台无关的方法来操作文件可以通过调用File类中的方法来实现创建 删除 重命名等等操作File累的对象最主要用来获取文件本省的一些信息 如文件所在的目录 文件长度 文件读写权限,数据流可以将数据写入文件中 文件也是数据流最常用的数据媒体
文件删除和创建
File类创建文件对象。通常有三种方法
第一种如下
File(String pathname)
//构造方法通过系该给定的路径名字符串为抽象路径名来创建一个新的File实例
new File(String pathname)
//其中,pathname代表路径名称
File flie =new File("D:\\word.txt");
//其中"D:\\word.txt"就是代表路径
第二种如下
File(String parent ,String child)
//该构造方法根据定义的父路径和子路径字符串(包括文件名)创建一个新的File对象
new File (String parent,String chile)
//new File(String parent ,String child)
D:\\word.txt
parent: 父路径字符串 :ps记录
child:子路径字符串 :ps第二次作业
第三种如下
File (File f,String child)
//该构造方法根据f抽象路径名和child路径名字符串创建一个新的File实例
new File (File f,String child)
//f :父路径对象如 D:/doc/。
//child:子路径字符串,如letter.txt。
File类创建一个文件对象后 例如
File file=new File("D:\\word.txt");
package 第十五章;
import java.io.File;
public class FileTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// \\一个斜杠的话就是要开始转义 俩个就是位置
// TODO 自动生成的方法存根
File file=new File("D:\\word.txt"); //创建文件对象
if(file.exists()) { //判断文件是否存在该如果不存在就跳到else循环
file.delete(); //将文件删除
System.out.println("文件已删除");
}else { //如果文件不存在
try { //try语句块捕捉可能出现的异常
file.createNewFile(); //创建该文件
System.out.print("文件已创建");
}catch(Exception e){
e.printStackTrace();
}
}
}
}
File类提供了很多方法获取文件本身信息如下
方法 返回值 说明
getName() String 获取文件的名称
canRead() boolean 判断文件是否为可读的
canWrite() boolean 判断文件是否可被写入
exits() boolean 判断文件是否存在
length() long 获取文件的长度(以字节为单位)
getAbsolutePath() String 获取文件的绝对路径
getParent() String 获取文件的父路径
isFile() boolean 判断抽象路径名表示的文件是否为一个标准
isDirectory() boolean 判断文件是否为一个目录
isHidden() boolean 判断文件是否为隐藏目录
lastModified() long 获取文件最后的修改时间
package 第十五章;
import java.io.File;
public class FileTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file=new File("D:\\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("该文件是隐藏文件吗?:"+length);
}else { //如果文件不存在
System.out.print("文件已创建"); //输出信息
}
}
}
代码如下
package 第十五章;
import java.io.File;
public class FileTest3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("C:\\Users\\afuuu\\Pictures\\Screenshots\\java截图");//获取路径
printAllFiles(file);
}
private static void printAllFiles(File file) {
File[]files = file.listFiles();//把路径内的数据 储存在File数组中
for (File f : files) {//for循环循环输出 File中的数据
if(f.isDirectory()) {//判断是否为文件 是的话就输出 不是的话就跳到else循环
System.out.println("-------- " + f.getName() +"--------------");
printAllFiles(f);
}else {
System.out.println(f.getName());
}
}
}
}
程序运行期间,大部分数据都在内存中进行操作,当程序结束或者关闭时,这些数据将消失,如果需要将数据永久保存, 就可以使用到输入输出流与指定的文件建立连接,当需要的数据永久保存到文件中就需要使用
package 第十五章;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStreamDemo {
public static void main(String[] args) throws IOException {
//字节流FileInputStream输入 FileOutputStream输出
File file =new File("D:\\word.txt");
FileOutputStream out = new FileOutputStream(file);
byte[] b1 = "hello world".getBytes();
out.write(b1);
out.close();
FileInputStream in = new FileInputStream(file);
byte [] b2 =new byte [1024];
int len =in.read(b2);
System.out.print(new String(b2,0,len));
in.close();
}
}
代码图:
其中呢 分别是有输入流和输出流 先是写了一个输出流 向指定位置的文件中传入了 hello world 使用getByte方法 将 hello word传到数组中 然后使用write()来输出信息
再是输入流还是一样获取指定位置 然后使用数组来储存获取指定位置的内容 然后使用 int len =in.read(b2)来获取文件中的内容
运行结果中只有 hello world是因为输出是在文件夹中才能看到 输入流的话在控制台中就能够看到的
每次运行完都是要使用 close来关闭
15.3.2 FlieReader和 FileWriter类
代码如下:
package 第十五章;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
// 字符流 FileReader输入流 FileWriter输出流
File file =new File("D:\\word.txt");
FileWriter writer = new FileWriter(file);
//char[] c1 = new char[]{'h','e','l','l','o'};
//带缓存的字符流 BufferedReader 输入 BufferedWriter输出
BufferedWriter bw = new BufferedWriter (writer);
bw.write("门前大桥下 游过一群鸭");
bw.newLine();
bw.write("快来快来数一数 二四六七八");
bw.newLine();
bw.write("咕嘎咕嘎 真呀真多呀");
bw.newLine();
bw.write("数不清到底多少呀");
bw.close();
writer.close();
//带缓存的字符流 BufferedReader 输入 BufferedWriter输出
FileReader reader = new FileReader(file);
//char [] c2 =new char [1024];
//int len =reader.read(c2);
//System.out.print(new String(c2,0,len));
BufferedReader br = new BufferedReader(reader);
String s = br.readLine();
System.out.println("第一行内容:"+s);//输出
System.out.println("第一行内容:"+br.readLine());
System.out.println("第一行内容:"+br.readLine());
System.out.println("第一行内容:"+br.readLine());
br.close();
reader.close();
}
}
代码图如下:
15.5数据输入/输出
数据输入/输出()DataInputStream输入 DataOutputStream输出允许应用程序以与机器无关的方式从底层输入流中读取基本java数据类型 也就是说 当读取一个数据时,不必在关心这个数值因是哪个字节DataInputStream输入 DataOutputStream输出的构造方法和使用方法如下:
DataInputStream(InputStream in):使用指定的基础InputStream对象创建一个DataInputStream对象
DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流
这个数据输入输出好处是 可以指定输入输出指定的数据类 但是不好的地方也是 输出的东西输出到文件中是乱码 代码如下
package 第十五章;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class DatastreamDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file =new File ("D:\\word.txt");
//DataInputStream输入 DataOutputStream输出
FileOutputStream fos=new FileOutputStream(file);
DataOutputStream dos=new DataOutputStream(fos);
dos.writeBoolean(false);
dos.writeUTF("今天又在下雨");
dos.writeFloat(2.58f);
dos.close();
fos.close();
FileInputStream fis = new FileInputStream (file);
DataInputStream dis = new DataInputStream(fis);
System.out.println(dis.readBoolean());
System.out.println(dis.readUTF());
System.out.println(dis.readFloat());
dis.close();
fis.close();
}
}