java inputstream 输出到outputstream java inputstream转file_Java输出流InputStream

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接口。 文件可以排序。