java文件io

本文深入探讨Java中的IO操作,包括File类、RandomAccessFile、InputStream、OutputStream、Reader、Writer等类的使用方法,以及如何进行文件读写、对象序列化。同时介绍了如何通过String类的getBytes()方法进行字符编码转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.构造方法可以用来生成 File 对象:
File(String directoryPath)
这里,directoryPath 是文件的路径名。
File 定义了很多获取 File 对象标准属性的方法。例如:getName( )用于返回文件
名,getParent( )返回父目录名,exists( )方法在文件存在的情况下返回 true,反之返回false。然而 File 类是不对称的,意思是虽然存在可以验证一个简单文件对象属性的很多方法,但是没有相应的方法来改变这些属性.


2.RandomAccessFile 可以以只读或读写方式打开文件, 具体使用哪种方式取决于用户创建 RandomAccessFile 类对象的构造方
法:
new RandomAccessFile(f,"rw"); //  读写方式
new RandomAccessFile(f,"r"); //  只读方式
注意:
当程序需要以读写的方式打开一个文件时,如果这个文件不存在,程序会自动创建此文件。


3.String.substring(int beginIndex,int endIndex)方法可以用于取出一个字符串中的部分子字符串,但要注意的一个细节是:子字符串中的第一个字符对应的是原字符串中的脚标为 beginIndex 处的字符,但最后的字符对应的是原字符串中的脚标endIndex-1 处的字符,而不是 endIndex 处的字符。


4.流类
Java 的流式输入/输出建立在四个抽象类的基础上:InputStream, OutputStream,
Reader 和 Writer。它们用来创建具体流式子类。尽管程序通过具体子类执行输入/输出
操作,但顶层的类定义了所有流类的基本通用功能。
InputStream 和 OutputStream 设计成字节流类。Reader 和 Writer 为字符流设计。
字节流类和字符流类形成分离的层次结构。一般说来,处理字符或字符串时应使用字
符流类,处理字节或二进制对象时应用字节流类。
一般在操作文件流时,不管是字节流还是字符流都可以按照以下的方式进行:
(1) 使用 File  类找到一个文件
(2) 通过 File  类的对象去实例化字节流或字符流的子类
(3) 进行字节(字符)的读、写操作
(4) 关闭文件流




5.FileInputStream(文件输入流)
FileInputStream 类创建一个能从文件读取字节的InputStream 类, 它的两个常用的
构造方法如下:
FileInputStream(String filepath)
FileInputStream(File fileObj)
这两个构造方法都能引发FileNotFoundException异常。这里,filepath 是文件的绝
对路径,fileObj是描述该文件的File对象。




6.FileOutputStream(文件输出流)
FileOutputStream 创建了一个可以向文件写入字节的类 OutputStream,它常用的构造方法如下:
FileOutputStream(String filePath)
FileOutputStream(File fileObj)
FileOutputStream(String filePath, boolean append)
它们可以引发 IOException 或 SecurityException 异常。这里 filePath 是文件的绝对路径,fileObj 是描述该文件的 File 对象。如果 append 为 true,文件则以设置搜索路径模式打开。FileOutputStream 的创建不依赖于文件是否存在在创建对象时,
FileOutputStream 会在打开输出文件之前就创建它。 这种情况下如果试图打开一个只读文件,会引发一个 IOException 异常。


7.System.in 和 System.out
为了支持标准输入输出设备,Java 定义了两个特殊的流对象:System.in 和
System.out。System.in 对应键盘,是 InputStream 类型的,程序使用 System.in 可以读
取从键盘上输入的数据;System.out 对应显示器,是 PrintStream 类型的,PrintStream
是 OutputStream 的一个子类,程序使用 System.out 可以将数据输出到显示器上。键盘
可以被当作一个特殊的输入流,显示器可以被当作一个特殊的输出流。


