20170830 - A - Java IO操作
1 如何写出int型/long型数据?字符串数据?哪种方式可以指定写入或读取的位置?
①可使用RAF或输出流的方式写出数据到其他文件中。
RAF可直接调用writeInt/writeLong方式写入数据。
输出流则需利用逻辑位移符每次获取一个字节单位的字符写入。
②若字符串在文件内定义,则可直接利用str.getBytes("指定编码形式")方法获取字符数组并传入各自的write方法。
当字符串在外部文件时,两种方式皆必须先通过read方法获取字符串的字节数据,再write到新的文件中。并且都可设定byte型数组提高读取量
③RAF可利用seek方法指定指针位置从而实现在指定位置进行读写
2 操作完文件后的必要操作是?
file.close();
raf.close();
3 如何查看写完文件后指针的位置?
写入动作后
raf.getPointer();
4 当使用readInt方法连续读取文档中的int值,是否会报错,为什么?
会,输入有可能是-1,所以不能返回-1,只能报错。
5 如何读取文件中写入的long值?
在写入的位置读取。
/*
* void seek(long pos)
* 将指针移动到指定位置
*/
raf.seek(0);
System.out.println(raf.getFilePointer());
long i = raf.readLong();//自动读取8个字节
System.out.println(i);
System.out.println(raf.getFilePointer());
6 如何用RAF写入字符串值?
RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
String str = "我爱珠海渔女";
byte[] bs = str.getBytes();
raf.write(bs, 0, bs.length);
由于raf的写入方法只能接收字节(或字节数组),所以需要将字符串转化为字节数据。(使用byte[] bs = str.getBytes();方法)
7 如何设定写入字符串的编码形式?若先按照utf-8编码写入一段字符串,再重新按照gbk编码写入一次,则会?
str.getBytes("utf-8"),str.getBytes("gbk"),
写入“我爱珠海渔女”字符串
第一次写入21个字节,
第二次重新写入会将文本编码改为utf-8,所以第一次写入的会变成乱码,在第一次写入的字符串后追加,若设定指针从0开始,则会覆盖了前14个,后7个字节也会乱码
所以会乱码
9 如何读取文本中的字符串?
利用String的构造方法,将传入的字节数组按照指定的编码转换为相应的字符串。String(data,"gbk")
可限定传入数量
String(data,0,len,"gbk");
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
byte[] data = new byte[100];
int len = raf.read(data);
//String(data,"gbk")
String str = new String(data,0,len,"gbk");
System.out.println(str);
raf.close();
}
10 字符串(引用类型) 比较必须用什么?
equals
11 输出输入是相对于谁?
程序(即文件),获取外部数据即输入流(接收外部输入数据[读取外部数据]),输出内部数据(到其他文件[写出])则是输出流。——写out,鞋澳,读音
12 数据源是什么?
数据源头,低级流与数据源建立链接
13 流分为低级流和高级流
15 文件流,典型的低级流——数据与程序间的管道
标准的读写,不像RAF可指定指针位置。
16 int型等基本类型数据如何转换成字节?字符串呢?
逻辑位移符,若是raf可调用writeInt
通过调用自身方法,getBytes或被RAF抑或流read
17 输出流分为几种模式?
覆盖模式,追加模式。
18 如何使用输出流,写入数据?
public static void main(String[] args) throws IOException {
/*
* FileOutputStream支持两组常用的构造方法:
* FileOutputStream(String path)
* FileOutputStream(File file)
* 创建针对指定文件的输出流,默认是覆盖模式。
*
* FileOutputStream(String path,boolean append)
* FileOutputStream(File file,boolean append)
* 第二个参数为boolean值,若该值为true,则该输出流为追加模式,即
* 写出数据会追加到内部数据末尾。
*/
FileOutputStream fos = new FileOutputStream("fos.txt",true);
String str = "234567";
byte[] data = str.getBytes();
fos.write(data);
str = "7654321范德萨";
fos.write(str.getBytes());
fos.close();
System.out.println("写出完毕");
19 当输出流读取到最后一个字符时是否会返回-1?
会。
19 如何理解流?
可当作方法理解
20 缓冲流用于什么?
提高读写效率
21 高级流可以独立存在吗?
必然依托于低级流。
22 关哪个流?
最外层的高级流。
23 装载了高级流的低级流,在后续操作时操作哪个流?
高级流。
24 (缓冲区有100个字节容量,该次只读取6个字节——如发送“你好”)缓冲区内容未加载满就不写出或读取吗?如何解决?
正确,使用 .flush()强制将缓冲区中的数据一次性写出,或 .close()(会调用.flush())
25 缓冲区的工作原理是?
假性写读。
26 对象流用于方便读取对象。
27 BIS,BOS定义在哪,哪里就是所谓的程序(即文件)。
谨记一个原则:“文件读取,读取到的数据为二进制的数据,文件写入,需要将数据转化为二进制的字节才能写入(写入的数据在文件上以指定的形式显示)
当需要对文件读写时,有两种方式可以选择,一是使用RAF连接文件上,限定模式后对文件进行操作,二是用stream连接到文件上
而stream并不能像RAF一样,读取和写入都可以指定起始位置,并且用一个RAF对象就可以完成读写,流的读取操作用FileOutputStream,写入操作用
FileInputStream,基本操作与RAF相似——读取文件中的字节:FIS.read(),返回的是int型数据的低八位。Fis.read(data)则会对data数组进行操作
并返回当次存入字节数量。
当需要写入int型数据时,由于两者的read方法皆只能读取到低八位,但RAF有封装writeInt的方法,可直接传入要写入的值。而FOS则需通过逻辑右移符
单独获取每一个字节再写入。
当写入字符串时:
字符串再程序内定义,可直接使用str.getBytes("指定编码形式")获取字节数组
字符串在外部文件中,RAF和输出流可用read()方法获取字节后传入,RAF可定义字节数组提高单次读取量,输出流FOS可加载缓冲流提高单次读取量。
且输出流的写入操作默认为覆盖模式,可在构造时声明true更改为追加模式。
当文件在外部,一次读取量小于缓存流本身的数组数时,BOS不会继续写入,除非使用flush()强制将已缓存字节数据写入。(适用于即时应用场景,如
聊天室,每次输入的内容不管少多都要发送出去,而复制文件时则需每次都将数组填满以达到利用最大化的目的)
1 如何写出int型/long型数据?字符串数据?哪种方式可以指定写入或读取的位置?①可使用RAF或输出流的方式写出数据到其他文件中。RAF可直接调用writeInt/writeLong方式写入数据。输出流则需利用逻辑位移符每次获取一个字节单位的字符写入。②若字符串在文件内定义,则可直接利用str.getBytes("指定编码形式")方法获取字符数组并传入各自的write方法。当字符串在外部文件时,两种方式皆必须先通过read方法获取字符串的字节数据,再write到新的文件中。并且都可设定byte型数组提高读取量③RAF可利用seek方法指定指针位置从而实现在指定位置进行读写
2 操作完文件后的必要操作是?file.close();raf.close();
3 如何查看写完文件后指针的位置?写入动作后raf.getPointer();
4 当使用readInt方法连续读取文档中的int值,是否会报错,为什么?会,输入有可能是-1,所以不能返回-1,只能报错。
5 如何读取文件中写入的long值?在写入的位置读取。/* * void seek(long pos) * 将指针移动到指定位置 */raf.seek(0);System.out.println(raf.getFilePointer());long i = raf.readLong();//自动读取8个字节System.out.println(i);System.out.println(raf.getFilePointer());
6 如何用RAF写入字符串值?RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");String str = "我爱珠海渔女";byte[] bs = str.getBytes();raf.write(bs, 0, bs.length);由于raf的写入方法只能接收字节(或字节数组),所以需要将字符串转化为字节数据。(使用byte[] bs = str.getBytes();方法)
7 如何设定写入字符串的编码形式?若先按照utf-8编码写入一段字符串,再重新按照gbk编码写入一次,则会?str.getBytes("utf-8"),str.getBytes("gbk"),写入“我爱珠海渔女”字符串第一次写入21个字节,第二次重新写入会将文本编码改为utf-8,所以第一次写入的会变成乱码,在第一次写入的字符串后追加,若设定指针从0开始,则会覆盖了前14个,后7个字节也会乱码所以会乱码
9 如何读取文本中的字符串?利用String的构造方法,将传入的字节数组按照指定的编码转换为相应的字符串。String(data,"gbk")可限定传入数量String(data,0,len,"gbk");
public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");byte[] data = new byte[100];int len = raf.read(data);//String(data,"gbk")String str = new String(data,0,len,"gbk");System.out.println(str);raf.close();}
10 字符串(引用类型) 比较必须用什么?equals
11 输出输入是相对于谁?程序(即文件),获取外部数据即输入流(接收外部输入数据[读取外部数据]),输出内部数据(到其他文件[写出])则是输出流。——写out,鞋澳,读音
12 数据源是什么?数据源头,低级流与数据源建立链接
13 流分为低级流和高级流
15 文件流,典型的低级流——数据与程序间的管道标准的读写,不像RAF可指定指针位置。
16 int型等基本类型数据如何转换成字节?字符串呢?逻辑位移符,若是raf可调用writeInt通过调用自身方法,getBytes或被RAF抑或流read
17 输出流分为几种模式?覆盖模式,追加模式。
18 如何使用输出流,写入数据?public static void main(String[] args) throws IOException {/* * FileOutputStream支持两组常用的构造方法: * FileOutputStream(String path) * FileOutputStream(File file) * 创建针对指定文件的输出流,默认是覆盖模式。 * * FileOutputStream(String path,boolean append) * FileOutputStream(File file,boolean append) * 第二个参数为boolean值,若该值为true,则该输出流为追加模式,即 * 写出数据会追加到内部数据末尾。 */FileOutputStream fos = new FileOutputStream("fos.txt",true);String str = "234567";byte[] data = str.getBytes();fos.write(data);str = "7654321范德萨";fos.write(str.getBytes());fos.close();System.out.println("写出完毕");19 当输出流读取到最后一个字符时是否会返回-1?会。19 如何理解流?可当作方法理解
20 缓冲流用于什么?提高读写效率
21 高级流可以独立存在吗?必然依托于低级流。
22 关哪个流?最外层的高级流。
23 装载了高级流的低级流,在后续操作时操作哪个流?高级流。
24 (缓冲区有100个字节容量,该次只读取6个字节——如发送“你好”)缓冲区内容未加载满就不写出或读取吗?如何解决?正确,使用 .flush()强制将缓冲区中的数据一次性写出,或 .close()(会调用.flush())
25 缓冲区的工作原理是?假性写读。
26 对象流用于方便读取对象。
27 BIS,BOS定义在哪,哪里就是所谓的程序(即文件)。
谨记一个原则:“文件读取,读取到的数据为二进制的数据,文件写入,需要将数据转化为二进制的字节才能写入(写入的数据在文件上以指定的形式显示)
当需要对文件读写时,有两种方式可以选择,一是使用RAF连接文件上,限定模式后对文件进行操作,二是用stream连接到文件上而stream并不能像RAF一样,读取和写入都可以指定起始位置,并且用一个RAF对象就可以完成读写,流的读取操作用FileOutputStream,写入操作用FileInputStream,基本操作与RAF相似——读取文件中的字节:FIS.read(),返回的是int型数据的低八位。Fis.read(data)则会对data数组进行操作并返回当次存入字节数量。
当需要写入int型数据时,由于两者的read方法皆只能读取到低八位,但RAF有封装writeInt的方法,可直接传入要写入的值。而FOS则需通过逻辑右移符单独获取每一个字节再写入。
当写入字符串时:字符串再程序内定义,可直接使用str.getBytes("指定编码形式")获取字节数组字符串在外部文件中,RAF和输出流可用read()方法获取字节后传入,RAF可定义字节数组提高单次读取量,输出流FOS可加载缓冲流提高单次读取量。且输出流的写入操作默认为覆盖模式,可在构造时声明true更改为追加模式。
当文件在外部,一次读取量小于缓存流本身的数组数时,BOS不会继续写入,除非使用flush()强制将已缓存字节数据写入。(适用于即时应用场景,如聊天室,每次输入的内容不管少多都要发送出去,而复制文件时则需每次都将数组填满以达到利用最大化的目的)

浙公网安备 33010602011771号