【Java基础篇】Java IO篇
1. File类
用来将文件或者文件夹路径封装成对象,方便对文件与文件夹进行操作。File
对象可以作为参数传递给流的构造函数。
1.1 File类常见方法:
创建。
- boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
- boolean mkdir():创建文件夹。
- boolean mkdirs():创建多级文件夹。
删除
- boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回false。
- void deleteOnExit();在程序退出时删除指定文件。
判断。
- boolean exists() :文件是否存在.
- isFile():
- isDirectory();
- isHidden();
- isHidden();
获取信息。
- getName():
- getPath():
- getParent():
- getAbsolutePath()
- long lastModified()
- long length()
1.2 递归
- 函数自己调用自己。
- 注意:递归时一定要明确结束条件。
- 应用场景:
- 当某一功能要重复使用时。
2. Properties
Properties
是Hashtable
的子类,也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。是集合中和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。那么在加载数据时,需要数据有固定格式:键=值。
3. 打印流
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
3.1 字节打印流PrintStream
构造函数可以接收的参数类型:
- file对象。File
- 字符串路径。String
- 字节输出流。OutputStream
3.2 字符打印流PrintWriter
构造函数可以接收的参数类型:
- file对象。File
- 字符串路径。String
- 字节输出流。OutputStream
- 字符输出流,Writer。
4. 对象序列化
4.1 ObjectOutputStream
可以将实现了Serializable
的接口的对象转成字节写出到流中
4.2 ObjectInputStream
可以从流中读取一个ObjectOutputStream
流写出的对象
5. 管道流
PipedInputStream
:管道输入流,可以从管道输出流中读取数据
PipedOutputStream
:管道输出流,可以向管道输入流中写出数据
在建立管道输出流时可以在构造方法中将管道输入流传入,或者用connect()方法将输入输出流接上,
建议:输出与输入在两个不同的线程进行操作
6. 随机读写 RandomAccessFile
该类不是算是IO体系中子类。而是直接继承自Object。
7. 操作基本数据类型的流
DataInputStream
、DataOutputStream
,可以按照基本数据类型占用空间大小读写数据
8. 操作字节数组的流
ByteArrayOutputStream
: 写出到字节数组(内存)中,可以获取写出的内容装入一个字节数组。通常我们用这个流来缓冲数据。ByteArrayInputStream
:可以从一个字节数组中读取字节CharArrayWriter
:写出字符到字符数组(内存)中,可以获取写出的内容装入一个字符数组。CharArrayReader
:可以从一个字符数组中读取字符。
用于操作字节数组的流对象。
ByteArrayInputStream
:在构造的时候,需要接收数据源,。而且数据源是一个字节数组。ByteArrayOutputStream
: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。
/*字节数组输入流 ByteArrayInputStream
*
*
* */
public class Demo5 {
public static void main(String[] args) throws IOException {
byte[] bytes = "hello world!".getBytes();
InputStream byteArrayInputStream = new ByteArrayInputStream(bytes); //发生多态 继承,重写,父类的引用指向子类
byte[] bytes1 = new byte[1024];
int temp;
while((temp=byteArrayInputStream.read(bytes1,0,bytes1.length))!=-1){
String str = new String(bytes1,0,temp);
System.out.println(str);
}
}
}
/*字节数组输出流 ByteArrayOutpurStream
*
*
* */
public class Demo6 {
public static void main(String[] args) throws IOException {
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();//创建一个新的 byte 数组输出流。
byte[] data="hello world!世界".getBytes();
arrayOutputStream.write(data);
byte[] bytes = arrayOutputStream.toByteArray();
System.out.println(bytes.length+"----"+new String(bytes));
byte[] s = new String("世界你好").getBytes();
System.out.println(s.length+"---"+new String(s));
}
}
9. 字符编码
9.1 码表
ASCII
:英文码表,每个字符占1个字节。A是65,a是97
GB2312
:兼容ASCII,包含中文,每个英文占1个字节(正数),中文占2个字节(2个负数)。
GBK
:兼容GB2312,包含更多中文,每个英文占1个字节(正数),中文占2个字节(第一个负数、第二个可正可负)。
Unicode
:国际码表,每个字符占2个字节。Java中存储字符类型就是使用的Unicode编码。
UTF-8
:国际码表,英文占1个字节,中文占3个字节。
java提供了StandardCharsets类