一次读取一个字节数据
读取文件内容
采用此方法:
一个字节一个的读,肯定会出现汉字乱码,因为汉字是好几个字符组成的
/*
需求:
把文件student.owl中的内容读取出来在控制台输出
FileInputStream:从文件系统中的文件获取输入字节
FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名
使用字节输入流读数据的步骤:
1:创建字节输入流对象
2:调用字节输入流对象的读数据方法【复杂】
3:释放资源
*/
方法1
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
//FileInputStream(String name)
FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");
//调用字节输入流对象的读数据方法
//方法1
//int read():从该输入流一次读取一个字节的数据
//第一次读取数据
int by = fis.read();
System.out.println(by);
System.out.println((char)by);
//第二次读取数据
by = fis.read();
System.out.println(by);
System.out.println((char)by);
//再多读取两次
by = fis.read();
System.out.println(by);
by = fis.read();
System.out.println(by);
//当发现可以用循环的时候,然后找判断条件
//如果达到文件的末尾, -1
// 当数据读取完毕,返回值-1
//释放资源
fis.close();
}
}
优化1
package sockethm;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
//FileInputStream(String name)
FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");
//调用字节输入流对象的读数据方法
//方法1。int read():从该输入流一次读取一个字节的数据
int by = fis.read();
while (by != -1) {
System.out.print((char)by);
by = fis.read(); //继续读取
}
//释放资源
fis.close();
}
}
优化2
package sockethm;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
//FileInputStream(String name)
FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");
//调用字节输入流对象的读数据方法
//方法1。int read():从该输入流一次读取一个字节的数据
//优化上面的程序
int by;
while ((by=fis.read())!=-1) {
System.out.print((char)by);
}
/*
fis.read():读数据
by=fis.read():把读取到的数据赋值给by
by != -1:判断读取到的数据是否是-1
*/
//释放资源
fis.close();
}
}
一次读取一个字节数组的数据
/*
需求:把文件fos.txt中的内容读取出来在控制台输出
使用字节输入流读数据的步骤:
1:创建字节输入流对象
2:调用字节输入流对象的读数据方法
3:释放资源
*/
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo02 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");
//调用字节输入流对象的读数据方法
//int read(byte[] b):从该输入流读取最多 b.length个字节的数据到一个字节数组
byte[] bys = new byte[5]; //每次读取5个字节
//第一次读取数据
int len = fis.read(bys); //这个len获取的不是字节数组的长度,而是实际读取的数据的个数
System.out.println(len); //如果bys 没有数据,那么len长度为-1
//String(byte[] bytes) 将字节数组的数据转到字符串里面,然后输出
// string的一个构造方法,直接把字节数组变成字符串
// System.out.println(new String(bys));
//这样的缺点是,每次都读取数组5长度内容,然后每次都输出这么多
//第二次读取数据不足5的时候,依旧会输出5个内容,会包含上次读到的内容
System.out.println(new String(bys,0,len)); //0到实际读取长度
//每次读到的内容长度就是len的长度,当最后一次不足5的时候,读到多少,就输出多少
//第二次读取数据
len = fis.read(bys);
System.out.println(len);
// System.out.println(new String(bys));
System.out.println(new String(bys,0,len));
//第三次读取数据
len = fis.read(bys);
System.out.println(len);
// System.out.println(new String(bys)); //这次只读了四个,所以还有一个上次读的没有替换掉
//String(byte[] bytes, int offset, int length) 这个方法是只显示数组长度的内容
System.out.println(new String(bys,0,len));
//再多读取两次
len = fis.read(bys);
System.out.println(len);
len = fis.read(bys);
System.out.println(len); //当实际读取长度为-1时,说明读到了末尾
/*
hello\r\n
world\r\n
第一次:hello
第二次:\r\nwor
第三次:ld\r\nr
*/
//释放资源
fis.close();
}
}
优化1
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo02 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");
byte[] bys = new byte[1024]; //一般给1024及其整数倍
int len; //这个len是实际每次读取的数据的个数
while ((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
fis.close();
}
}
参考链接:
版权声明:本文为dd_Mr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。