java知识点之输入输出流
Java输入输出流IO
Java输入输出流(IO)
输入流:文件输入(表示从一个源读取数据)——读
输出流:文件输出(表示向一个目标写入数据)——写
字节流
字节输入流:InputStream 从输入设备中读取数据
字节流处理单元为1个字节,操作字节和字节数组 ,字节流可用于任何类型的对象,包括二进制对象 。字节流读取和写入数据都是需要二进制格式的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLrQCO1T-1590377268472)(C:\Users\ADMINI~1\AppData\Local\Temp\1590301480768.png)]
字节输出流:OutputStream 将数据写入到输出设备当中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cdT7oJGj-1590377268477)(C:\Users\ADMINI~1\AppData\Local\Temp\1590301573874.png)]
字符流
字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的 。
应用场景:读取和写入都需要是字符的情况,而不是二进制的数据,比如聊天。
字符输入流:Reader
Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgKJQX2I-1590377268479)(C:\Users\ADMINI~1\AppData\Local\Temp\1590303731569.png)]
字符输出流:Writer
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdeYYxy0-1590377268485)(C:\Users\ADMINI~1\AppData\Local\Temp\1590303772384.png)]
读写文件
FileInputStream
该流用于从文件读取数据,它的对象可以用关键字 new 来创建 ,也可以使用一个文件对象来创建一个输入流对象来读取文件。
//方式一
InputStream input = new FileInputStream("c:/java/hello");
//方式二
File file = new File("c:/java/hello");
InputStream out = new FileInputStream(file);
序号 | 方法及描述 |
---|---|
1 | public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
2 | protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public int read(int r)throws IOException{} 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。 |
4 | public int read(byte[] r) throws IOException{} 这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回**-1**。 |
5 | public int available() throws IOException{} 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。 |
FileInputStream
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
//方式一
OutputStream input = new FileOutputStream("c:/java/hello");
//方式二
File file = new File("c:/java/hello");
OutputStream out = new FileOutputStream(file);
序号 | 方法及描述 |
---|---|
1 | public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
2 | protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public void write(int w)throws IOException{} 这个方法把指定的字节写到输出流中。 |
4 | public void write(byte[] w) 把指定数组中w.length长度的字节写到OutputStream中。 |
示例一: 利用FileOutputStream创建本地文件并打印到控制台
public static void main(String args[]) throws IOException{
byte[] bytes = {10 ,2 ,45 ,35};
//创建文件hello.txt
OutputStream output = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\hello.txt");
//将字节数组写入文件
for(int i=0;i<bytes.length ; i++) {
output.write(bytes[i]);
}
//关闭输出流,释放系统资源
output.close();
InputStream input = new FileInputStream("C:\\Users\\Administrator\\Desktop\\hello.txt");
int result = input.read();
while(result!= -1) {
//将文件中的数据打印输出到控制台
System.out.print(result+" " );
result = input.read();
}
//关闭输入流,释放系统资源
input.close();
}
字节字符转换流
1、计算机存储的单位是字节,如尽管txt文本中有中文汉字这样的字符,但是对计算机而言,其是字节形式存在的
2、字节流读取是单字节读取,但是不同字符集解码成字符需要不通过个数,因此字节流读取会报错
3、 那么就需要一个流把字节流读取的字节进行缓冲而后在通过字符集解码成字符返回,因而形式上看是字符流
4、InputStreamReader流就是起这个作用,实现从字节流到字符流的转换
输入流:InputStreamReader
序号 | 方法及描述 |
---|---|
1 | public String getEncoding() 获取设置的字符集 |
2 | public int read() throws IOException{} 读取流并返回一个字符,遇到文件末尾返回- |
3 | public int read(char cbuf[], int offset, int length) throws IOException{} 读取字符到字符数组的部分中,遇到文件末尾返回-1 |
4 | public boolean ready() throws IOException{} 检测流是否准备好读取 |
5 | public void close() throws IOException {} 关闭流并释放资源 |
示例二:读取文件并打印到控制台(解决编码问题)
private static void inputSteamMethod() {
// TODO Auto-generated method stub
try {
FileInputStream file = new FileInputStream("C:\\Users\\Administrator\\Desktop\\imooc.txt");
InputStreamReader reader = new InputStreamReader(file,"UTF-8");
char[] c = new char[10];
int n = 0;
//方式一
while((n = reader.read())!= -1) {
System.out.print((char) n);
}
//方式二
while((n=reader.read(c))!= -1) {
//n:数组当中的实际长度 /实际存储的字符数组当中字符的数量
String str= new String(c,0,n);
System.out.println(str);
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出流:OutputStreamWrite
序号 | 方法及描述 |
---|---|
1 | public OutputStreamWriter(OutputStream out, Charset cs){} 构造方法 参数1:OutputStream对象 参数2:字符集 |
2 | public String getEncoding() |
3 | public void write(int c) throws IOException{} 写入单个字符 |
4 | public void write(char cbuf[], int off, int len) throws IOException {} 写入字符数组 参数1:字符数组 参数2:偏移量 参数3:长度 |
5 | public void flush() throws IOException{} 刷新该流的缓冲 |
6 | public void close() throws IOException{} 关闭此流,但要先刷新它。 |
示例三:复制文件
public static void outputSteamMethod() {
try {
FileInputStream file = new FileInputStream("C:\\Users\\Administrator\\Desktop\\imooc.txt");
InputStreamReader reader = new InputStreamReader(file);
FileOutputStream outfile = new FileOutputStream("imooc.txt");
OutputStreamWriter writer = new OutputStreamWriter(outfile);
char[] cbuf = new char[10];
int n = 0;
while((n=reader.read(cbuf))!= -1) {
writer.write(cbuf, 0, n);
writer.flush();
}
file.close();
reader.close();
outfile.close();
writer.close();
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
读取控制台输入
Java 的控制台输入由 System.in 完成。
为了获得一个绑定到控制台的字符流,你可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流。
下面是创建 BufferedReader 的基本语法:
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
从控制台读取多字符输入
从 BufferedReader 对象读取一个字符要使用 read() 方法
它的基本语法如下:
int read( ) throws IOException
每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。
示例四:使用字符缓冲输入流BufferedReader 读取控制台字符输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//读取控制台的字符
char c =(char) br.read();
while(c !='q') {
System.out.println(c);
c = (char) br.read();
}
从控制台读取字符串
从标准输入读取一个字符串需要使用 BufferedReader 的 readLine() 方法。
String readLine( ) throws IOException
示例五:使用BufferedReader 读取控制台字符串输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(str);
控制台输出
在此前已经介绍过,控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。
PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。
int b;
b='A';
System.out.write(b); //结果 A
System.out.println('\n');
System.out.println(b); //结果 65
write()方法输出的为字符流;println()方法输出的为字节流。
File类中的常用方法
序号 | 方法及描述 |
---|---|
1 | public void mkdir () 创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建 |
2 | public void mkdirs() 创建一个文件夹和它的所有父文件夹。 |
3 | public boolean isDirectory() 检测 创建的File 对象是否为一个目录 |
4 | public String[] list() 获取file对象中包含的文件和文件夹的列表 |
5 | public boolean delete() 删除路径下的文件或者目录 |
上一篇: java IO流 知识整理