Java I/O

File类

File对象既可以表示文件,也可以表示目录,在一个程序中一个File

对象可以代表一个文件或目录。

File类的构造方法如下:

 

方法 说明

File(String pathname) 用指定的文件路径构造文件

 

File(String dir,String subpath) 在指定的目录下创建指定文件名的文件

dir参数指定目录历经,subpath参数指定文件名

 

File(File parent,String subpath) 根据一个文件对象和一个字文件构造文件对象

parent参数指定目录文件,subpath参数指定文件名

 

File类的常用方法如下:

方法 说明

boolean exists() 测试文件是否存在

String getAbsolutePath() 返回此对象表示的文件的绝对路径名

String getName() 返回此对象表示的文件的名称

String getParent() 返回次File对象的路径名的上一级,如果路径 名没用上一级,则返回null

boolean delete() 删除此对象指定的文件

boolean createNewFile() 创建空文件,不创建文件夹

boolean isDirectory() 测试次File对象表示的是否是目录

boolean mkdir() 创建一个目录,他的路径时名由当前File对象 指定

boolean mkdirs() 创建包括父目录的目录

使用File类操作文件和目录属性的步骤一班如下:

  1. 引入File类

import java.io.File;

  1. 构造一个文件对象

File file=new File(“test.txt”);

  1. 利用File类的方法访问文件或目录的属性,具体使用如下:
file.exists(); //判断文件或目录是否存在

file.isDirectory(); //判断是否时目录

file.isFile(); //判断是否时文件

file.getName(); //获取文件或目录的名称

file.getPath(); //获取文件或目录的路径

file.lastModified(); //获取文件或目录的最后修改日期

file.length(); //获取文件或目录的大小,单位为字节

 

 

关键代码:

public class FileMethods {

public static void main(String[] args) throws IOException {

//创建和删除文件

FileMethods fm=new FileMethods();

File f=new File("E:\\eclipse\\configuration\\.settings");

fm.create(f);

fm.delete(f);

}

public void create(File file)throws IOException{

if(!file.exists()){

file.createNewFile();

}

}

//删除文件的方法

public void delete(File file)throws IOException{

if(file.exists()){

file.delete();

}

}

}

 

流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道。

流--按流向区分:

①如果数据流入到内存,则称为输入流;InputStream和Reader作为基类

②如果从内存中输出,则称为输出流;OututStream和Write作为基类

在java.io包中,封装了许多输入/输出流的API。在程序中,这些输入/输出流类的对象称为流对象。可以通过这些流对象将内存中的数据以流的方式写入文件,也可以通过流对象将文件中的数据以流的方式读取到内存。

 

源数据源----流----读----程序

程序----写----流----目标数据源

输入流和输出流又分为字节流和字符流两种形式,如下:

1.字节输入流InputStream作为基类

①字节流: 2.字节输出流OutputStream作为基类

 

按照处理数据单元划分:

1.字符输入流Reader基类

②字符流 2.字符输出流Writer作为基类

字节流:8位通用字节流,基本单位是字节。抽象类。

字符流:16位Unicode字符。基本单位是Unicode字符。抽象类,最适合用来除了字符串和 文本。

注意:

①在操作上,字节流和字符流有一个区别,字符流在操作是使用了缓冲区,而字节流    再操作时直接操作文件,不适用缓冲区。

②所有的这些方法再出现错误时都会抛出IOException异常。

一 字节流

字节输入流(读)

    InputStream  

read()--------------一次一个

read(byte[])

read(byte[],off,len)

close()

    FileInputStream

new FileInputStream(File file)

new FileInputStream(String path)

 

字节输出流(写)

    OutputStream

write(int ch)--------------一次一个

write(byte[])-----------writte(str.getBytes())----String转换成~

write(byte[],off,len)

close()

flush():强制将缓冲区清空

    FileOutputStream

new FileOutputStream(File file)

new FileOutputStream(String path)

new FileOutputStream(String path,boolean append):可以指定覆盖或追加文件内容

 

二 字符流

字符输入流(读)

Reader

read()

read(char[])

read(char[],off,len)

close()

InputStreamReader:可以指定字符编码格式

new InputStreamReader(InputStream)

