JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
字节流
概述
OutputStream(字节输出流)
java.io.OutputStream
此抽象类是表示输出字节流的所有的超类,里边定义了所有字节输出流共性的成员方法
void write(int b)
写一个字节void write(byte[] b)
写一个字节数组void write(byte[] b, int off, int len)
写字节数组的一部分,off数组的开始索引,len写的字节个数void flush()
刷新此输出流并强制写出任何缓冲的输出字节。void close()
关闭此输出流并释放与此流关联的所有系统资源。
FileOutputStream
java.io.FileOutputStream extends OutputStream(文件字节输出流)
FileOutputStream的构造方法:
FileOutputStream(File file)
创建文件输出流以写入由指定的 File对象表示的文件
FileOutputStream(String name)
创建文件输出流以写入具有指定名称的文件
参数:输出的目的地
- String name:目的地是一个文件的路径
- File file:目的地是一个文件
FileOutputStream的构造方法的作用:
- 会根据参数传递的目的地,创建一个文件。如果文件存在,则会覆盖
- 会创建一个FileOutputStream对象
- 会把FileOutputStream对象指向创建好的文件
写入数据到文件底层原理
java程序-->JVM-->操作系统(os)-->调用系统的方法-->把数据写入到目的地
字节输出流的使用步骤:
- 创建FileOutputStream对象,构造方法中绑定输出的目的地
- 使用FileOutputStream对象中的方法write,把数据写入到目的地中去
- 释放资源
注意:若找不到文件路径,则会出现异常java.io.FileNotFoundException: w:day09\1.txt (系统找不到指定的路径。)
示例: void write(int b)
写一个字节
public class Demo01 {
public static void main(String[] args) throws IOException {
//1.创建FileOutputStream对象,构造方法中绑定输出的目的地
FileOutputStream fos = new FileOutputStream("day09\\1.txt");
//2.使用FileOutputStream对象中的方法write,把数据写入到目的地中去
fos.write(97);
//3.释放资源
fos.close();
}
}
结果:记事本中显示的数据为a
为什么写入文件之后,记事本中会出现a?
示例:字节输出流中写多个字节的方法
void write(byte[] b)
写一个字节数组
void write(byte[] b, int off, int len)
写字节数组的一部分,off数组的开始索引,len写的字节个数
public class Demo02 {
public static void main(String[] args) throws IOException {
//1.创建FileOutputStream对象,构造方法中绑定输出的目的地
FileOutputStream fos = new FileOutputStream(new File("day09\\2.txt"));
// 2.使用FileOutputStream对象中的方法write,把数据写入到目的地中去
//面试题:在文件中显示100
//fos.write(100);//d
fos.write(49);//1
fos.write(48);//0
fos.write(48);//0
/*
void write(byte[] b) 写一个字节数组
了解:
写多个字节的时候,第一个字节是整数,那么查询文件的时候,会查询ASCII表
写多个字节的时候,第一个字节是负数,那么第一个字节会和第二个字节/第二个字节或者第二三个字节组成一个中文
那么查询文件的时候,会查询系统码表(GBK)
*/
byte[] bytes = {65,66,67,68,69};//ABCDE
//byte[] bytes = {-65,-66,-67,68,69};//ABCDE
fos.write(bytes);
//void write(byte[] b, int off, int len) 写字节数组的一部分,off数组的开始索引,len写的字节个数
fos.write(bytes,1,2);//BC
/*
便捷写字符的方法
String类有一个方法
byte[] getBytes() 把字符串转化为字节数组
*/
fos.write("你好".getBytes());//使用UTF-8转换
//释放资源
fos.close();
}
}
便捷写字符的方法:String类有一个方法
byte[] getBytes()
把字符串转化为字节数组
fos.write("你好".getBytes());//使用UTF-8转换
续写:
FileOutputStream(File file, boolean append)
创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name, boolean append)
创建文件输出流以写入具有指定名称的文件。
参数
- File file,String name:写入数据的目的地
- boolean append:续写的开关
true:创建对象不会覆盖之前的文件,写数据会在文件末尾继续写
false:创建对象会创建一个新文件覆盖之前的文件,不写默认为false
换行:可以使用换行符号
windows系统:\r \n
Linux: /n
mac: /r
示例:续写与换行
public class Demo03 {
public static void main(String[] args) throws IOException {
//创建FileOutputStream对象
FileOutputStream fos = new FileOutputStream("day09\\3.txt", true);
//调用write方法
for (int i = 0; i < 10; i++) {
fos.write("hello".getBytes());
//换行符
fos.write("\r\n".getBytes());
}
//释放资源
fos.close();
}
}
InputStream(字节输入流)
java.io.InputStream:字节输入流
此抽象类是表示输入字节流的所有类的超类。
里边定义了所有字节输入流中共性的成员方法:
public void close()
:关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read()
: 读取一个字节,并返回
public int read(byte[] b)
: 读取多个字节,存储到数组中返回
FileInputStream
java.io.FileInputStream extends InputStream
文件字节输入流
作用:把文件中的数据,以字节的方式读取到内存中
构造方法:
FileInputStream(File file)
FileInputStream(String name)
参数:读取的数据源
File file:数据源是一个文件
String name:数据源是一个文件路径
构造方法作用:
- 创建一个FileInputStream对象
- 会把FileInputStream对象指向要读取的第一个字节
读取数据的底层原理:
java程序-->JVM-->OS-->OS读取数据的方法-->读取文件
字节输入流的使用步骤:
- 创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
- 使用FileInputStream中的方法read,读取文件
- 释放资源
注意:构造方法中指定的文件不存在,会抛出文件找不到异常
java.io.FileNotFoundException: day10\1.txt (系统找不到指定的文件。)
一、使用字节输入流,一次读取一个字节
示例:public abstract int read()
使用字节输入流,一次读取一个字节
public class Demo01 {
public static void main(String[] args) throws IOException {
//1.创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("day10\\1.txt");//abc
//2.使用FileInputStream中的方法read,读取文件
//public abstract int read() : 读取一个字节,并返回
int len = fis.read();
System.out.println(len);//97 a
len = fis.read();
System.out.println(len);//98 b
len = fis.read();
System.out.println(len);//99 c
len = fis.read();
System.out.println(len);//-1
len = fis.read();
System.out.println(len);//-1
fis.close();
}
}
读取文件的过程是一个重复的过程,所以使用循环优化
使用While循环,循环结束条件:read方法返回-1
While循环的布尔表达式
fis.read
:读取一个字节len = fis.read()
:把读取到的字节赋值给变量len(len = fis.read()) != -1
:判断变量len是否为-1
示例:循环优化输入
public class Demo01 {
public static void main(String[] args) throws IOException {
//1.创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("day10\\1.txt");//abc
//2.使用FileInputStream中的方法read,读取文件
//public abstract int read() : 读取一个字节,并返回
// int len = fis.read();
// System.out.println(len);//97 a
//
// len = fis.read();
// System.out.println(len);//98 b
//
// len = fis.read();
// System.out.println(len);//99 c
//
// len = fis.read();
// System.out.println(len);//-1
//
// len = fis.read();
// System.out.println(len);//-1
/*
读取文件的过程是一个重复的过程
循环优化
使用While循环,循环结束条件:read方法返回-1
While循环的布尔表达式
1.fis.read:读取一个字节
2.len = fis.read():把读取到的字节赋值给变量len
3.(len = fis.read()) != -1:判断变量len是否为-1
*/
int len = 0;
while ((len = fis.read()) != -1) {
System.out.println(len);
}
fis.close();
}
}
二、使用字节输入流一次读取多个字节
String类中的构造方法
String(byte[] bytes)
把字节数组转化为字符串
String(byte[] bytes, int offset, int length)
把字节数组的一部分转化为字符串,offset:数组的开始索引,length:转换的字节数
两件事情:
- read方法的参数byte[]作用:起缓冲作用,可以把多次读取到的字节存储到数组中,数组长度一般定义为1024(1kb),或1024的整数倍
- read方法的返回值int:每次读取到的有效字节个数
示例:public int read(byte[] b)
读取多个字节,存储到数组中返回
public class Demo02 {
public static void main(String[] args) throws IOException {
//1.创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("day10\\2.txt");//ABCDE
//2.调用FileInputStream对象中的方法read,读取文件
byte[] bytes = new byte[2];
int len = fis.read(bytes);
System.out.println(len);//2
System.out.println(new String(bytes));//AB
len = fis.read(bytes);
System.out.println(len);//2
System.out.println(new String(bytes));//CD
len = fis.read(bytes);
System.out.println(len);//1
System.out.println(new String(bytes));//ED
len = fis.read(bytes);
System.out.println(len);//-1
System.out.println(new String(bytes));//ED
//释放资源
fis.close();
}
}
示例:循环优化
public class Demo02 {
public static void main(String[] args) throws IOException {
//1.创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("day10\\2.txt");//ABCDE
//2.调用FileInputStream对象中的方法read,读取文件
// byte[] bytes = new byte[2];
// int len = fis.read(bytes);
// System.out.println(len);//2
// System.out.println(new String(bytes));//AB
//
// len = fis.read(bytes);
// System.out.println(len);//2
// System.out.println(new String(bytes));//CD
//
// len = fis.read(bytes);
// System.out.println(len);//1
// System.out.println(new String(bytes));//ED
//
// len = fis.read(bytes);
// System.out.println(len);//-1
// System.out.println(new String(bytes));//ED
/*
循环优化
*/
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes))!=-1){
//只把有效的字节个数转换为字符串
System.out.println(new String(bytes,0,len));
}
//释放资源
fis.close();
}
}