搜索热点


Java第六课

何轩伟 2023-11-13 71 11/13
  1. 数据的读写:

字节流:以字节为单位(byte)以Stream结尾

字符流:以字符为单位(char)不以Stream结尾

Java第六课

2.FileInputStream(三个参数:string name(文件的全路径)/File file(文件对象)/FileDescriptor)

实例TestByteStream.java

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

 

public class TestByteStream {

public static void main(String[] args) throws IOException {

InputStream in=new FileInputStream("data/data.txt");//打开文件

int ch;

while((ch=in.read())!=-1){      //读写文件

System.out.print((char) ch);

}

in.close();                     //关闭文件

}

}

int read( ): 从数据源读取一个字节,返回该字节对应的整数;若无数据可读,则返回-1

三部曲:1.打开文件(line 8)   2.读写文件(line 10)   3.关闭文件(line 13)

更多详细参数查看群文件IO————IO.docx

int read(byte[ ] buf): 试图从数据源读取buf.length个字节,并存入buf数组,返回实际读取的字节数;若无数据可读,则返回-1

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

 

public class TestByteStream {

public static void main(String[] args) throws IOException {

InputStream in=new FileInputStream("data/data.txt");//打开文件

 

int count;

byte[] b=new byte[10];

while((count=in.read(b))!=-1){    //读写文件

System.out.print(new String(b,0,count));

}

in.close();                     //关闭文件

}

}

data.txt文件如下:

Java第六课

line12中指定了从第0位读取到count结束,若不指定读取数组的长度(即上方line12中的语句为System.out.print(new String(b)); ),则会导致多余未被冲掉的数组被输出

示意如下:

第一次读取的十位:ABCDEFGHIJ

第二次读取的十位:KLMNOPQRST

第三次只能读取八位:UVWXYZ\r\n

第三次读取的八位冲去了第二次读取的前八位(即第二次读取的第九位和第十位(ST)被保留了下来)所以输出的时候除了输出data.txt中的字符外,也会输出ST。

运行结果如下:

Java第六课

int read(byte[ ] buf, int offset, int len): 试图从数据源读取len个字节,存入buf数组从buf[offset]开始的元素中,返回实际读取的字节数;若无数据可读,则返回-1

3.输出流:

OutputStream out= new FileOutputStream("data/data2.txt");

将文件输出到data2.txt中(有则覆盖原文件,无则自动创建一个新文件)

但是如果在参数后加了“true",则会将输出的文本追加在原文本的后方,而不是覆盖原文件!

要记得在输出流的最后也要加上关闭文件的操作,无论是输入流还是输出流都要关闭

in.close();                     //关闭文件

out.close();                    //关闭文件

输出文件(复制)的参数:

实例Copy.java

import java.io.*;

 

public class Copy {

public static void main(String[] args) throws IOException {

InputStream in=new FileInputStream("原文件的路径(注意不能是一个目录)");

OutputStream out=new FileOutputStream("输出文件的路径");

 

 

 

int count;

byte[] buf=new byte[1024];

long start=System.currentTimeMillis();

while((count=in.read(buf))!=-1){

out.write(buf,0,count);

}

long end=System.currentTimeMillis();

in.close();

out.close();

 

System.out.println(end-start);//计算从开始到结束的时间(单位:毫秒)

}

}

(line11)通过对buf数组大小的调整,数值越大则拷贝速度越快(读写次数越少,每次读写的数据量越大),要注意的是InputStream和OutputStream不能用来拷贝目录。

关于currentTimeMillis(line12和16):为了便于记录某个方法块的执行时间,通常都会在代码块的执行前和执行后各标记一个时间,取两个时间差。

currentTimeMillis()这个方法得到的是自1970年1月1日零点到目前计算这一刻所经历的的毫秒数,注意这里返回值为long型,至于为什么不是int,因为int已经存不下了

out.flush()

将缓冲区的数据刷新,立刻写入目标文件,然后将缓冲区清空

 

- THE END -
Tag:
最后修改:2023年11月13日
0

非特殊说明,本博所有文章均为博主原创。