new InputStreamReader(InputStream,String charSetName)

FileReader

new FileReader(File file)

new FileReader(String path)

 

常见问题:中文乱码

原因:文件编码格式  和  程序环境的编码格式不一致

 

解决方案:

字符流去读的时候,指定字符流的编码格式

 

FileReader  无法指定编码格式,会按照文件系统默认编码格式读

System.out.println(System.getProperty("file.encoding"));

所以使用InputStreamReader

 

 

缓冲流BufferedReader

readLine()

字符输出流(写)

Writer

 

序列化和反序列化

 

序列化是将对象的状态写入到特定的流中 的过程

反序列化则是从特定的流中获取数据重新构建对象的过程

 

对象 -- 流

 

实现过程

实现serializable接口(可以拥有序列化的能力)

创建对象输出流

调用writeObject()方法将对象写入文件

关闭对象输出流

ObjectInputStream 反序列化 .readObject();

ObjectOutputStream 序列化 writeObject(Object)

 

 

常见异常

NotSerializableException 没有实现SerializableException接口,没有被序列化的能力

 

 

如果想要某一个对象状态不被序列化 则在相应属性前面加关键字 transient

(屏蔽敏感字段)

Arithmetic

 

读写文本文件:

  1. 使用字节流读写文本
  1. 使用字节流类FileInputStream读文本文件

FileInputStream称为文件输入流,是一个子类。作用是将文件中的数据输入到内部存储器(简称内存),可以利用它来读取文本文件中的数据。

导入相关的类;

import java.io.IOException;

import java.io.InputStream;

import java.io.FileInputStream

 

构造一个文件输入流对象

InputStream fileObject=new FileInputStream(“text.txt”);

//此时的文件输入流对象fileObject就和源数据源(text.txt文件)关联起来。

 

利用文件输入流类的方法读取文本文件的数据。

fileObject.available(); //可读取的字节数

fileObject.read(); //读取文件的数据

 

4). 关闭文件输入流对象。

fileObject.close();

实例:使用FileInputStream类读取文本文件的数据。

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

public class FileInputStreamTest {

public static void main(String[] args) {

//创建流对象

try {

FileInputStream fis=new FileInputStream("E:\\kb.txt");

boolean data;

System.out.println("可读取的字节数:"+fis.available());

System.out.println("文件内容为:");

while(data=fis.read()!=-1){

System.out.println(data+"");

}

//关闭流对象

fis.close();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

注意:1.read()方法返回整数,如果读取的是字符串,需要进行强制类型转换。

2.流对象使用完毕后需要关闭。

  1. .使用字节流类FileOutputStream写文本文件

FileOutputStream称为文件输出类,钥匙子类,作用是把内存中的数据输出到文件中,可以利用他把内存中的数据写入到文本文件中。

步骤:

①引入相关的类

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

②构建一个文件输出流对象

OutputStream fos=new FileOutputStream(“text.txt”);

//此时的文件输出流对象fos就和目标源数据源(text.txt文件)关联起来了。

③利用文件输出流的方法把数据写入到文本文件中

String str=”好好学习Java”;

byte[] words=str.getBytes();

//利用write方法将数据写入到文件中去

fos.write(words,0,words.length);

4).关闭文件输出流。

fos.close();

注意:

  1. 如果再创建FileOutputStream实例时,如果相应的文件并不存在,就会自动创建一个空的文件。
  2. 如果参数file或name表示的文件路径存在,但是代表一个文件目录,则会抛出FileNotFoundException类型的异常。
  3. 默认情况下,向文件写数据时将覆盖文件中原有的内容。

 

 

  1. 使用字符流读写文本文件
  1. 使用字符流类BufferedReader和FileReader读文本文件

BufferedReader和FileReader两个类都是Reader的抽象类的子类,它们可以通过字符流的方式读取文件,并使用缓冲区,提高了读文本文件的效率。

步骤:

①引入相关的类

import java.io.FileReader;

import java.io.BufferedReader;

import java.io.IOException;

②构建一个文件输出流对象

FileReader fr=new FileReader(“mytext.txt”);

BufferedReader br=new BufferedReader(fr);

③利用BufferedReader类的方法把数据写入到文本文件的数据

br.readLine();      //读取一行数据,返回字符串

//利用write方法将数据写入到文件中去

4).关闭相应的流对象

br.close();

fr.close();

