FileInputStream及Filereader
一些方法:
abstract int read()
从输入流读取数据的下一个字节。
int read(byte[] b)
从输入流读取一些字节数,并将它们存储到缓冲区 b
void close()
关闭此输入流并释放与流相关联的任何系统资源。
public class FileInputStream extends InputStreamA FileInputStream从文件系统中的文件获取输入字节。 什么文件可用取决于主机环境。
FileInputStream用于读取诸如图像数据的原始字节流。 要阅读字符串,请考虑使用FileReader 。
构造方法:
FileInputStream(File file)
通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(String name)
通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
构造方法的作用:
会创建一个FileInputStream对象
会把FileInputStream对象指定构造方法中的文件
创建步骤:
1.创建一个FileinputStream对象,构造方法中传递写入的目的地
2.调用FileinputStream对象中的方法,把数据写入到文件中
3.释放资源(流使用会占用一定的内存,使用完毕后要把内存清空,提高使用效率)
代码块
public class Demo01InputStream {
public static void main(String[] args) throws IOException {
//创建一个FileinputStream对象,构造方法中传递写入的目的地
FileInputStream fos=new FileInputStream("src\\cn\\itcast\\File\\123\\tang1.txt");//没有文件创建文件,有了直接写入!
//调用FileinputStream对象中的方法,把数据写入到文件中
int read = fos.read();//一次读取一个字节
System.out.println(read);//65
read=fos.read();
System.out.println(read);//66
read=fos.read();
System.out.println(read);//67
//释放资源(流使用会占用一定的内存,使用完毕后要把内存清空,提高使用效率)
/*发现是一个重复的过程,所以可以使用循环,但是又不知道长度,已经知道没有字节用-1表示,则可以不严谨难过的创造一个循环
*/
/*int len;
while((len=fos.read())!=-1)
{
System.out.println((char) len);//读取中文的字符出现乱码
}
fos.close();*/
/*public abstract class Reader用于读取字符流的抽象类。 子类必须实现的唯一方法是read(char [],int,int)和close()。
* public class FileReader extends InputStreamReader extends Reader阅读字符文件的便利课。
该类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。 要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。
作用:把硬盘文件中的数据以字符的方式读取到内存中
* 构造方法:
* FileReader(File file)
创建一个新的 FileReader ,给出 File读取。
FileReader(String fileName)
创建一个新的 FileReader ,给定要读取的文件的名称。
*/
/*字符输入流的使用步骤:
* 1.创建一个FileReader对象,构造方法中绑定要读取的数据源
* 2.使用FileReader对象中的read读取文件
* 3.释放资源*/
FileReader fr=new FileReader("src\\cn\\itcast\\File\\123\\tang1.txt");
/*int len1=0;
while ((len1=fr.read())!=-1)
{
System.out.print((char) len1);
}*/
/*使用字符数组提高读取效率*/
int len1=0;
char cs[]=new char[1024];
while ((len1=fr.read(cs))!=-1)
{
/*String(char[] value)
分配一个新的 String ,以便它表示当前包含在字符数组参数中的字符序列。
String(char[] value, int offset, int count)
分配一个新的 String ,其中包含字符数组参数的子阵列中的字符。
*/
System.out.print(new String(cs,0,len1));
}
fr.close();
}
}
注解:
上面介绍了以1024个字节为单位的一种读取方法:为了能够使读者更好的理解,以下对其解释并举例子说明:
int read(byte[] b)
从输入流读取一些字节数,并将它们存储到缓冲区 b
明确两件事
1.创建byte[]数组的作用
起到缓冲的作用,从存储每次读取到的多个字节
数组的长度一般定义为1024(1kb)或者1024的整数倍
2.方法的放回值int是什么?
每次读取的有效字节个数
创建步骤:
1.创建一个FileinputStream对象,构造方法中传递写入的目的地
2.调用FileinputStream对象中的方法,把数据写入到文件中
3.释放资源(流使用会占用一定的内存,使用完毕后要把内存清空,提高使用效率)
代码片
public class Demo02InputStream {
public static void main(String[] args) throws IOException {
//创建一个FileinputStream对象,构造方法中传递写入的目的地
FileInputStream fos=new FileInputStream("src\\cn\\itcast\\File\\123\\tang1.txt");//没有文件创建文件,有了直接写入!
//调用FileinputStream对象中的方法,把数据写入到文件中
//byte bytes[]={1,2,3};长度为3
/*byte bytes[]=new byte[10];//长度为10
int read = fos.read(bytes);//返回的是每次读取的个数,并将读取的数存放在bytes数组中,存放形式根据ASCII和gbk转换为2进制再转换为十进制
System.out.println(read);//10
System.out.println(Arrays.toString(bytes));//[65, 66, 67, 68, 69, 66, 67, -28, -67, -96]
//String(byte[] bytes);通过使用平台的默认字符集解码指定的字节数组来构造新的 String 把一个字节数组转换为字符串,0-127根据ASCII码,其他根据gbk
// String(byte[] bytes, int offset, int length)
//通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。部分字符数组转变,offset表示起始位置,length表示转换的长度!。
System.out.println(new String(bytes));
read = fos.read(bytes);
System.out.println(read);
System.out.println(Arrays.toString(bytes));
System.out.println(new String(bytes));*/
/*发现规律*/
byte bytes[]=new byte[1024];
int len=0;
while ((len=fos.read(bytes))!=-1)//-1代表数组啥都读取不到
{
System.out.println( new String(bytes,0,len));
//通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
// 部分字符数组转变,offset表示起始位置,length表示转换的长度!。
}
//3.释放资源(流使用会占用一定的内存,使用完毕后要把内存清空,提高使用效率)
fos.close();
}
}