不同系统的文件路径符号不同
- window是\
- Linux是/
因此采用字符换的形式,“C:”+File.separator+“develop”+File.separator+“a”+File.separator+"a.txt"
public class Demo01File {
public static void main(String[] args) {
String pathSeparator = File.pathSeparator;
System.out.println(pathSeparator);
String separator = File.separator;
System.out.println(separator);
}
}
IO流
- 流->数据
- 字节流,InputStream,OutputStream
- 字符流,Reader,Writer
- 一切文件是字节的形式
Output(Stream)到文件中,把内存数据写到文件中 java程序–>JVM(java虚拟机)–>O S(操作系统)–>OS调用写数据的方法–>把数据写入到文件中
- 创建一个FileOutputStream对象
- 会根据构造方法中传递的文件/文件路径,创建一个空的文件
- 会把FileOutputStream对象指向创建好的文件
写入97,在记事本里显示的是a
public class Demo01OutputStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("09_IOAndProperties\\a.txt");
fos.write(97);
}
}
一次写多个字节的方法 byte[] bytes = {65,66,67,68,69};//ABCDE fos.write(bytes,1,2);//BC 1为开始的索引,索引1为66,2为数量两个,分别是66,67
public class Demo02OutputStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream(new File("09_IOAndProperties\\b.txt"));
fos.write(49);
fos.write(48);
fos.write(48);
byte[] bytes = {65,66,67,68,69};
fos.write(bytes);
fos.write(bytes,1,2);
byte[] bytes2 = "你好".getBytes();
System.out.println(Arrays.toString(bytes2));
fos.write(bytes2);
fos.close();
}
}
文字追加或者换行 FileOutputStream(“09_IOAndProperties\c.txt”,true); 换行符号 fos.write("\r\n".getBytes());
public class Demo03OutputStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("09_IOAndProperties\\c.txt",true);
for (int i = 1; i <=10 ; i++) {
fos.write("你好".getBytes());
fos.write("\r\n".getBytes());
}
fos.close();
}
}
InputStream
public class Demo01InputStream {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("09_IOAndProperties\\c.txt");
int len = 0;
while((len = fis.read())!=-1){
System.out.print(len);
}
fis.close();
}
}
一次读取多个字节
- 一般一次读取1024个字节
- 用len记录每次读取几个字节
fis.read(bytes),返回的是一次读取了几个数据到bytes数组里面
public class Demo02InputStream {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("09_IOAndProperties\\b.txt");
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
fis.close();
}
}
原理 一个英文字符一个字节
字符流
字符输入流读取数据
public class Demo02Reader {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("09_IOAndProperties\\c.txt");
char[] cs = new char[1024];
int len = 0;
while((len = fr.read(cs))!=-1){
System.out.println(new String(cs,0,len));
}
fr.close();
}
}
缓冲流
缓冲流是字节流的子类,使用缓冲缓冲流可以提高效率
*
java.io.BufferedOutputStream extends OutputStream
BufferedOutputStream:字节缓冲输出流
继承自父类的共性成员方法:
- public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
- public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
- public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
- public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
- public abstract void write(int b) :将指定的字节输出流。
构造方法:
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
参数:
OutputStream out:字节输出流
我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率
int size:指定缓冲流内部缓冲区的大小,不指定默认
使用步骤(重点)
1.创建FileOutputStream对象,构造方法中绑定要输出的目的地
2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象对象,提高FileOutputStream对象效率
3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
5.释放资源(会先调用flush方法刷新数据,第4部可以省略)
*/
public class Demo01BufferedOutputStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("10_IO\\a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write("我把数据写入到内部缓冲区中".getBytes());
bos.flush();
bos.close();
}
}
InputStream
public class Demo02BufferedInputStream {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("10_IO\\a.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] bytes =new byte[1024];
int len = 0;
while((len = bis.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
复制文件 性能比较
- 使用缓冲区一次读多个到缓冲区>使用缓冲区一次读一个到缓冲区>一次读多个>一个读一个
-复制文件, 一读一写
public class Demo01CopyFile {
public static void main(String[] args) throws IOException {
long s = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("c:\\1.jpg");
FileOutputStream fos = new FileOutputStream("d:\\1.jpg");
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
long e = System.currentTimeMillis();
System.out.println("复制文件共耗时:"+(e-s)+"毫秒");
}
}
public class Demo02CopyFile {
public static void main(String[] args) throws IOException {
long s = System.currentTimeMillis();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("c:\\1.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:\\1.jpg"));
byte[] bytes = new byte[1024];
int len = 0;
while((len = bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
bos.close();
bis.close();
long e = System.currentTimeMillis();
System.out.println("复制文件共耗时:"+(e-s)+"毫秒");
}
}
转换流
该方法可以指定写进文件的编码格式
- 编码,字符(能看懂的)->字节(看不懂的)
- 解码,字节(看不懂的)->字符(能看懂的)
字符集 - ASCII字符集,英语,数字,1->49,a->97,一共128个字符
- GBK字符集,中文
- UNICODE,UTF-8,UTF-16,互联网协议
FileReader - 只可以读取默认(UTF-8)格式的文件
- FileReader读取系统默认编码(中文GBK)会产生乱码���
public class Demo01FileReader {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("10_IO\\我是GBK格式的文本.txt");
int len = 0;
while((len = fr.read())!=-1){
System.out.print((char)len);
}
fr.close();
}
}
转换流原理
- InputStreamReader
- OutputStreamWriter
public class Demo02OutputStreamWriter {
public static void main(String[] args) throws IOException {
write_gbk();
}
private static void write_gbk() throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("10_IO\\gbk.txt"),"GBK");
osw.write("你好");
osw.flush();
osw.close();
}
private static void write_utf_8() throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("10_IO\\utf_8.txt"));
osw.write("你好");
osw.flush();
osw.close();
}
}
|