什么是IO流
input 输入
output输出
流(字符字节)一个字符等于两个字节
一个字节等于八个二进制位
字节流 一切皆字节
输入流:outputstream
定义了一些共性的成员方法
FileoutputStream:文件字节输出流
构造方法:
FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流
FileOutputStream(File file)穿件一个向指定file对象表示的文件中写入数据的文件输出流
参数:写入数据的目的
String name 目的地是一个文件的路径
File file 目的地是一个文件
作用 创建一个FileOutputStream对象
根据构造方法中传递的文件或者文件路径创建一个空的文件
把FileoutputStream对象指向创建好的文件
写入数据的原理 java程序–》jvm–》os(操作系统)–》把数据写入到文件中
使用步骤:
- 创建一个FileoutputStream对象
- 调用FileoutputStream对象中方法write,把数据写入到文件中(写入的时候会把10进制转换成二进制 )
- 释放资源(流使用会占用一定的内存,使用完毕要把内存清空)
一次多个字节方法:
write(byte【 】x) 第一个字节是正数那么直接查询ascii表
如果第一个字节是负数那么第一个和第二个字节会组成一个中文显示
package Demo64;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo642FileoutputStream {
public static void main(String[] args) throws IOException {
//创建一个Fileoutput对象构造方法中床底写入数据的目的地
FileOutputStream fileOutputStream = new FileOutputStream("F:\\java项目2\\aaa\\a.txt");
//写入数据
byte[] bytes={65,66,67,68,69};//ABCDE
byte[] bytes2={-65,-66,-67,68,69};//烤紻E
fileOutputStream.write(bytes2);
fileOutputStream.write(bytes,1,2);//BC
// off表示数组索引开始
// len表示写几个字节
// 可以给字符串转换为字节数组然后写入
byte [] bytes1="你好".getBytes();
fileOutputStream.write(bytes1);
//释放资源
fileOutputStream.close();
}
}
续写和换行
FileOutputStream(String name boolean append)
FileOutputStream(File file boolean append)
append true创建对象不会覆盖源文件
false 覆盖原文件
换行:写入换行符号\r\n
package Demo64;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo643FileoutputStream {
public static void main(String[] args) throws IOException {
//创建一个Fileoutput对象构造方法中床底写入数据的目的地
FileOutputStream fileOutputStream = new FileOutputStream("F:\\java项目2\\aaa\\a.txt",true);
//写入数据
byte[] bytes="你好".getBytes();
for (int i = 0; i < 10; i++) {
fileOutputStream.write(bytes);
fileOutputStream.write("\r\n".getBytes());//写入换行符
}
//释放资源
fileOutputStream.close();
}
}
字节输入流
read
read(byte 【】 b)
close()
FileInputStream(String name)
FileInputStream(File file)
创建一个FileInputStream对象
把FileInputStream对象指定构造方法中要读取的文件
原理:java程序–》jvm–》os–》os读取数据的方法–》读取文件
package Demo64;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo644InputStream {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("F:\\java项目2\\aaa\\a.txt");
/* int read = fileInputStream.read();
System.out.println(read);
int read1= fileInputStream.read();
System.out.println(read1);
int read2 = fileInputStream.read();
System.out.println(read2);*/
int len=0;
while ((len=fileInputStream.read())!=-1){
System.out.println((char)len);
}
fileInputStream.close();
}
}
原理:
读取多个
FileInputStream(byte b)
String类的构造方法
String(byte 【】 bytes)
String(byte bytes ,int offest,int length )字符数组的一部分转换为字符串
offset:数组的开始索引
length 转换的字节个数
package Demo64;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
public class Demo645InputStream {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("F:\\java项目2\\aaa\\a.txt");
/* int read = fileInputStream.read();
System.out.println(read);
int read1= fileInputStream.read();
System.out.println(read1);
int read2 = fileInputStream.read();
System.out.println(read2);*/
byte[] bytes = new byte[2];
int len=fileInputStream.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));
len=fileInputStream.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));
len=fileInputStream.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));
len=fileInputStream.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));
byte [] bytes=new byte[1024];
int len=0;
while((len =fileInputStream.read(bytes))!=-1){
System.out.println(new String (bytes));
}
fileInputStream.close();
}
}
文件复制:一读一写
步骤:
- 创建一个字节输入流对象
- 创建一个字节输出流对象
- 使用字节输入流对象中的方法read读取
- 使用字节输出流中的方write
- 释放资源(先关闭写入流 再关闭写完流)
package Demo64;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo646File {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("g:\\Database.txt");
FileOutputStream fileOutputStream = new FileOutputStream("g:\\a.txt");
int len =0;
/* while ((len=fileInputStream.read())!=-1){
fileOutputStream.write(len);
}*/
byte[] bytes = new byte[1024];
while ((len=fileInputStream.read())!=-1){
fileOutputStream.write(bytes,0,len);
}
fileOutputStream.close();
fileInputStream.close();
}
}
字符流
读取中文
一个中文
GBK 两个字节
utf-8 三个字节
字符输入流:reader
read()单个字符
read(char[ ] )多个字符
Filereader()文件字符输入流
构造方法:FileReader(String filename)
FileReader(File file)
参数 读取文件的数据源
作用:创建一个Filereader对象
指向读取的文件
package Demo65;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Demo651Reader {
public static void main(String[] args) throws IOException {
FileReader fileReader= new FileReader("g:\\Database.txt");
/* int len=0;
while ((len=fileReader.read())!=-1){
System.out.print((char)len);
}*/
char[] chars = new char[1024];
int len=0;
while ((len=fileReader.read(chars))!=-1){
System.out.print(new String(chars,0,len));
}
fileReader.close();
}
}
字节输入流
writer类
FileWriter(String name)
FileWriter(File file)
步骤
创建FileWrite对象
使用write方法 把数据写入到缓冲区中
使用flusg方法 把缓冲区的数据刷新到文件中
释放资源
package Demo65;
import java.io.FileWriter;
import java.io.IOException;
public class Demo652Writer {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("g:a.txt");
fileWriter.write(97);
// fileWriter.flush();
fileWriter.close();
}
}
flush和close区别
flush 是刷新缓冲区 流对象还能继续使用
close 是先刷新缓冲区后释放资源 流对象不能使用
单个字符写入
package Demo65;
import java.io.FileWriter;
import java.io.IOException;
public class Demo652Writer {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("g:a.txt");
fileWriter.write(97);
fileWriter.flush();
fileWriter.write(95);//仍然可以继续使用
fileWriter.close();
fileWriter.write(96);//报错 表示流已经释放不能使用
}
}
多字符写入
package Demo65;
import java.io.FileWriter;
import java.io.IOException;
public class Demo653 {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("G:\\a.txt");
char [] chars={'a','b','c','d'};
fileWriter.write(chars);//写入字符数组
fileWriter.write(chars,1,2);//写入bc
fileWriter.write("海哥真帅");//写入海哥真帅
fileWriter.write("太帅了",1,2);//帅了
fileWriter.flush();
}
}
续写和换行同字节流
package Demo65;
import java.io.FileWriter;
import java.io.IOException;
public class Demo654Writer {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("g:a.txt",true);
for (int i = 0; i <10 ; i++) {
fileWriter.write("海哥真帅"); //续写字符串 接着写
fileWriter.write("\r\n".toString());//换行
}
fileWriter.flush();
}
}
异常处理流的异常
、、、这是jdk1.7以前的、、、、
package Demo65;
import java.io.FileWriter;
import java.io.IOException;
public class Demo655Writer {
public static void main(String[] args) {
FileWriter fileWriter=null;//初始化为null
try {
fileWriter = new FileWriter("g:a.txt",true);
for (int i = 0; i <10 ; i++) {
fileWriter.write("海哥真帅"); //续写字符串 接着写
fileWriter.write("\r\n".toString());//换行
}
fileWriter.flush();
}
catch (IOException e){
System.out.println(e);
}
finally {
//如果创建对象失败 默认值就是null null是不能调用方法的 会跑出异常
//需要增加一个判断不是null在释放
if(fileWriter!=null){
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
、、、JDK1.7之后以后给try()定义流对象、、、、
package Demo65;
import java.io.FileWriter;
import java.io.IOException;
public class Demo656Writer {
public static void main(String[] args) throws IOException {
try ( FileWriter fileWriter = new FileWriter("g:a.txt",true);
) {
for (int i = 0; i < 10; i++) {
fileWriter.write("海哥真帅"); //续写字符串 接着写
fileWriter.write("\r\n".toString());//换行
}
fileWriter.flush();
}
catch (IOException e){
System.out.println(e);
}
}
}