InputStream 和OutputStream
第一种方式:使用字节输出流建立一个文件并存储一些数据
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("abcdsjfl".getBytes()); //getBytes()将字符串转化成字节存储到byte数组中
fos.close(); // 关闭资源
InputStream :
FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
第二种方式:
FileInputStream fis = new FileInputStream("fos.txt");
int by = 0;
while((by=fis.read())!=-1){
System.out.println((char)by);
}
第三中方式:
FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[fis.available()];//文件体积过大,会内存溢出。
fis.read(buf);
//复制图片
FileInputStream fis = new FileInputStream("d:\\java32\\day17\\ma.JPG");
FileOutputStream fos = new FileOutputStream("d:\\ma.bmp");
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
fis.close();
字节流缓冲区:
FileInputStream fis = new FileInputStream("c:\\0.mp3");
BufferedInputStream bufis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("c:\\1.mp3");
BufferedOutputStream bufos = new BufferedOutputStream(fos);
int temp = 0;
while((temp=bufis.read())!=-1)
{
bufos.write(temp);
}
bufos.close();
bufis.close();
字节流缓冲区原理注意事项:
read方法读取了一个字节是连续的8个1。正好是-1.那么循环就停止了。
为什么,字节读取流的read方法一次读一个字节,返回值类型,不是byte,而是int呢?
那是因为,在读取一个字节数据时,容易出现连续8个1的情况,连续8个1是-1.
正好符合了流结束标记。所以为了避免,流操作数据是提前结束,将读到的字节进行int类型的提升。保留该字节数据的同时,前面都补0.(&255).避免-1的情况。
输出流的write方法虽然接收是一个整数,四个字节,但是write只将最后一个字节写出。其他字节抛弃。
转换流:字节流和字符流之间的桥梁
InputStreamReader 字节转成字符的桥梁
比如:
InputStream in = System.in;//键盘录入
InputStreamReader isr = new InputStreamReader(in);
BufferedReader bufr = new BufferedReader(isr);
匿名对象简写:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
读取键盘录入数据 并将数据每一行以大写形式打印在控制台上,如果录入的数据是over,该程序结束
InputStream in = System.in;
InputStreamReader isr = new InputStreamReader(in);
BufferedReader bufr = new BufferedReader(isr);
String line = null;
while ((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
bufr.close();
OutputStreamWriter 字符转成字节的桥梁
比如:
OutputStream out = System.out;
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(osw);
匿名对象简写:
BufferedWriter bufw = new BufferedWriter(new OutpurStreamWriter(System.out));
转换流其实就是字节流+字符编码,没有指定编码,默认本机编码,GBK
其实流的操作就是对源和目的的操作。流其实就是在富足和目的设备上的数据传输
因为流的对象有很多,什么情况下,要使用什么对象
流的操作规律:
1 明确源和目的
源:读取InputStream Reader
目的: 写入 OutputStream Writer
2 明确操作的数据内容
数据是否是存文本数据:
是:源 Reader
Writer
否 :源 InputStream
OutputStream
3 明确设备
File的流对象),键盘(System.in),内存(带数组的流对象)
目的设备:硬盘(带File的流对象),控制台(System.out),内存(带数组的流对象)
4 明确是否需要高效和一些具体功能
是:使用Buffer
否:不使用Buffer
具体功能:
是一些具体的特殊的对象。
可以操作基本数据类型的流对象 ,或者操作对象的流对象等
Writer
|-----OutputStreamWriter:该流中加入了编码表
|-----FileWriter :操作文件的字符流对象,该对象中使用默认的编码表GBK
所以子类FileWriter只能操作GBK编码表,而父类可以操作指定的编码表,在实际应用中,如果数据是GBK的,不涉及其他编码表,可以使用FileWriter来完成,如果涉及其他编码表,就必须用父类OutputStreamWriter来完成
Reader
|-----IntputStreamReader:
|-----FileReader 和上面一样
File 类:
用来将文件或者文件夹封装成对象,方便于对文件与文件夹的属性信息进行操作,File对象可以作文产生传递给流的构造函数
File类的常见方法。
1,创建。
boolean createNewFile():创建文件。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级目录。
2,删除。
boolean delete():
deleteOnExit();
3,判断。
isAbsolute():是否是绝对路径。
exists():是否存在。
isDirectory():是否是文件夹。
isFile():是否为文件。
4,获取。
long length():文件大小。
getName() :文件名
getParent() 父目录, 如果封装File对象时,不指定路径, 返回 null
getPath() 路径 封装什么路径就是什么路径
getAbsolutePath() 绝对路径。 无论封装什么路径,获取的都是绝对路径。
String[] list():获取指定目录下当前的文件夹和文件名称。
File[] listFiles():获取指定目录下当前的文件夹和文件对象。
static File[] listRoots():获取本机有效盘符。
String[] list(FilenameFilter ):获取指定过滤器过滤后的文件或者文件夹名称
File[] listFiles(FileFilter ):获取指定过滤器过滤后的文件或者文件夹对象
5,renameTo:对文件进行改名。还可以剪切。
6,compareTo():File实现了Compareable接口。 文件可以排序。