与之前的文件流不同,之前的所有文件流,读取文件的位置,也就是源,其实都是在磁盘之中,Java无法直接访问,是需要通过操作系统的帮助才行;但是ByteArray不一样,他就叫字节数组,就只是一个地方的某个内存数据而已,Java可以直接访问;
jvm虚拟机只能访问内存数据,字节数组就是一些重要的内存数据(二进制),使用Java操作这一组二进制流时,就是使用字节数组流的方式操作;更重要的是数据(如字符串等)都可以转化成字节数组,有利于以后从服务器提取数据,方便进行网络的传输;
注意点
- 转化成字节数组的量要小,否则内存很容易过多;
- 字节数组流不需要关闭;
- 任何数据都可以转化成字节数组;
1. ByteArrayInputStream和ByteArrayOutputStream的基础使用
以下就是详细的介绍;虽然说和之前的文件流有些区别,但是总的来说使用的步骤还是差不多的;第一步先找到源(这里的源不是指文件);第二步定义流;第三步执行操作;第四步在这里不需要1. ByteArrayInputStream的基础使用
public class TextByteArrayIn {
public static void main(String[] args) {
InputStream bais = null;
String s = null;
int len = -1;
//定义一个源,这个源不再是文件,可以暂时使用数据代替;
byte[] msg = "我的博客".getBytes();
//生成一个对象,使用ByteArrayInputStream的构造方法;
bais = new ByteArrayInputStream(msg);
//在底下定義一個字节数组,大小为3,也就是每次取三个字节;(这是UTF-8)
byte[] data = new byte[3];
try{
//循环,知道字节全部取完;
while ((len=bais.read(data))!=-1) {
//使用String类的构造方法,将字节直接转化成字符串;
s = new String(data,0,len);
System.out.println(s);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
2. ByteArrayOutputStream的基础使用
public class FileByteArrayOut {
public static void main(String[] args) {
ByteArrayOutputStream out = null;
int len = -1;
//定义一个源(当然这个源不是文件),以后也可以是从输入流中得到;
byte[] msg = "神秘的天".getBytes();
//定义流
out = new ByteArrayOutputStream();
//在这里写入使用write
out.write(msg,0,msg.length);
byte[] b= out.toByteArray();
//由于前面out已经调用了write方法写入了数据,所以最后输出out里面的数据就可以了;
System.out.println(out.toString());
System.out.println(b.length);
}
}
2.怎么通过ByteArrayInputStream和ByteArrayOutputStream复制文件
感觉使用这个方法来复制文件有些,多此一举;不过要明白它不止可以复制文件,最重要的是可以直接复制内存中的数据;作为一名新手,我觉得很好;可以用来练习,以便熟练掌握这些基础技能;还是要多练啊;😛
//这个方法想写一个通过字节数组来进行文件的复制,当然其中还是要使用到基础字节流;
public class FileByteCopy {
//先写一个从文件读取数据到字节数组;
public byte[] FileToArray(String src) {
int len = -1;
//确定一个流;
File file = new File(src);
ByteArrayOutputStream baout = null;
InputStream in = null;
//定义一个流
baout = new ByteArrayOutputStream();
try {
in = new FileInputStream(file);
//定义一个字节数组;
byte[] arr = new byte[1024 * 10];
while ((len = in.read(arr)) != -1) {
baout.write(arr, 0, len);//第一个变量byte数组;第二个起始位置;第三个总长度;
}
return baout.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return new byte[0];
}
//这个方法则是将字节数组的值再写入到文件里面;
public void ArrayToFile(byte[] arr,String din) {
//定义一个源
File file = new File(din);
int len = -1;
OutputStream outs = null;
ByteArrayInputStream bain = null;
//定义流
try {
bain = new ByteArrayInputStream(arr);
outs = new FileOutputStream(file);
while ((len = bain.read()) != -1) {
outs.write(arr, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
outs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
FileByteCopy f = new FileByteCopy();
byte[] brr = f.FileToArray("./src/Ucopy.jpg");
f.ArrayToFile(brr,"d.jpg");
}
}