在程序中运行的数据,一旦程序关闭后,数据就会丢失,所以需要用持久化的方式把数据保存起来。
通常会把数据保存在文件中,然后放到硬盘、U盘等磁盘中去。然后就可以通过流把文件中的数据传到程序中来,再把程序中的数据传到文件中去。
在程序中,我们通过java.io包中的File类来对文件的属性进行访问操作。可以通过创建File类的对象,把文件的路径传进来,就可以通过文件对象的各种方法来操作文件或目录的属性(包括路径、权限、日期和时间等)了。
File file=new File(String pathname);
创建File文件对象的构造方法中,可以放入文件或目录的路径,如“c:\test.txt”或"c:/test.txt".
File类中操作文件属性的常用方法如下:
返回值类型 | 方法名 | 说明 |
---|---|---|
boolean | exists() | 判断文件或目录是否存在 |
boolean | isFile() | 判断是否是文件 |
boolean | isDirectory() | 判断是否是目录 |
String | getPath() | 返回此对象表示的文件的相对路径名 |
String | getAbsolutePath() | 返回此对象表示的文件的绝对路径名 |
String | getName() | 返回此对象表示的文件或目录的名称 |
boolean | delete() | 删除此对象指定的文件或目录 |
boolean | createNewFile() | 创建名称的空文件,不创建文件夹 |
long | length() | 返回文件的长度,单位为字节,如果文件不存在,则返回0L |
public static void main(String[] args) { File file =new File("test.txt"); System.out.println("文件是否存在"+file.exists()); System.out.println("是否是文件"+file.isFile()); System.out.println("是否是目录"+file.isDirectory()); System.out.println("此文件的相对路径名:"+file.getPath()); System.out.println("此文件的绝对路径名:"+file.getAbsolutePath()); System.out.println("此文件的文件名是:"+file.getName()); System.out.println("此文件的长度为:"+file.length()); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } file.delete(); }
流是一组有序的数据序列,它是以先进先出的方式发送信息的通道,程序通过流来读写文件。
Java中的流可以根据流向来分类,分为:
(1)输入流。(以InputStream类和Reader类作为基类)
(2)输出流。(以OutputStream类和Writer类作为基类)
注意:这里的输入输出是相对计算机内存而言。
按处理数据单元划分,流可以分为:
(1)字节流
字节流是8位通用字节流。(1字节=8位)
其中可以细分为:
1.字节输入流。(以InputStream类作为基类)
2.字节输出流。(以OutputStream类作为基类)
(2)字符流
字符流是16位Unicode字符流。(1字符=2字节)
其中可以细分为:
1.字符输入流。(以Reader类作为基类)
2.字符输出流。(以Writer类作为基类)
InputStream类是一个抽象类,常用方法如下:
返回值类型 | 方法名 | 说明 |
---|---|---|
int | read() | 把数据源的数据一个字节一个字节读进来,以一个整数返回(返回字节对应的整数) |
int | read(byte[] b) | 从输入流读取若干字节,把这些字节保存在数组b中,返回的是读取到的字节数,如果读到末尾,则返回-1 |
int | read(byte[]b,int off,int len) | 从输入流读取若干字节,把这些字节保存到数组b中,off指的是字节数组开始保存数据的起始下标,len指读取的字节数目,返回的是实际读取到的字节数,如果读到了末尾,则返回-1 |
void | close() | 关闭流 |
int | available() | 可以从输入流中读取的字节数目 |
因为抽象类无法实例化对象,所以实际我们使用的是它的一个子类FileInputStream类
是InputStream的子类,常用的构造方法有:
(1)FileInputStream(File file); 传输文件
(2)FileInputStream(String name); 传文件路径
用FileInputStream类读文本文件的步骤如下:
(1)引入相关的类,即导包
import java.io.*;
(2)构造文件输入流FileInputStream对象
InputStream is =new FileInputStream(”xxx.txt“);
(3)读取文本文件的数据
即调用FileInputStream类的read()方法
is.read()
(4)关闭文件流对象
is.close()
public static void main(String[] args) { InputStream is =null; try { is =new FileInputStream("我的青春我做主.txt"); int read =-1; // byte[] b =new byte[1024]; // while( (read=is.read(b))!=-1 ) { // for(int i=0;i<read;i++) { // System.out.print((char)b[i]); // } // } while((read=is.read())!=-1) { System.out.print((char)read); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } }
OutputStream类是一个抽象类,常用方法如下:
返回值类型 | 方法名 | 说明 |
---|---|---|
void | write(int c) | 把字节对应的数字通过输出流写到目标文件中 |
void | write(byte[]b) | 把数组b中的字节数据写到文件中去 |
void | write(byte[]b,int off,int len) | 把数组b中的字节数据写到文件中去,off表示数组开始写的位置,len表示写多少个字节 |
void | close() | 关闭流 |
void | flush() | 强制把缓冲区的数据写到输出流中 |
因为抽象类无法实例化对象,所以实际我们使用的是它的一个子类FileIOutputStream类
是OutputStream类的子类,常用构造方法如下:
(1)FileOutputStream(File file); 写到某个文件,会覆盖文件原有内容
(2)FileOutputStream(String name); 写到某个路径,会覆盖文件原有内容
(3)FileOutputStream(String name,boolean append); 写到某个路径,布尔值为true时,可以指定不覆盖文件原有内容,而是在后面追加新内容
使用FileOutputStream类写文本文件的步骤:
(1)引入相关的类,即导包
import java.io.*;
(2)构造文件输出流FileOutputStream对象
OutputStream os =new FileOutputStream(”xxx.txt“);
(3)把数据写入文本文件
即调用FileOutputStream类的write()方法
os.write(byte[]b)
(4)关闭文件流对象
os.close()
public static void main(String[] args) { OutputStream os =null; try { os =new FileOutputStream("szxs.txt",true); String msg = "您好呀,信狮教育"; byte[] b =msg.getBytes(); os.write(b); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } }