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()强制将已缓存字节数据写入。(适用于即时应用场景,如聊天室,每次输入的内容不管少多都要发送出去,而复制文件时则需每次都将数组填满以达到利用最大化的目的)

posted @ 2017-08-30 23:10  清及  阅读(135)  评论(0)    收藏  举报