8.InputStreamReader 和 OutputStreamWriter, 这两个类是字节流和字符流之间转换的类,InputStreamReader 可以将一个字节流中的字节解码成字符,OuputStreamWriter 将写入的字符编码成字节后写入一个字节流。
InputStreamReader  有两个主要的构造函数:
InputStreamReader(InputStream in)
// 用默认字符集创建一个 InputStreamReader 对象
InputStreamReader(InputStream in,String CharsetName)
// 接受已指定字符集名的字符串,并用该字符集创建对象
OutputStreamWriter  也有对应的两个主要的构造函数:
OutputStreamWriter(OutputStream in)
// 用默认字符集创建一个 OutputStreamWriter 对象
OutputStreamWriter(OutputStream in,String CharsetNarme)
// 接受已指定字符集名的字符串,并用该字符集创建 OutputStreamWriter 对象
为了达到最高的效率,避免频繁地进行字符与字节间的相互转换,最好不要直接
使用这两个类来进行读写,应尽量使用 BufferedWriter 类包装 OutputStreamWriter 类,用 BufferedReader 类包装 InputStreamReader 类。例如:
BufferedWriter out=new BufferedWriter(newOutputStreamWriter(System.out));
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
接着从一个实际的应用中来了解 InputStreamReader 的作用, 怎样用一种简单的方
式一下子就读取到键盘上输入的一整行字符呢?只要用下面的两行程序代码就可以
解决这个问题:
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String strLine = in.readLine();
可见,构建 BufferedReader 对象时,必须传递一个 Reader 类型的对象作为参数,
而键盘对应的 System.in 是一个 InputStream 类型的对象,所以这里需要用到一个
InputStreamReader 的转换类, 将 System.in 转换成字符流之后, 放入到字符流缓冲区之中,之后从缓冲区中每次读入一行数据。
【 格式 10-1 由键盘输入数据基本形式 】
import java.io.*;
public class class_name  // 类名
{
public static void main(String args[]) throws IOException
{
BufferedReader buf;  // 声明 buf 为 BufferedReader 类的变量
String str;  // 声明 str 为 String 类型的变量
... ...
buf=new BufferedReader(new InputStreamReader(System.in));
str=buf.readLine();  // 读入字符串至 buf
... ...
}
}


9.使用 String 类中的 get Bytes()方法,为字符进行编码转换。
例:
 // 在这里将字符串通过 getBytes()方法,编码成 GB2312
byte b[] = "大家一起来学 Java 语言".getBytes("GB2312") ;




10.对象序列化
所谓的对象序列化(在某些书中也叫串行化) ,是指将对象转换成二进制数据流
的一种实现手段,通过将对象序列化,可以方便的实现对象的传输及保存。
在 Java 中提供了 ObjectlnputStream 与 ObjectOutputStream 这两个类用于序列化对
象的操作。这两个类是用于存储和读取对象的输入输出流类,不难想象,只要把对象
中的所有成员变量都存储起来,就等于保存了这个对象,之后从保存的对象之中再将
对象读取进来就可以继续使用此对象。ObjectInputStream 与 ObjectOutputStream 类,可以帮开发者完成保存和读取对象成员变量取值的过程,但要求读写或存储的对象必
须实现了 Serializable 接口, 但 Serializable 接口中没有定义任何方法, 仅仅被用作一种标记,以被编译器作特殊处理.


11.如果不希望类中的属性被序列化,可以在声明属性之前
加上 transient 关键字。如下所示,下面的代码修改自前面所用到的 Person.java 程序,
在声明属性时,前面多加了一个 transient 关键字。
04  private transient String name ;
05  private transient int age ;
再此运行 SerializableDemo.java 程序时,其输出结果为:
姓名:null ,年龄:0
由输出结果可以发现,Person 类中的两个属性并没有被保存下来,输出时,是直
接输出了其默认值。


12.
1、 Java 中要进行 IO 操作,需要导入 java.io 包。
2、 Java 中的 File 类是唯一操作磁盘文件的类。
3、 Java 中的数据操作主要分为两种:
(1) 、 字节流(OutputStrea、InputStream)
(2) 、 字符流(Writer、Reader)
这四个类都是抽象类,使用时,都必须依靠其子类实例化。
4、 Java 定义了两个特殊的流对象:System.in 和 System.out。System.in 对应键盘,是
InputStream 类型的, 程序使用 System.in 可以读取从键盘上输入的数据;System.out
对应显示器,可以向显示器上输出内容。
5、 InputStreamReader 和 OutputStreamWriter, 这两个类是字节流和字符流之间转换的
类, InputStreamReader 可以将一个字节流中的字节解码成字符, OuputStreamWriter
将写入的字符编码成字节后写入一个字节流。
6、 一个类实现了 Serializable 接口之后,此类的对象可以被序列化,就表示可以保存
在文件之中、或网络传输之中。如果不希望类中的某个属性被保存下来,可以用
transient 关键字声明属性。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值