  1. 使用字符流类BufferedWriter和FileWriter写文本文件

BufferedWriter和FileWriter都是字符输出流Writer抽象类的子类,他们可以通过字符流的方式并通过缓冲区把数据写入文本文件,提高了写文本文件的效率。

步骤:

①引入相关的类

import java.io.FileWriter;

import java.io.BufferedWriter;

import java.io.IOException;

②构造一个BufferedWriter对象

FileWriter fw=new FileWriter(“mytext.txt”);

BufferedWriter bw=new BufferedWriter(fw);

③利用BufferedWriter类的方法把数据写文本文件.

bw.write(“hello”)

//利用write方法将数据写入到文件中去

4).相应的流对象的清空和关闭。

bw.flush();

bw.close();

fw.close();

 


读写二进制文件

  1. 使用字节流读二进制文件

利用DataInputStream类读二进制文件,其实与利用FileInputStream类读文本文件机器相似,也要用到FileInputStream类关联二进制文件。

步骤:

①引入相关的类

import java.io.FileInputStream;

import java.io.DataInputStream;

②构造一个数据输入流对象

FileInputStream fis=new FileInputStream(“HelloWorld.class”);

DataInputStream dis=new DataInputStream(fis);

③利用数据输入流类的方法读取二进制文件中的数据.

dis.readInt(); //读取出来的是整数

dis.readByte(); //读取出来的数据时Byte类型

4).关闭数据输入流。

dis.close(); //关闭数据输入流

 

  1. 使用字节流写二进制文件

利用DataOutputStream类读二进制文件,其实与利用FileOutputStream类读文本文件机器相似,也要用到FileOutputStream类关联二进制文件。

步骤:

①引入相关的类

import java.io.FileOutputStream;

import java.io.DataOutputStream;

②构造一个数据输出流对象

FileOutputStream fis=new FileOutputStream(“temp.class”);

DataOutputStream dis=new DataOutputStream(fis);

③利用数据输出流类的方法把数据写入二进制文件。

ou.write(1); //把数据写入二进制

4).关闭数据输入流。

dis.close(); //关闭数据输入流


重定向标准I/O

Java提供的有两个标准输入/输出流:System.in和System.out;

System.in常见方法如下:

int read(); 此方法从键盘接受一个字节的数据,返回值是该字符的ASCII码。

int read(byte []buf); 此方法从键盘接受多个字节的数据,保存到buf中,返回值是接 收字节数据的个数,非ASCII码。

System.out常见方法如下:

print(); 向屏幕输出数据,不换行,参数可以是Java的而任意数据类型。

printIn();  想屏幕输出数据,换行,参数可以是Java的而任意数据类型。

 

3个重定向标准I/O的方法

方法 说明

static void setErr(PrintStream err) 重定向标准错误输出流

Static void setIn(InputStream in) 重定向标准定向流

static void setOut(PrintStreeam out) 重定向标准输出流

序列化:

  1. 创建一个对象输出流(ObjectOutputStream),他可以包装一个其他类型的输出流,如文件输出流FileOutputStream.

例子:

ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(“C:\\myDoc\\stu.txt”))
  1. 通过对象输出流的writeObject()方法写对象,也就是输出可序列化对象。

 

 

反序列化:

  1. 创建一个对象输入流(ObjectInputStream),他可以包装一个其他类型的输出流,如文件输入流FileInputStream.

例子:

ObjectInputStream oos = new ObjectInputStream(new FileInputStream(“C:\\myDoc\\stu.txt”))
  1. 通过对象输入流的writeObject()方法写对象,该方法返回一个Object类型的对象,如果程序知道该Java对象的类型,则可以将该对象强制转换成其真实的类型。

序列的算法规则:

  1. 所有保存到磁盘中的对象都有一个序列号;
  2. 当程序试图序列化一个对象时,将会检查是否已经被序列化,只有序列化后的对象才能被转换成字节序列输出;
  3. 如果对象已经被序列化,则程序直接输出一个序列化编号,而不再重新序列化。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值